Skip to content

Commit 98e4fa2

Browse files
author
Ming Lei
committed
loop: refactor queue limits updates
JIRA: https://issues.redhat.com/browse/RHEL-71345 Upstream Status: for-6.4/block commit b38c8be Author: Christoph Hellwig <hch@lst.de> Date: Fri Jan 10 06:47:18 2025 +0100 loop: refactor queue limits updates Replace loop_reconfigure_limits with a slightly less encompassing loop_update_limits that expects the caller to acquire and commit the queue limits to prepare for sorting out the freeze vs limits lock ordering. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Ming Lei <ming.lei@redhat.com> Reviewed-by: Damien Le Moal <dlemoal@kernel.org> Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com> Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Reviewed-by: Nilay Shroff <nilay@linux.ibm.com> Link: https://lore.kernel.org/r/20250110054726.1499538-11-hch@lst.de Signed-off-by: Jens Axboe <axboe@kernel.dk> Signed-off-by: Ming Lei <ming.lei@redhat.com>
1 parent 28526c3 commit 98e4fa2

File tree

1 file changed

+20
-16
lines changed

1 file changed

+20
-16
lines changed

drivers/block/loop.c

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -979,12 +979,12 @@ static unsigned int loop_default_blocksize(struct loop_device *lo,
979979
return SECTOR_SIZE;
980980
}
981981

982-
static int loop_reconfigure_limits(struct loop_device *lo, unsigned int bsize)
982+
static void loop_update_limits(struct loop_device *lo, struct queue_limits *lim,
983+
unsigned int bsize)
983984
{
984985
struct file *file = lo->lo_backing_file;
985986
struct inode *inode = file->f_mapping->host;
986987
struct block_device *backing_bdev = NULL;
987-
struct queue_limits lim;
988988
u32 granularity = 0, max_discard_sectors = 0;
989989

990990
if (S_ISBLK(inode->i_mode))
@@ -997,22 +997,20 @@ static int loop_reconfigure_limits(struct loop_device *lo, unsigned int bsize)
997997

998998
loop_get_discard_config(lo, &granularity, &max_discard_sectors);
999999

1000-
lim = queue_limits_start_update(lo->lo_queue);
1001-
lim.logical_block_size = bsize;
1002-
lim.physical_block_size = bsize;
1003-
lim.io_min = bsize;
1004-
lim.features &= ~(BLK_FEAT_WRITE_CACHE | BLK_FEAT_ROTATIONAL);
1000+
lim->logical_block_size = bsize;
1001+
lim->physical_block_size = bsize;
1002+
lim->io_min = bsize;
1003+
lim->features &= ~(BLK_FEAT_WRITE_CACHE | BLK_FEAT_ROTATIONAL);
10051004
if (file->f_op->fsync && !(lo->lo_flags & LO_FLAGS_READ_ONLY))
1006-
lim.features |= BLK_FEAT_WRITE_CACHE;
1005+
lim->features |= BLK_FEAT_WRITE_CACHE;
10071006
if (backing_bdev && !bdev_nonrot(backing_bdev))
1008-
lim.features |= BLK_FEAT_ROTATIONAL;
1009-
lim.max_hw_discard_sectors = max_discard_sectors;
1010-
lim.max_write_zeroes_sectors = max_discard_sectors;
1007+
lim->features |= BLK_FEAT_ROTATIONAL;
1008+
lim->max_hw_discard_sectors = max_discard_sectors;
1009+
lim->max_write_zeroes_sectors = max_discard_sectors;
10111010
if (max_discard_sectors)
1012-
lim.discard_granularity = granularity;
1011+
lim->discard_granularity = granularity;
10131012
else
1014-
lim.discard_granularity = 0;
1015-
return queue_limits_commit_update(lo->lo_queue, &lim);
1013+
lim->discard_granularity = 0;
10161014
}
10171015

10181016
static int loop_configure(struct loop_device *lo, blk_mode_t mode,
@@ -1021,6 +1019,7 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode,
10211019
{
10221020
struct file *file = fget(config->fd);
10231021
struct address_space *mapping;
1022+
struct queue_limits lim;
10241023
int error;
10251024
loff_t size;
10261025
bool partscan;
@@ -1092,7 +1091,9 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode,
10921091
lo->old_gfp_mask = mapping_gfp_mask(mapping);
10931092
mapping_set_gfp_mask(mapping, lo->old_gfp_mask & ~(__GFP_IO|__GFP_FS));
10941093

1095-
error = loop_reconfigure_limits(lo, config->block_size);
1094+
lim = queue_limits_start_update(lo->lo_queue);
1095+
loop_update_limits(lo, &lim, config->block_size);
1096+
error = queue_limits_commit_update(lo->lo_queue, &lim);
10961097
if (error)
10971098
goto out_unlock;
10981099

@@ -1460,6 +1461,7 @@ static int loop_set_dio(struct loop_device *lo, unsigned long arg)
14601461

14611462
static int loop_set_block_size(struct loop_device *lo, unsigned long arg)
14621463
{
1464+
struct queue_limits lim;
14631465
int err = 0;
14641466

14651467
if (lo->lo_state != Lo_bound)
@@ -1472,7 +1474,9 @@ static int loop_set_block_size(struct loop_device *lo, unsigned long arg)
14721474
invalidate_bdev(lo->lo_device);
14731475

14741476
blk_mq_freeze_queue(lo->lo_queue);
1475-
err = loop_reconfigure_limits(lo, arg);
1477+
lim = queue_limits_start_update(lo->lo_queue);
1478+
loop_update_limits(lo, &lim, arg);
1479+
err = queue_limits_commit_update(lo->lo_queue, &lim);
14761480
loop_update_dio(lo);
14771481
blk_mq_unfreeze_queue(lo->lo_queue);
14781482

0 commit comments

Comments
 (0)