Commit c27683da authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe
Browse files

block: expose write streams for block device nodes



Use the per-kiocb write stream if provided, or map temperature hints to
write streams (which is a bit questionable, but this shows how it is
done).

Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
Reviewed-by: default avatarNitesh Shetty <nj.shetty@samsung.com>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
[kbusch: removed statx reporting]
Signed-off-by: default avatarKeith Busch <kbusch@kernel.org>
Signed-off-by: default avatarKanchan Joshi <joshi.k@samsung.com>
Link: https://lore.kernel.org/r/20250506121732.8211-6-joshi.k@samsung.com


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent c23acfac
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -73,6 +73,7 @@ static ssize_t __blkdev_direct_IO_simple(struct kiocb *iocb,
	}
	bio.bi_iter.bi_sector = pos >> SECTOR_SHIFT;
	bio.bi_write_hint = file_inode(iocb->ki_filp)->i_write_hint;
	bio.bi_write_stream = iocb->ki_write_stream;
	bio.bi_ioprio = iocb->ki_ioprio;
	if (iocb->ki_flags & IOCB_ATOMIC)
		bio.bi_opf |= REQ_ATOMIC;
@@ -206,6 +207,7 @@ static ssize_t __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
	for (;;) {
		bio->bi_iter.bi_sector = pos >> SECTOR_SHIFT;
		bio->bi_write_hint = file_inode(iocb->ki_filp)->i_write_hint;
		bio->bi_write_stream = iocb->ki_write_stream;
		bio->bi_private = dio;
		bio->bi_end_io = blkdev_bio_end_io;
		bio->bi_ioprio = iocb->ki_ioprio;
@@ -333,6 +335,7 @@ static ssize_t __blkdev_direct_IO_async(struct kiocb *iocb,
	dio->iocb = iocb;
	bio->bi_iter.bi_sector = pos >> SECTOR_SHIFT;
	bio->bi_write_hint = file_inode(iocb->ki_filp)->i_write_hint;
	bio->bi_write_stream = iocb->ki_write_stream;
	bio->bi_end_io = blkdev_bio_end_io_async;
	bio->bi_ioprio = iocb->ki_ioprio;

@@ -398,6 +401,26 @@ static ssize_t blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
	if (blkdev_dio_invalid(bdev, iocb, iter))
		return -EINVAL;

	if (iov_iter_rw(iter) == WRITE) {
		u16 max_write_streams = bdev_max_write_streams(bdev);

		if (iocb->ki_write_stream) {
			if (iocb->ki_write_stream > max_write_streams)
				return -EINVAL;
		} else if (max_write_streams) {
			enum rw_hint write_hint =
				file_inode(iocb->ki_filp)->i_write_hint;

			/*
			 * Just use the write hint as write stream for block
			 * device writes.  This assumes no file system is
			 * mounted that would use the streams differently.
			 */
			if (write_hint <= max_write_streams)
				iocb->ki_write_stream = write_hint;
		}
	}

	nr_pages = bio_iov_vecs_to_alloc(iter, BIO_MAX_VECS + 1);
	if (likely(nr_pages <= BIO_MAX_VECS)) {
		if (is_sync_kiocb(iocb))