• Badari Pulavarty's avatar
    [PATCH] ext3_getblk() should handle HOLE correctly · 3665d0e5
    Badari Pulavarty authored
    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: default avatarBadari Pulavarty <pbadari@us.ibm.com>
    Acked-by: default avatarMingming Cao <cmm@us.ibm.com>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    3665d0e5
inode.c 93.6 KB