Commit 99dfe2d4 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull more block updates from Jens Axboe:

 - Fix partial IOVA mapping cleanup in error handling

 - Minor prep series ignoring discard return value, as
   the inline value is always known

 - Ensure BLK_FEAT_STABLE_WRITES is set for drbd

 - Fix leak of folio in bio_iov_iter_bounce_read()

 - Allow IOC_PR_READ_* for read-only open

 - Another debugfs deadlock fix

 - A few doc updates

* tag 'block-7.0-20260216' of git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux:
  blk-mq: use NOIO context to prevent deadlock during debugfs creation
  blk-stat: convert struct blk_stat_callback to kernel-doc
  block: fix enum descriptions kernel-doc
  block: update docs for bio and bvec_iter
  block: change return type to void
  nvmet: ignore discard return value
  md: ignore discard return value
  block: fix partial IOVA mapping cleanup in blk_rq_dma_map_iova
  block: fix folio leak in bio_iov_iter_bounce_read()
  block: allow IOC_PR_READ_* ioctls with BLK_OPEN_READ
  drbd: always set BLK_FEAT_STABLE_WRITES
parents 7b751b01 dfe48ea1
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -1382,8 +1382,10 @@ static int bio_iov_iter_bounce_read(struct bio *bio, struct iov_iter *iter)
		ret = iov_iter_extract_bvecs(iter, bio->bi_io_vec + 1, len,
				&bio->bi_vcnt, bio->bi_max_vecs - 1, 0);
		if (ret <= 0) {
			if (!bio->bi_vcnt)
			if (!bio->bi_vcnt) {
				folio_put(folio);
				return ret;
			}
			break;
		}
		len -= ret;
+1 −2
Original line number Diff line number Diff line
@@ -60,7 +60,7 @@ struct bio *blk_alloc_discard_bio(struct block_device *bdev,
	return bio;
}

int __blkdev_issue_discard(struct block_device *bdev, sector_t sector,
void __blkdev_issue_discard(struct block_device *bdev, sector_t sector,
		sector_t nr_sects, gfp_t gfp_mask, struct bio **biop)
{
	struct bio *bio;
@@ -68,7 +68,6 @@ int __blkdev_issue_discard(struct block_device *bdev, sector_t sector,
	while ((bio = blk_alloc_discard_bio(bdev, &sector, &nr_sects,
			gfp_mask)))
		*biop = bio_chain_and_submit(*biop, bio);
	return 0;
}
EXPORT_SYMBOL(__blkdev_issue_discard);

+3 −7
Original line number Diff line number Diff line
@@ -613,11 +613,6 @@ static void debugfs_create_files(struct request_queue *q, struct dentry *parent,
				 const struct blk_mq_debugfs_attr *attr)
{
	lockdep_assert_held(&q->debugfs_mutex);
	/*
	 * Creating new debugfs entries with queue freezed has the risk of
	 * deadlock.
	 */
	WARN_ON_ONCE(q->mq_freeze_depth != 0);
	/*
	 * debugfs_mutex should not be nested under other locks that can be
	 * grabbed while queue is frozen.
@@ -693,12 +688,13 @@ void blk_mq_debugfs_unregister_hctx(struct blk_mq_hw_ctx *hctx)
void blk_mq_debugfs_register_hctxs(struct request_queue *q)
{
	struct blk_mq_hw_ctx *hctx;
	unsigned int memflags;
	unsigned long i;

	mutex_lock(&q->debugfs_mutex);
	memflags = blk_debugfs_lock(q);
	queue_for_each_hw_ctx(q, hctx, i)
		blk_mq_debugfs_register_hctx(q, hctx);
	mutex_unlock(&q->debugfs_mutex);
	blk_debugfs_unlock(q, memflags);
}

void blk_mq_debugfs_unregister_hctxs(struct request_queue *q)
+8 −5
Original line number Diff line number Diff line
@@ -121,17 +121,20 @@ static bool blk_rq_dma_map_iova(struct request *req, struct device *dma_dev,
		error = dma_iova_link(dma_dev, state, vec->paddr, mapped,
				vec->len, dir, attrs);
		if (error)
			break;
			goto out_unlink;
		mapped += vec->len;
	} while (blk_map_iter_next(req, &iter->iter, vec));

	error = dma_iova_sync(dma_dev, state, 0, mapped);
	if (error) {
		iter->status = errno_to_blk_status(error);
		return false;
	}
	if (error)
		goto out_unlink;

	return true;

out_unlink:
	dma_iova_destroy(dma_dev, state, mapped, dir, attrs);
	iter->status = errno_to_blk_status(error);
	return false;
}

static inline void blk_rq_map_iter_init(struct request *rq,
+5 −4
Original line number Diff line number Diff line
@@ -390,13 +390,14 @@ static void blk_mq_sched_tags_teardown(struct request_queue *q, unsigned int fla
void blk_mq_sched_reg_debugfs(struct request_queue *q)
{
	struct blk_mq_hw_ctx *hctx;
	unsigned int memflags;
	unsigned long i;

	mutex_lock(&q->debugfs_mutex);
	memflags = blk_debugfs_lock(q);
	blk_mq_debugfs_register_sched(q);
	queue_for_each_hw_ctx(q, hctx, i)
		blk_mq_debugfs_register_sched_hctx(q, hctx);
	mutex_unlock(&q->debugfs_mutex);
	blk_debugfs_unlock(q, memflags);
}

void blk_mq_sched_unreg_debugfs(struct request_queue *q)
@@ -404,11 +405,11 @@ void blk_mq_sched_unreg_debugfs(struct request_queue *q)
	struct blk_mq_hw_ctx *hctx;
	unsigned long i;

	mutex_lock(&q->debugfs_mutex);
	blk_debugfs_lock_nomemsave(q);
	queue_for_each_hw_ctx(q, hctx, i)
		blk_mq_debugfs_unregister_sched_hctx(hctx);
	blk_mq_debugfs_unregister_sched(q);
	mutex_unlock(&q->debugfs_mutex);
	blk_debugfs_unlock_nomemrestore(q);
}

void blk_mq_free_sched_tags(struct elevator_tags *et,
Loading