123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- 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 <sys/socket.h>
- #include <stdio.h>
- #include <string.h>
- @@ -22,6 +23,7 @@
- #include <netinet/in.h>
- #include <linux/fs.h>
- #include <sys/stat.h>
- +#include <fcntl.h>
-
- #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
|