Commit 9755ffd9 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'block-6.14-20250131' of git://git.kernel.dk/linux

Pull more block updates from Jens Axboe:

 - MD pull request via Song:
      - Fix a md-cluster regression introduced

 - More sysfs race fixes

 - Mark anything inside queue freezing as not being able to do IO for
   memory allocations

 - Fix for a regression introduced in loop in this merge window

 - Fix for a regression in queue mapping setups introduced in this merge
   window

 - Fix for the block dio fops attempting an iov_iter revert upton
   getting -EIOCBQUEUED on the read side. This one is going to stable as
   well

* tag 'block-6.14-20250131' of git://git.kernel.dk/linux:
  block: force noio scope in blk_mq_freeze_queue
  block: fix nr_hw_queue update racing with disk addition/removal
  block: get rid of request queue ->sysfs_dir_lock
  loop: don't clear LO_FLAGS_PARTSCAN on LOOP_SET_STATUS{,64}
  md/md-bitmap: Synchronize bitmap_get_stats() with bitmap lifetime
  blk-mq: create correct map for fallback case
  block: don't revert iter for -EIOCBQUEUED
parents c82da38b 1e1a9cec
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -1546,6 +1546,7 @@ int blkcg_activate_policy(struct gendisk *disk, const struct blkcg_policy *pol)
	struct request_queue *q = disk->queue;
	struct blkg_policy_data *pd_prealloc = NULL;
	struct blkcg_gq *blkg, *pinned_blkg = NULL;
	unsigned int memflags;
	int ret;

	if (blkcg_policy_enabled(q, pol))
@@ -1560,7 +1561,7 @@ int blkcg_activate_policy(struct gendisk *disk, const struct blkcg_policy *pol)
		return -EINVAL;

	if (queue_is_mq(q))
		blk_mq_freeze_queue(q);
		memflags = blk_mq_freeze_queue(q);
retry:
	spin_lock_irq(&q->queue_lock);

@@ -1624,7 +1625,7 @@ int blkcg_activate_policy(struct gendisk *disk, const struct blkcg_policy *pol)
	spin_unlock_irq(&q->queue_lock);
out:
	if (queue_is_mq(q))
		blk_mq_unfreeze_queue(q);
		blk_mq_unfreeze_queue(q, memflags);
	if (pinned_blkg)
		blkg_put(pinned_blkg);
	if (pd_prealloc)
