Skip to content

Commit a6abd64

Browse files
committed
loop: revert exclusive opener loop status change
This commit effectively reverts the following two commits: 2704024 ("loop: add missing bd_abort_claiming in loop_set_status") 08e136e ("loop: don't change loop device under exclusive opener in loop_set_status") as there are reports of them causing issues with unmounting. As we're close to the 6.19 kernel release and the original author hasn't taken a closer look at this yet, revert them for release. Reported-by: nokangaroo <[email protected]> Link: https://lore.kernel.org/all/[email protected]/ Signed-off-by: Jens Axboe <[email protected]>
1 parent 7e210d5 commit a6abd64

1 file changed

Lines changed: 12 additions & 33 deletions

File tree

drivers/block/loop.c

Lines changed: 12 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1225,28 +1225,16 @@ static int loop_clr_fd(struct loop_device *lo)
12251225
}
12261226

12271227
static int
1228-
loop_set_status(struct loop_device *lo, blk_mode_t mode,
1229-
struct block_device *bdev, const struct loop_info64 *info)
1228+
loop_set_status(struct loop_device *lo, const struct loop_info64 *info)
12301229
{
12311230
int err;
12321231
bool partscan = false;
12331232
bool size_changed = false;
12341233
unsigned int memflags;
12351234

1236-
/*
1237-
* If we don't hold exclusive handle for the device, upgrade to it
1238-
* here to avoid changing device under exclusive owner.
1239-
*/
1240-
if (!(mode & BLK_OPEN_EXCL)) {
1241-
err = bd_prepare_to_claim(bdev, loop_set_status, NULL);
1242-
if (err)
1243-
goto out_reread_partitions;
1244-
}
1245-
12461235
err = mutex_lock_killable(&lo->lo_mutex);
12471236
if (err)
1248-
goto out_abort_claiming;
1249-
1237+
return err;
12501238
if (lo->lo_state != Lo_bound) {
12511239
err = -ENXIO;
12521240
goto out_unlock;
@@ -1285,10 +1273,6 @@ loop_set_status(struct loop_device *lo, blk_mode_t mode,
12851273
}
12861274
out_unlock:
12871275
mutex_unlock(&lo->lo_mutex);
1288-
out_abort_claiming:
1289-
if (!(mode & BLK_OPEN_EXCL))
1290-
bd_abort_claiming(bdev, loop_set_status);
1291-
out_reread_partitions:
12921276
if (partscan)
12931277
loop_reread_partitions(lo);
12941278

@@ -1368,29 +1352,25 @@ loop_info64_to_old(const struct loop_info64 *info64, struct loop_info *info)
13681352
}
13691353

13701354
static int
1371-
loop_set_status_old(struct loop_device *lo, blk_mode_t mode,
1372-
struct block_device *bdev,
1373-
const struct loop_info __user *arg)
1355+
loop_set_status_old(struct loop_device *lo, const struct loop_info __user *arg)
13741356
{
13751357
struct loop_info info;
13761358
struct loop_info64 info64;
13771359

13781360
if (copy_from_user(&info, arg, sizeof (struct loop_info)))
13791361
return -EFAULT;
13801362
loop_info64_from_old(&info, &info64);
1381-
return loop_set_status(lo, mode, bdev, &info64);
1363+
return loop_set_status(lo, &info64);
13821364
}
13831365

13841366
static int
1385-
loop_set_status64(struct loop_device *lo, blk_mode_t mode,
1386-
struct block_device *bdev,
1387-
const struct loop_info64 __user *arg)
1367+
loop_set_status64(struct loop_device *lo, const struct loop_info64 __user *arg)
13881368
{
13891369
struct loop_info64 info64;
13901370

13911371
if (copy_from_user(&info64, arg, sizeof (struct loop_info64)))
13921372
return -EFAULT;
1393-
return loop_set_status(lo, mode, bdev, &info64);
1373+
return loop_set_status(lo, &info64);
13941374
}
13951375

13961376
static int
@@ -1569,14 +1549,14 @@ static int lo_ioctl(struct block_device *bdev, blk_mode_t mode,
15691549
case LOOP_SET_STATUS:
15701550
err = -EPERM;
15711551
if ((mode & BLK_OPEN_WRITE) || capable(CAP_SYS_ADMIN))
1572-
err = loop_set_status_old(lo, mode, bdev, argp);
1552+
err = loop_set_status_old(lo, argp);
15731553
break;
15741554
case LOOP_GET_STATUS:
15751555
return loop_get_status_old(lo, argp);
15761556
case LOOP_SET_STATUS64:
15771557
err = -EPERM;
15781558
if ((mode & BLK_OPEN_WRITE) || capable(CAP_SYS_ADMIN))
1579-
err = loop_set_status64(lo, mode, bdev, argp);
1559+
err = loop_set_status64(lo, argp);
15801560
break;
15811561
case LOOP_GET_STATUS64:
15821562
return loop_get_status64(lo, argp);
@@ -1670,17 +1650,16 @@ loop_info64_to_compat(const struct loop_info64 *info64,
16701650
}
16711651

16721652
static int
1673-
loop_set_status_compat(struct loop_device *lo, blk_mode_t mode,
1674-
struct block_device *bdev,
1675-
const struct compat_loop_info __user *arg)
1653+
loop_set_status_compat(struct loop_device *lo,
1654+
const struct compat_loop_info __user *arg)
16761655
{
16771656
struct loop_info64 info64;
16781657
int ret;
16791658

16801659
ret = loop_info64_from_compat(arg, &info64);
16811660
if (ret < 0)
16821661
return ret;
1683-
return loop_set_status(lo, mode, bdev, &info64);
1662+
return loop_set_status(lo, &info64);
16841663
}
16851664

16861665
static int
@@ -1706,7 +1685,7 @@ static int lo_compat_ioctl(struct block_device *bdev, blk_mode_t mode,
17061685

17071686
switch(cmd) {
17081687
case LOOP_SET_STATUS:
1709-
err = loop_set_status_compat(lo, mode, bdev,
1688+
err = loop_set_status_compat(lo,
17101689
(const struct compat_loop_info __user *)arg);
17111690
break;
17121691
case LOOP_GET_STATUS:

0 commit comments

Comments
 (0)