Message ID | 20250106100645.850445-5-hch@lst.de |
---|---|
State | New |
Headers | show |
Series | [01/10] block: fix docs for freezing of queue limits updates | expand |
On 1/6/25 7:06 PM, Christoph Hellwig wrote: > Use queue_limits_commit_update to apply a consistent freeze vs limits > lock order in queue_attr_store. Also remove taking the sysfs lock > as it doesn't protect anything here. > > Signed-off-by: Christoph Hellwig <hch@lst.de> Oops. OK. so please disregard my comments on patch 3. This is all fixed here. May be sqash this patch with patch 3 ? > --- > block/blk-sysfs.c | 18 ++++++++++-------- > 1 file changed, 10 insertions(+), 8 deletions(-) > > diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c > index 8d69315e986d..3bac27fcd635 100644 > --- a/block/blk-sysfs.c > +++ b/block/blk-sysfs.c > @@ -687,22 +687,24 @@ queue_attr_store(struct kobject *kobj, struct attribute *attr, > if (entry->load_module) > entry->load_module(disk, page, length); > > - mutex_lock(&q->sysfs_lock); > - blk_mq_freeze_queue(q); > if (entry->store_limit) { > struct queue_limits lim = queue_limits_start_update(q); > > res = entry->store_limit(disk, page, length, &lim); > if (res < 0) { > queue_limits_cancel_update(q); > - } else { > - res = queue_limits_commit_update(q, &lim); > - if (!res) > - res = length; > + return res; > } > - } else { > - res = entry->store(disk, page, length); > + > + res = queue_limits_commit_update_frozen(q, &lim); > + if (res) > + return res; > + return length; > } > + > + mutex_lock(&q->sysfs_lock); > + blk_mq_freeze_queue(q); > + res = entry->store(disk, page, length); > blk_mq_unfreeze_queue(q); > mutex_unlock(&q->sysfs_lock); > return res;
diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c index 8d69315e986d..3bac27fcd635 100644 --- a/block/blk-sysfs.c +++ b/block/blk-sysfs.c @@ -687,22 +687,24 @@ queue_attr_store(struct kobject *kobj, struct attribute *attr, if (entry->load_module) entry->load_module(disk, page, length); - mutex_lock(&q->sysfs_lock); - blk_mq_freeze_queue(q); if (entry->store_limit) { struct queue_limits lim = queue_limits_start_update(q); res = entry->store_limit(disk, page, length, &lim); if (res < 0) { queue_limits_cancel_update(q); - } else { - res = queue_limits_commit_update(q, &lim); - if (!res) - res = length; + return res; } - } else { - res = entry->store(disk, page, length); + + res = queue_limits_commit_update_frozen(q, &lim); + if (res) + return res; + return length; } + + mutex_lock(&q->sysfs_lock); + blk_mq_freeze_queue(q); + res = entry->store(disk, page, length); blk_mq_unfreeze_queue(q); mutex_unlock(&q->sysfs_lock); return res;
Use queue_limits_commit_update to apply a consistent freeze vs limits lock order in queue_attr_store. Also remove taking the sysfs lock as it doesn't protect anything here. Signed-off-by: Christoph Hellwig <hch@lst.de> --- block/blk-sysfs.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-)