diff -uprN vblade-14rc1/aoe.c vblade-14rc2/aoe.c --- vblade-14rc1/aoe.c 2006-11-20 12:48:05.000000000 -0500 +++ vblade-14rc2/aoe.c 2006-11-20 13:14:04.000000000 -0500 @@ -185,15 +185,42 @@ doaoe(Aoehdr *p) } } +// allocate the buffer so that the ata data area +// is page aligned for o_direct on linux + +void * +bufalloc(uchar **buf, long len) +{ + long psize; + unsigned long n; + + psize = sysconf(_SC_PAGESIZE); + if (psize == -1) { + perror("sysconf"); + exit(EXIT_FAILURE); + } + n = len/psize + 3; + *buf = malloc(psize * n); + if (!*buf) { + perror("malloc"); + exit(EXIT_FAILURE); + } + n = (unsigned long) *buf; + n += psize * 2; + n &= ~(psize - 1); + return (void *) (n - sizeof (Ata)); +} + void aoe(void) { Aoehdr *p; + uchar *freeme; uchar *buf; int n, sh; enum { bufsz = 1<<16, }; - buf = malloc(bufsz); + buf = bufalloc(&freeme, bufsz); aoead(sfd); for (;;) { @@ -218,7 +245,7 @@ aoe(void) continue; doaoe(p); } - free(buf); + free(freeme); } void @@ -310,7 +337,7 @@ main(int argc, char **argv) } if (s.st_mode & (S_IWUSR|S_IWGRP|S_IWOTH)) omode = O_RDWR; - bfd = open(argv[3], omode); + bfd = opendisk(argv[3], omode); if (bfd == -1) { perror("open"); exit(1); diff -uprN vblade-14rc1/fns.h vblade-14rc2/fns.h --- vblade-14rc1/fns.h 2006-11-13 16:12:31.000000000 -0500 +++ vblade-14rc2/fns.h 2006-11-20 13:13:44.000000000 -0500 @@ -21,6 +21,7 @@ int atacmd(Ataregs *, uchar *, int); int dial(char *); int getea(int, char *, uchar *); +int opendisk(const char *, int); int putsec(int, uchar *, vlong, int); int getsec(int, uchar *, vlong, int); int putpkt(int, uchar *, int); diff -uprN vblade-14rc1/freebsd.c vblade-14rc2/freebsd.c --- vblade-14rc1/freebsd.c 2006-11-13 13:57:34.000000000 -0500 +++ vblade-14rc2/freebsd.c 2006-11-20 13:13:44.000000000 -0500 @@ -241,6 +241,11 @@ getea(int s, char *eth, uchar *ea) return(0); } +int +opendisk(const char *disk, int omode) +{ + return open(disk, omode); +} int getsec(int fd, uchar *place, vlong lba, int nsec) diff -uprN vblade-14rc1/linux.c vblade-14rc2/linux.c --- vblade-14rc1/linux.c 2006-11-13 13:57:34.000000000 -0500 +++ vblade-14rc2/linux.c 2006-11-20 13:13:44.000000000 -0500 @@ -1,5 +1,6 @@ // linux.c: low level access routines for Linux #include "config.h" +#define _GNU_SOURCE #include #include #include @@ -22,6 +23,7 @@ #include #include #include +#include #include "dat.h" #include "fns.h" @@ -102,17 +104,21 @@ getmtu(int s, char *name) } int +opendisk(const char *disk, int omode) +{ + return open(disk, omode|O_DIRECT); +} + +int getsec(int fd, uchar *place, vlong lba, int nsec) { - lseek(fd, lba * 512, 0); - return read(fd, place, nsec * 512); + return pread(fd, place, nsec * 512, lba * 512); } int putsec(int fd, uchar *place, vlong lba, int nsec) { - lseek(fd, lba * 512, 0); - return write(fd, place, nsec * 512); + return pwrite(fd, place, nsec * 512, lba * 512); } int