• Jan Kara's avatar
    block: Fix oops in locked_inode_to_wb_and_lock_list() · f759741d
    Jan Kara authored
    When block device is closed, we call inode_detach_wb() in __blkdev_put()
    which sets inode->i_wb to NULL. That is contrary to expectations that
    inode->i_wb stays valid once set during the whole inode's lifetime and
    leads to oops in wb_get() in locked_inode_to_wb_and_lock_list() because
    inode_to_wb() returned NULL.
    
    The reason why we called inode_detach_wb() is not valid anymore though.
    BDI is guaranteed to stay along until we call bdi_put() from
    bdev_evict_inode() so we can postpone calling inode_detach_wb() to that
    moment.
    
    Also add a warning to catch if someone uses inode_detach_wb() in a
    dangerous way.
    Reported-by: default avatarThiago Jung Bauermann <bauerman@linux.vnet.ibm.com>
    Acked-by: default avatarTejun Heo <tj@kernel.org>
    Signed-off-by: default avatarJan Kara <jack@suse.cz>
    Signed-off-by: default avatarJens Axboe <axboe@fb.com>
    f759741d
block_dev.c 56.1 KB