+++ /dev/null
---- 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)
- {