diff --git a/block/ioctl.c b/block/ioctl.c
index bd214cb37f2b892bff799207d269a33a5762fb27..14b7f2c106625ac57dbca1f9de958f96f6e33490 100644
--- a/block/ioctl.c
+++ b/block/ioctl.c
@@ -343,10 +343,11 @@ int blkdev_ioctl(struct inode *inode, struct file *file, unsigned cmd,
 			return -EINVAL;
 		if (get_user(n, (int __user *) arg))
 			return -EFAULT;
-		if (bd_claim(bdev, file) < 0)
+		if (!(mode & FMODE_EXCL) && bd_claim(bdev, &bdev) < 0)
 			return -EBUSY;
 		ret = set_blocksize(bdev, n);
-		bd_release(bdev);
+		if (!(mode & FMODE_EXCL))
+			bd_release(bdev);
 		return ret;
 	case BLKPG:
 		lock_kernel();