• Guo Chao's avatar
    loopdev: fix a deadlock · 5370019d
    Guo Chao authored
    bd_mutex and lo_ctl_mutex can be held in different order.
    
    Path #1:
    
    blkdev_open
     blkdev_get
      __blkdev_get (hold bd_mutex)
       lo_open (hold lo_ctl_mutex)
    
    Path #2:
    
    blkdev_ioctl
     lo_ioctl (hold lo_ctl_mutex)
      lo_set_capacity (hold bd_mutex)
    
    Lockdep does not report it, because path #2 actually holds a subclass of
    lo_ctl_mutex.  This subclass seems creep into the code by mistake.  The
    patch author actually just mentioned it in the changelog, see commit
    f028f3b2 ("loop: fix circular locking in loop_clr_fd()"), also see:
    
    	http://marc.info/?l=linux-kernel&m=123806169129727&w=2
    
    Path #2 hold bd_mutex to call bd_set_size(), I've protected it
    with i_mutex in a previous patch, so drop bd_mutex at this site.
    Signed-off-by: default avatarGuo Chao <yan@linux.vnet.ibm.com>
    Cc: Alexander Viro <viro@zeniv.linux.org.uk>
    Cc: Guo Chao <yan@linux.vnet.ibm.com>
    Cc: M. Hindess <hindessm@uk.ibm.com>
    Cc: Nikanth Karthikesan <knikanth@suse.de>
    Cc: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    5370019d
loop.c 47.1 KB