if (!file)
                goto out;
 
+       /*
+        * If we don't hold exclusive handle for the device, upgrade to it
+        * here to avoid changing device under exclusive owner.
+        */
+       if (!(mode & FMODE_EXCL)) {
+               bdgrab(bdev);
+               error = blkdev_get(bdev, mode | FMODE_EXCL, loop_set_fd);
+               if (error)
+                       goto out_putf;
+       }
+
        error = mutex_lock_killable(&loop_ctl_mutex);
        if (error)
-               goto out_putf;
+               goto out_bdev;
 
        error = -EBUSY;
        if (lo->lo_state != Lo_unbound)
        mutex_unlock(&loop_ctl_mutex);
        if (partscan)
                loop_reread_partitions(lo, bdev);
+       if (!(mode & FMODE_EXCL))
+               blkdev_put(bdev, mode | FMODE_EXCL);
        return 0;
 
 out_unlock:
        mutex_unlock(&loop_ctl_mutex);
+out_bdev:
+       if (!(mode & FMODE_EXCL))
+               blkdev_put(bdev, mode | FMODE_EXCL);
 out_putf:
        fput(file);
 out: