2
0
mirror of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git synced 2025-09-04 20:19:47 +08:00

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: Hannes Reinecke <hare@suse.de>
Reviewed-by: Nitesh Shetty <nj.shetty@samsung.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
[kbusch: removed statx reporting]
Signed-off-by: Keith Busch <kbusch@kernel.org>
Signed-off-by: Kanchan Joshi <joshi.k@samsung.com>
Link: https://lore.kernel.org/r/20250506121732.8211-6-joshi.k@samsung.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
Christoph Hellwig 2025-05-06 17:47:26 +05:30 committed by Jens Axboe
parent c23acfac10
commit c27683da64

View File

@ -73,6 +73,7 @@ static ssize_t __blkdev_direct_IO_simple(struct kiocb *iocb,
} }
bio.bi_iter.bi_sector = pos >> SECTOR_SHIFT; bio.bi_iter.bi_sector = pos >> SECTOR_SHIFT;
bio.bi_write_hint = file_inode(iocb->ki_filp)->i_write_hint; 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; bio.bi_ioprio = iocb->ki_ioprio;
if (iocb->ki_flags & IOCB_ATOMIC) if (iocb->ki_flags & IOCB_ATOMIC)
bio.bi_opf |= REQ_ATOMIC; bio.bi_opf |= REQ_ATOMIC;
@ -206,6 +207,7 @@ static ssize_t __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter,
for (;;) { for (;;) {
bio->bi_iter.bi_sector = pos >> SECTOR_SHIFT; bio->bi_iter.bi_sector = pos >> SECTOR_SHIFT;
bio->bi_write_hint = file_inode(iocb->ki_filp)->i_write_hint; 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_private = dio;
bio->bi_end_io = blkdev_bio_end_io; bio->bi_end_io = blkdev_bio_end_io;
bio->bi_ioprio = iocb->ki_ioprio; bio->bi_ioprio = iocb->ki_ioprio;
@ -333,6 +335,7 @@ static ssize_t __blkdev_direct_IO_async(struct kiocb *iocb,
dio->iocb = iocb; dio->iocb = iocb;
bio->bi_iter.bi_sector = pos >> SECTOR_SHIFT; bio->bi_iter.bi_sector = pos >> SECTOR_SHIFT;
bio->bi_write_hint = file_inode(iocb->ki_filp)->i_write_hint; 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_end_io = blkdev_bio_end_io_async;
bio->bi_ioprio = iocb->ki_ioprio; 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)) if (blkdev_dio_invalid(bdev, iocb, iter))
return -EINVAL; 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); nr_pages = bio_iov_vecs_to_alloc(iter, BIO_MAX_VECS + 1);
if (likely(nr_pages <= BIO_MAX_VECS)) { if (likely(nr_pages <= BIO_MAX_VECS)) {
if (is_sync_kiocb(iocb)) if (is_sync_kiocb(iocb))