Re: [rfc patch 2/2] direct-io: remove address alignment check

From: Badari Pulavarty
Date: Thu Jul 14 2005 - 18:24:11 EST


How does your patch ensures that we meet the driver alignment
restrictions ? Like you said, you need atleast "even" byte alignment
for IDE etc..

And also, are there any restrictions on how much the "minimum" IO
size has to be ? I mean, can I read "1" byte ? I guess you are
not relaxing it (yet)..

Thanks,
Badari

On Wed, 2005-07-13 at 16:43 -0700, Daniel McNeil wrote:
> 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 <daniel@xxxxxxxx>
>
> --- 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, send a message with 'unsubscribe linux-aio' in
> the body to majordomo@xxxxxxxxxx For more info on Linux AIO,
> see: http://www.kvack.org/aio/
> Don't email: <a href=mailto:"aart@xxxxxxxxx";>aart@xxxxxxxxx</a>
>

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/