On Tue, 11 Dec 2001, GOTO Masanori wrote:
> Accessing with inode size unit (== 4096 byte) is ok, but if I accessed
> with block size unit, generic_direct_IO() returns error. The reason
> is that blocksize is designated as inode->i_blkbits, and its value is
> not disk minimal block size (512), but inode's unit size (4096).
Actually, I now found the _real_ bug that explains both the "inode->i_dev"
_and_ the block size problem.
We have the wrong inode.
We use the on-disk inode, which is NOT the same as the "mapping" inode for
actually doing the IO.
This simple (and completely untested) patch should fix it.
This two-liner should also actually make the previous patch completely
unnecessary, because now "inode->i_dev" should be automatically correct. I
should have realized that inode->i_dev should always be right, and have
thought more about the fact that it wasn't.
--- v2.5.0/linux/mm/filemap.c Wed Nov 21 14:07:25 2001
+++ linux/mm/filemap.c Tue Dec 11 09:34:17 2001
@@ -1486,8 +1485,8 @@
int new_iobuf, chunk_size, blocksize_mask, blocksize, blocksize_bits, iosize, progress;
struct kiobuf * iobuf;
- struct inode * inode = filp->f_dentry->d_inode;
- struct address_space * mapping = inode->i_mapping;
+ struct address_space * mapping = filp->f_dentry->d_inode->i_mapping;
+ struct inode * inode = mapping->host;
new_iobuf = 0;
iobuf = filp->f_iobuf;
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to email@example.com
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
This archive was generated by hypermail 2b29 : Sat Dec 15 2001 - 21:00:21 EST