--- x/block/bdev.c +++ y/block/bdev.c @@ -833,7 +833,7 @@ void blkdev_put(struct block_device *bde mutex_lock(&disk->open_mutex); if (mode & FMODE_EXCL) { struct block_device *whole = bdev_whole(bdev); - bool bdev_free; + bool bdev_free = false; /* * Release a claim on the device. The holder fields @@ -842,6 +842,8 @@ void blkdev_put(struct block_device *bde */ spin_lock(&bdev_lock); + if (whole->bd_holder != bd_may_claim) + goto unlock; WARN_ON_ONCE(--bdev->bd_holders < 0); WARN_ON_ONCE(--whole->bd_holders < 0); @@ -850,6 +852,7 @@ void blkdev_put(struct block_device *bde if (!whole->bd_holders) whole->bd_holder = NULL; +unlock: spin_unlock(&bdev_lock); /*