📄 o_direct.diff
字号:
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -