It has been reported that ext3_getblk() is not doing the right thing and
triggering following WARN():
BUG: warning at fs/ext3/inode.c:1016/ext3_getblk()
<
c01c5140> ext3_getblk+0x98/0x2a6 <
c03b2806> md_wakeup_thread+0x26/0x2a
<
c01c536d> ext3_bread+0x1f/0x88 <
c01cedf9> ext3_quota_read+0x136/0x1ae
<
c018b683> v1_read_dqblk+0x61/0xac <
c0188f32> dquot_acquire+0xf6/0x107
<
c01ceaba> ext3_acquire_dquot+0x46/0x68 <
c01897d4> dqget+0x155/0x1e7
<
c018a97b> dquot_transfer+0x3e0/0x3e9 <
c016fe52> dput+0x23/0x13e
<
c01c7986> ext3_setattr+0xc3/0x240 <
c0120f66> current_fs_time+0x52/0x6a
<
c017320e> notify_change+0x2bd/0x30d <
c0159246> chown_common+0x9c/0xc5
<
c02a222c> strncpy_from_user+0x3b/0x68 <
c0167fe6> do_path_lookup+0xdf/0x266
<
c016841b> __user_walk_fd+0x44/0x5a <
c01592b9> sys_chown+0x4a/0x55
<
c015a43c> vfs_write+0xe7/0x13c <
c01695d4> sys_mkdir+0x1f/0x23
<
c0102a97> syscall_call+0x7/0xb
Looking at the code, it looks like it's not handle HOLE correctly. It ends
up returning -EIO. Here is the patch to fix it.
If we really want to be paranoid, we can allow return values 0 (HOLE), 1
(we asked for one block) and return -EIO for more than 1 block. But I
really don't see a reason for doing it - all we need is the block# here.
(doesn't matter how many blocks are mapped).
ext3_get_blocks_handle() returns number of blocks it mapped. It returns 0
in case of HOLE. ext3_getblk() should handle HOLE properly (currently its
dumping warning stack and returning -EIO).
Signed-off-by: Badari Pulavarty <pbadari@us.ibm.com>
Acked-by: Mingming Cao <cmm@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>