]> Git Repo - linux.git/commitdiff
block: freeze the queue in queue_attr_store
authorChristoph Hellwig <[email protected]>
Mon, 17 Jun 2024 06:04:38 +0000 (08:04 +0200)
committerJens Axboe <[email protected]>
Wed, 19 Jun 2024 13:58:28 +0000 (07:58 -0600)
queue_attr_store updates attributes used to control generating I/O, and
can cause malformed bios if changed with I/O in flight.  Freeze the queue
in common code instead of adding it to almost every attribute.

Signed-off-by: Christoph Hellwig <[email protected]>
Reviewed-by: Bart Van Assche <[email protected]>
Reviewed-by: Damien Le Moal <[email protected]>
Reviewed-by: Hannes Reinecke <[email protected]>
Reviewed-by: Chaitanya Kulkarni <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Jens Axboe <[email protected]>
block/blk-mq.c
block/blk-sysfs.c

index 0d4cd39c3d25da9a70d08922d346c09ffab1c430..58b0d6c7cc34d6a0bbeb78bf491fa2b5609b3936 100644 (file)
@@ -4631,13 +4631,15 @@ int blk_mq_update_nr_requests(struct request_queue *q, unsigned int nr)
        int ret;
        unsigned long i;
 
+       if (WARN_ON_ONCE(!q->mq_freeze_depth))
+               return -EINVAL;
+
        if (!set)
                return -EINVAL;
 
        if (q->nr_requests == nr)
                return 0;
 
-       blk_mq_freeze_queue(q);
        blk_mq_quiesce_queue(q);
 
        ret = 0;
@@ -4671,7 +4673,6 @@ int blk_mq_update_nr_requests(struct request_queue *q, unsigned int nr)
        }
 
        blk_mq_unquiesce_queue(q);
-       blk_mq_unfreeze_queue(q);
 
        return ret;
 }
index f0f9314ab65c611625b50dc3c0fdcf709e5abbb9..5c787965b7d09e8447970dbd8e774c90c7efebd0 100644 (file)
@@ -189,12 +189,9 @@ static ssize_t queue_discard_max_store(struct request_queue *q,
        if ((max_discard_bytes >> SECTOR_SHIFT) > UINT_MAX)
                return -EINVAL;
 
-       blk_mq_freeze_queue(q);
        lim = queue_limits_start_update(q);
        lim.max_user_discard_sectors = max_discard_bytes >> SECTOR_SHIFT;
        err = queue_limits_commit_update(q, &lim);
-       blk_mq_unfreeze_queue(q);
-
        if (err)
                return err;
        return ret;
@@ -241,11 +238,9 @@ queue_max_sectors_store(struct request_queue *q, const char *page, size_t count)
        if (ret < 0)
                return ret;
 
-       blk_mq_freeze_queue(q);
        lim = queue_limits_start_update(q);
        lim.max_user_sectors = max_sectors_kb << 1;
        err = queue_limits_commit_update(q, &lim);
-       blk_mq_unfreeze_queue(q);
        if (err)
                return err;
        return ret;
@@ -585,13 +580,11 @@ static ssize_t queue_wb_lat_store(struct request_queue *q, const char *page,
         * ends up either enabling or disabling wbt completely. We can't
         * have IO inflight if that happens.
         */
-       blk_mq_freeze_queue(q);
        blk_mq_quiesce_queue(q);
 
        wbt_set_min_lat(q, val);
 
        blk_mq_unquiesce_queue(q);
-       blk_mq_unfreeze_queue(q);
 
        return count;
 }
@@ -722,9 +715,11 @@ queue_attr_store(struct kobject *kobj, struct attribute *attr,
        if (!entry->store)
                return -EIO;
 
+       blk_mq_freeze_queue(q);
        mutex_lock(&q->sysfs_lock);
        res = entry->store(q, page, length);
        mutex_unlock(&q->sysfs_lock);
+       blk_mq_unfreeze_queue(q);
        return res;
 }
 
This page took 0.066227 seconds and 4 git commands to generate.