• Dongli Zhang's avatar
    loop: set GENHD_FL_NO_PART_SCAN after blkdev_reread_part() · 758a58d0
    Dongli Zhang authored
    Commit 0da03cab
    ("loop: Fix deadlock when calling blkdev_reread_part()") moves
    blkdev_reread_part() out of the loop_ctl_mutex. However,
    GENHD_FL_NO_PART_SCAN is set before __blkdev_reread_part(). As a result,
    __blkdev_reread_part() will fail the check of GENHD_FL_NO_PART_SCAN and
    will not rescan the loop device to delete all partitions.
    
    Below are steps to reproduce the issue:
    
    step1 # dd if=/dev/zero of=tmp.raw bs=1M count=100
    step2 # losetup -P /dev/loop0 tmp.raw
    step3 # parted /dev/loop0 mklabel gpt
    step4 # parted -a none -s /dev/loop0 mkpart primary 64s 1
    step5 # losetup -d /dev/loop0
    
    Step5 will not be able to delete /dev/loop0p1 (introduced by step4) and
    there is below kernel warning message:
    
    [  464.414043] __loop_clr_fd: partition scan of loop0 failed (rc=-22)
    
    This patch sets GENHD_FL_NO_PART_SCAN after blkdev_reread_part().
    
    Fixes: 0da03cab ("loop: Fix deadlock when calling blkdev_reread_part()")
    Signed-off-by: default avatarDongli Zhang <dongli.zhang@oracle.com>
    Reviewed-by: default avatarJan Kara <jack@suse.cz>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    758a58d0
loop.c 55.2 KB