⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 o_direct.diff

📁 Virtual EtherDrive&#174 blade AoE target.
💻 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 + -