From: Brian F. <bf...@re...> - 2013-05-29 11:54:19
|
Hi guys, I noticed an issue with the following commit while testing the async dio stuff and wanted to get some thoughts: https://git.kernel.org/cgit/linux/kernel/git/mszeredi/fuse.git/commit/fs/fuse/file.c?id=439ee5f0c5080d4fd15fda0c5bbee1fb3a57894e The problem is that direct I/O must be sector aligned (offset and size) and this patch can effectively turn a valid direct I/O read request into an invalid request by modifying the size value sent down to the client fs. I came across this via aio-dio-subblock-eof-read.c but the problem can easily be reproduced by doing a direct read of a small unaligned file, i.e.: truncate --size=300 /mnt/file dd if=/mnt/file of=/dev/null iflag=direct ... which results in an EINVAL error because the client fs (gluster over XFS in this case) in response receives and sends an invalid request to XFS (check out xfs_file_aio_read() to see an example of where this is enforced). Note that this doesn't occur in fuse direct_io mode, because the optimization lies in fuse_direct_IO(). My immediate inclination is to say that if this is purely an optimization, we might want to drop it for now. I suppose there could be alternative approaches, such as preserving alignment in the optimization (though I'm not yet sure we can make that generic enough..?). What concerns me at the moment is that this currently affects behavior whether FUSE_ASYNC_DIO is enabled or not. Thoughts? Brian |