--- 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,11 @@ void blkdev_put(struct block_device *bde */ spin_lock(&bdev_lock); + if (whole->bd_holder != bd_may_claim) { + bdev->bd_holders = 0; + whole->bd_holders = 0; + goto unlock; + } WARN_ON_ONCE(--bdev->bd_holders < 0); WARN_ON_ONCE(--whole->bd_holders < 0); @@ -850,6 +855,7 @@ void blkdev_put(struct block_device *bde if (!whole->bd_holders) whole->bd_holder = NULL; +unlock: spin_unlock(&bdev_lock); /*