Oh I think we can probably fix this up. Can you test this diff?
diff -puN fs/buffer.c~o_direct-length-fix fs/buffer.c
--- 24/fs/buffer.c~o_direct-length-fix 2003-02-13 09:23:34.000000000 -0800
+++ 24-akpm/fs/buffer.c 2003-02-13 09:24:39.000000000 -0800
@@ -2107,7 +2107,7 @@ int generic_direct_IO(int rw, struct ino
int length;
length = iobuf->length;
- nr_blocks = length / blocksize;
+ nr_blocks = (length + blocksize - 1) / blocksize;
/* build the blocklist */
for (i = 0; i < nr_blocks; i++, blocknr++) {
struct buffer_head bh;
@@ -2148,6 +2148,10 @@ int generic_direct_IO(int rw, struct ino
retval = brw_kiovec(rw, 1, &iobuf, inode->i_dev, iobuf->blocks, blocksize);
/* restore orig length */
iobuf->length = length;
+
+ /* Return correct value for reads at eof */
+ if (retval > 0 && retval > length)
+ retval = length;
out:
return retval;
_
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/