This patch relaxes the direct i/o alignment check so that user addresses
do not have to be a multiple of the device block size.
I've done some preliminary testing and it mostly works on an ext3
file system on a ide disk. I have seen trouble when the user address
is on an odd byte boundary. Sometimes the data is read back incorrectly
on read and sometimes I get these kernel error messages:
hda: dma_timer_expiry: dma status == 0x60
hda: DMA timeout retry
hda: timeout waiting for DMA
hda: status error: status=0x58 { DriveReady SeekComplete DataRequest }
ide: failed opcode was: unknown
hda: drive not ready for command
Doing direct-io with user addresses on even, non-512 boundaries appears
to be working correctly.
Any additional testing and/or comments welcome.
Signed-off-by: Daniel McNeil <[email protected]>
--- linux-2.6.12.orig/fs/direct-io.c 2005-06-28 16:39:39.000000000 -0700
+++ linux-2.6.12/fs/direct-io.c 2005-06-28 16:39:59.000000000 -0700
@@ -1147,7 +1147,9 @@ __blockdev_direct_IO(int rw, struct kioc
goto out;
}
- /* Check the memory alignment. Blocks cannot straddle pages */
+ /*
+ * Check the i/o. It must be a multiple of device block size.
+ */
for (seg = 0; seg < nr_segs; seg++) {
addr = (unsigned long)iov[seg].iov_base;
size = iov[seg].iov_len;
@@ -1156,7 +1158,7 @@ __blockdev_direct_IO(int rw, struct kioc
if (bdev)
blkbits = bdev_blkbits;
blocksize_mask = (1 << blkbits) - 1;
- if ((addr & blocksize_mask) || (size & blocksize_mask))
+ if (size & blocksize_mask)
goto out;
}
}
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[Index of Archives]
[Kernel Newbies]
[Netfilter]
[Bugtraq]
[Photo]
[Gimp]
[Yosemite News]
[MIPS Linux]
[ARM Linux]
[Linux Security]
[Linux RAID]
[Video 4 Linux]
[Linux for the blind]
|
|