o_direct.diff 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. diff -uprN vblade-14rc1/aoe.c vblade-14rc2/aoe.c
  2. --- vblade-14rc1/aoe.c 2006-11-20 12:48:05.000000000 -0500
  3. +++ vblade-14rc2/aoe.c 2006-11-20 13:14:04.000000000 -0500
  4. @@ -185,15 +185,42 @@ doaoe(Aoehdr *p)
  5. }
  6. }
  7. +// allocate the buffer so that the ata data area
  8. +// is page aligned for o_direct on linux
  9. +
  10. +void *
  11. +bufalloc(uchar **buf, long len)
  12. +{
  13. + long psize;
  14. + unsigned long n;
  15. +
  16. + psize = sysconf(_SC_PAGESIZE);
  17. + if (psize == -1) {
  18. + perror("sysconf");
  19. + exit(EXIT_FAILURE);
  20. + }
  21. + n = len/psize + 3;
  22. + *buf = malloc(psize * n);
  23. + if (!*buf) {
  24. + perror("malloc");
  25. + exit(EXIT_FAILURE);
  26. + }
  27. + n = (unsigned long) *buf;
  28. + n += psize * 2;
  29. + n &= ~(psize - 1);
  30. + return (void *) (n - sizeof (Ata));
  31. +}
  32. +
  33. void
  34. aoe(void)
  35. {
  36. Aoehdr *p;
  37. + uchar *freeme;
  38. uchar *buf;
  39. int n, sh;
  40. enum { bufsz = 1<<16, };
  41. - buf = malloc(bufsz);
  42. + buf = bufalloc(&freeme, bufsz);
  43. aoead(sfd);
  44. for (;;) {
  45. @@ -218,7 +245,7 @@ aoe(void)
  46. continue;
  47. doaoe(p);
  48. }
  49. - free(buf);
  50. + free(freeme);
  51. }
  52. void
  53. @@ -310,7 +337,7 @@ main(int argc, char **argv)
  54. }
  55. if (s.st_mode & (S_IWUSR|S_IWGRP|S_IWOTH))
  56. omode = O_RDWR;
  57. - bfd = open(argv[3], omode);
  58. + bfd = opendisk(argv[3], omode);
  59. if (bfd == -1) {
  60. perror("open");
  61. exit(1);
  62. diff -uprN vblade-14rc1/fns.h vblade-14rc2/fns.h
  63. --- vblade-14rc1/fns.h 2006-11-13 16:12:31.000000000 -0500
  64. +++ vblade-14rc2/fns.h 2006-11-20 13:13:44.000000000 -0500
  65. @@ -21,6 +21,7 @@ int atacmd(Ataregs *, uchar *, int);
  66. int dial(char *);
  67. int getea(int, char *, uchar *);
  68. +int opendisk(const char *, int);
  69. int putsec(int, uchar *, vlong, int);
  70. int getsec(int, uchar *, vlong, int);
  71. int putpkt(int, uchar *, int);
  72. diff -uprN vblade-14rc1/freebsd.c vblade-14rc2/freebsd.c
  73. --- vblade-14rc1/freebsd.c 2006-11-13 13:57:34.000000000 -0500
  74. +++ vblade-14rc2/freebsd.c 2006-11-20 13:13:44.000000000 -0500
  75. @@ -241,6 +241,11 @@ getea(int s, char *eth, uchar *ea)
  76. return(0);
  77. }
  78. +int
  79. +opendisk(const char *disk, int omode)
  80. +{
  81. + return open(disk, omode);
  82. +}
  83. int
  84. getsec(int fd, uchar *place, vlong lba, int nsec)
  85. diff -uprN vblade-14rc1/linux.c vblade-14rc2/linux.c
  86. --- vblade-14rc1/linux.c 2006-11-13 13:57:34.000000000 -0500
  87. +++ vblade-14rc2/linux.c 2006-11-20 13:13:44.000000000 -0500
  88. @@ -1,5 +1,6 @@
  89. // linux.c: low level access routines for Linux
  90. #include "config.h"
  91. +#define _GNU_SOURCE
  92. #include <sys/socket.h>
  93. #include <stdio.h>
  94. #include <string.h>
  95. @@ -22,6 +23,7 @@
  96. #include <netinet/in.h>
  97. #include <linux/fs.h>
  98. #include <sys/stat.h>
  99. +#include <fcntl.h>
  100. #include "dat.h"
  101. #include "fns.h"
  102. @@ -102,17 +104,21 @@ getmtu(int s, char *name)
  103. }
  104. int
  105. +opendisk(const char *disk, int omode)
  106. +{
  107. + return open(disk, omode|O_DIRECT);
  108. +}
  109. +
  110. +int
  111. getsec(int fd, uchar *place, vlong lba, int nsec)
  112. {
  113. - lseek(fd, lba * 512, 0);
  114. - return read(fd, place, nsec * 512);
  115. + return pread(fd, place, nsec * 512, lba * 512);
  116. }
  117. int
  118. putsec(int fd, uchar *place, vlong lba, int nsec)
  119. {
  120. - lseek(fd, lba * 512, 0);
  121. - return write(fd, place, nsec * 512);
  122. + return pwrite(fd, place, nsec * 512, lba * 512);
  123. }
  124. int