@@ -1668,12 +1669,13 @@ void blkcg_deactivate_policy(struct gendisk *disk,
{
	struct request_queue *q = disk->queue;
	struct blkcg_gq *blkg;
	unsigned int memflags;

	if (!blkcg_policy_enabled(q, pol))
		return;

	if (queue_is_mq(q))
		blk_mq_freeze_queue(q);
		memflags = blk_mq_freeze_queue(q);

	mutex_lock(&q->blkcg_mutex);
	spin_lock_irq(&q->queue_lock);
@@ -1697,7 +1699,7 @@ void blkcg_deactivate_policy(struct gendisk *disk,
	mutex_unlock(&q->blkcg_mutex);

	if (queue_is_mq(q))
		blk_mq_unfreeze_queue(q);
		blk_mq_unfreeze_queue(q, memflags);
}
EXPORT_SYMBOL_GPL(blkcg_deactivate_policy);

+0 −1
Original line number Diff line number Diff line
@@ -430,7 +430,6 @@ struct request_queue *blk_alloc_queue(struct queue_limits *lim, int node_id)
	refcount_set(&q->refs, 1);
	mutex_init(&q->debugfs_mutex);
	mutex_init(&q->sysfs_lock);
	mutex_init(&q->sysfs_dir_lock);
	mutex_init(&q->limits_lock);
	mutex_init(&q->rq_qos_mutex);
	spin_lock_init(&q->queue_lock);
+0 −4
Original line number Diff line number Diff line
@@ -111,7 +111,6 @@ int disk_register_independent_access_ranges(struct gendisk *disk)
	struct request_queue *q = disk->queue;
	int i, ret;

	lockdep_assert_held(&q->sysfs_dir_lock);
	lockdep_assert_held(&q->sysfs_lock);

	if (!iars)
@@ -155,7 +154,6 @@ void disk_unregister_independent_access_ranges(struct gendisk *disk)
	struct blk_independent_access_ranges *iars = disk->ia_ranges;
	int i;

	lockdep_assert_held(&q->sysfs_dir_lock);
	lockdep_assert_held(&q->sysfs_lock);

	if (!iars)
@@ -289,7 +287,6 @@ void disk_set_independent_access_ranges(struct gendisk *disk,
{
	struct request_queue *q = disk->queue;

	mutex_lock(&q->sysfs_dir_lock);
	mutex_lock(&q->sysfs_lock);
	if (iars && !disk_check_ia_ranges(disk, iars)) {
		kfree(iars);
@@ -313,6 +310,5 @@ void disk_set_independent_access_ranges(struct gendisk *disk,
		disk_register_independent_access_ranges(disk);
unlock:
	mutex_unlock(&q->sysfs_lock);
	mutex_unlock(&q->sysfs_dir_lock);
}
EXPORT_SYMBOL_GPL(disk_set_independent_access_ranges);
+8 −6
Original line number Diff line number Diff line
@@ -3224,6 +3224,7 @@ static ssize_t ioc_qos_write(struct kernfs_open_file *of, char *input,
	u32 qos[NR_QOS_PARAMS];
	bool enable, user;
	char *body, *p;
	unsigned int memflags;
	int ret;

	blkg_conf_init(&ctx, input);
@@ -3247,7 +3248,7 @@ static ssize_t ioc_qos_write(struct kernfs_open_file *of, char *input,
		ioc = q_to_ioc(disk->queue);
	}

	blk_mq_freeze_queue(disk->queue);
	memflags = blk_mq_freeze_queue(disk->queue);
	blk_mq_quiesce_queue(disk->queue);

	spin_lock_irq(&ioc->lock);
@@ -3347,7 +3348,7 @@ static ssize_t ioc_qos_write(struct kernfs_open_file *of, char *input,
		wbt_enable_default(disk);

	blk_mq_unquiesce_queue(disk->queue);
	blk_mq_unfreeze_queue(disk->queue);
	blk_mq_unfreeze_queue(disk->queue, memflags);

	blkg_conf_exit(&ctx);
	return nbytes;
@@ -3355,7 +3356,7 @@ static ssize_t ioc_qos_write(struct kernfs_open_file *of, char *input,
	spin_unlock_irq(&ioc->lock);

	blk_mq_unquiesce_queue(disk->queue);
	blk_mq_unfreeze_queue(disk->queue);
	blk_mq_unfreeze_queue(disk->queue, memflags);

	ret = -EINVAL;
err:
@@ -3414,6 +3415,7 @@ static ssize_t ioc_cost_model_write(struct kernfs_open_file *of, char *input,
{
	struct blkg_conf_ctx ctx;
	struct request_queue *q;
	unsigned int memflags;
	struct ioc *ioc;
	u64 u[NR_I_LCOEFS];
	bool user;
@@ -3441,7 +3443,7 @@ static ssize_t ioc_cost_model_write(struct kernfs_open_file *of, char *input,
		ioc = q_to_ioc(q);
	}

	blk_mq_freeze_queue(q);
	memflags = blk_mq_freeze_queue(q);
	blk_mq_quiesce_queue(q);

	spin_lock_irq(&ioc->lock);
@@ -3493,7 +3495,7 @@ static ssize_t ioc_cost_model_write(struct kernfs_open_file *of, char *input,
	spin_unlock_irq(&ioc->lock);

	blk_mq_unquiesce_queue(q);
	blk_mq_unfreeze_queue(q);
	blk_mq_unfreeze_queue(q, memflags);

	blkg_conf_exit(&ctx);
	return nbytes;
@@ -3502,7 +3504,7 @@ static ssize_t ioc_cost_model_write(struct kernfs_open_file *of, char *input,
	spin_unlock_irq(&ioc->lock);

	blk_mq_unquiesce_queue(q);
	blk_mq_unfreeze_queue(q);
	blk_mq_unfreeze_queue(q, memflags);

	ret = -EINVAL;
err:
+4 −2
Original line number Diff line number Diff line
@@ -749,9 +749,11 @@ static void blkiolatency_enable_work_fn(struct work_struct *work)
	 */
	enabled = atomic_read(&blkiolat->enable_cnt);
	if (enabled != blkiolat->enabled) {
		blk_mq_freeze_queue(blkiolat->rqos.disk->queue);
		unsigned int memflags;

		memflags = blk_mq_freeze_queue(blkiolat->rqos.disk->queue);
		blkiolat->enabled = enabled;
		blk_mq_unfreeze_queue(blkiolat->rqos.disk->queue);
		blk_mq_unfreeze_queue(blkiolat->rqos.disk->queue, memflags);
	}
}

Loading