diff options
| author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2019-06-03 13:53:20 +0200 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2019-06-03 13:53:20 +0200 |
| commit | 888dc273ea4e7ca332a6f73d10dfc8f2b212c803 (patch) | |
| tree | 0c2154dfa92ca6ee761c358e58a3e35831558bb5 /drivers/block/loop.c | |
| parent | 324e8f5f5d9d4d0b9a608b2fdb88cd93b0fbb12a (diff) | |
| parent | f2c7c76c5d0a443053e94adb9f0918fa2fb85c3a (diff) | |
| download | linux-888dc273ea4e7ca332a6f73d10dfc8f2b212c803.tar.gz linux-888dc273ea4e7ca332a6f73d10dfc8f2b212c803.zip | |
Merge 5.2-rc3 into tty-next
We want the tty/serial fixes in here as well.
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/block/loop.c')
| -rw-r--r-- | drivers/block/loop.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/drivers/block/loop.c b/drivers/block/loop.c index 102d79575895..f11b7dc16e9d 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -945,9 +945,20 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode, 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) @@ -1012,10 +1023,15 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode, 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: |
