--- grub-0.95/grub/asmstub.c.odirect 2004-11-30 16:58:06.577019488 -0500 +++ grub-0.95/grub/asmstub.c 2004-11-30 16:59:56.057375944 -0500 @@ -53,6 +53,9 @@ # ifndef BLKFLSBUF # define BLKFLSBUF _IO (0x12,97) /* flush buffer cache */ # endif /* ! BLKFLSBUF */ +# ifndef O_DIRECT +# define O_DIRECT 040000 +# endif /* ! O_DIRECT */ #endif /* __linux__ */ /* We want to prevent any circularararity in our stubs, as well as @@ -764,7 +767,7 @@ { /* The unpartitioned device name: /dev/XdX */ char *devname = device_map[drive]; - char buf[512]; + char * buf, * buf_unaligned; if (! devname) return -1; @@ -775,13 +778,13 @@ /* Open read/write, or read-only if that failed. */ if (! read_only) - disks[drive].flags = open (devname, O_RDWR); + disks[drive].flags = open (devname, O_RDWR | O_DIRECT); if (disks[drive].flags == -1) { if (read_only || errno == EACCES || errno == EROFS || errno == EPERM) { - disks[drive].flags = open (devname, O_RDONLY); + disks[drive].flags = open (devname, O_RDONLY | O_DIRECT); if (disks[drive].flags == -1) { assign_device_name (drive, 0); @@ -795,6 +798,10 @@ } } + buf_unaligned = malloc((512 * sizeof(char)) + 4095); + buf = (char *) (((unsigned long)buf_unaligned + 4096 - 1) & + (~(4096-1))); + /* Attempt to read the first sector. */ if (read (disks[drive].flags, buf, 512) != 512) { @@ -806,6 +813,7 @@ if (disks[drive].flags != -1) get_drive_geometry (&disks[drive], device_map, drive); + free(buf_unaligned); } if (disks[drive].flags == -1) @@ -827,24 +835,34 @@ nread (int fd, char *buf, size_t len) { int size = len; + char * buf_unaligned, * buff, * obuff; + int ret; + + buf_unaligned = malloc((len * sizeof(char)) + 4095); + obuff = buff = (char *) (((unsigned long)buf_unaligned + 4096 - 1) & + (~(4096-1))); + while (len) { - int ret = read (fd, buf, len); + ret = read (fd, buff, len); if (ret <= 0) { if (errno == EINTR) continue; else - return ret; + break; } len -= ret; - buf += ret; + buff += ret; } - return size; + if (!len) ret = size; + + buf = memcpy(buf, obuff, size); + return ret; } /* Write LEN bytes from BUF to FD. Return less than or equal to zero if an @@ -853,10 +871,18 @@ nwrite (int fd, char *buf, size_t len) { int size = len; + char * buf_unaligned, * buff; + + buf_unaligned = malloc((len * sizeof(char)) + 4095); + buff = (char *) (((unsigned long)buf_unaligned + 4096 - 1) & + (~(4096-1))); while (len) { - int ret = write (fd, buf, len); + int ret; + + memcpy(buff, buf, len); + ret = write (fd, buff, len); if (ret <= 0) {