Skip to content

Commit 786f847

Browse files
Christoph Hellwigkdave
authored andcommitted
iomap: add per-iomap_iter private data
Allow the file system to keep state for all iterations. For now only wire it up for direct I/O as there is an immediate need for it there. Reviewed-by: Darrick J. Wong <[email protected]> Reviewed-by: Nikolay Borisov <[email protected]> Signed-off-by: Christoph Hellwig <[email protected]> Reviewed-by: David Sterba <[email protected]> Signed-off-by: David Sterba <[email protected]>
1 parent 908c549 commit 786f847

File tree

9 files changed

+21
-18
lines changed

9 files changed

+21
-18
lines changed

fs/btrfs/inode.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8167,7 +8167,7 @@ static const struct iomap_dio_ops btrfs_dio_ops = {
81678167
ssize_t btrfs_dio_rw(struct kiocb *iocb, struct iov_iter *iter, size_t done_before)
81688168
{
81698169
return iomap_dio_rw(iocb, iter, &btrfs_dio_iomap_ops, &btrfs_dio_ops,
8170-
IOMAP_DIO_PARTIAL, done_before);
8170+
IOMAP_DIO_PARTIAL, NULL, done_before);
81718171
}
81728172

81738173
static int btrfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,

fs/erofs/data.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ static ssize_t erofs_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
385385

386386
if (!err)
387387
return iomap_dio_rw(iocb, to, &erofs_iomap_ops,
388-
NULL, 0, 0);
388+
NULL, 0, NULL, 0);
389389
if (err < 0)
390390
return err;
391391
}

fs/ext4/file.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ static ssize_t ext4_dio_read_iter(struct kiocb *iocb, struct iov_iter *to)
7676
return generic_file_read_iter(iocb, to);
7777
}
7878

79-
ret = iomap_dio_rw(iocb, to, &ext4_iomap_ops, NULL, 0, 0);
79+
ret = iomap_dio_rw(iocb, to, &ext4_iomap_ops, NULL, 0, NULL, 0);
8080
inode_unlock_shared(inode);
8181

8282
file_accessed(iocb->ki_filp);
@@ -565,7 +565,7 @@ static ssize_t ext4_dio_write_iter(struct kiocb *iocb, struct iov_iter *from)
565565
iomap_ops = &ext4_iomap_overwrite_ops;
566566
ret = iomap_dio_rw(iocb, from, iomap_ops, &ext4_dio_write_ops,
567567
(unaligned_io || extend) ? IOMAP_DIO_FORCE_WAIT : 0,
568-
0);
568+
NULL, 0);
569569
if (ret == -ENOTBLK)
570570
ret = 0;
571571

fs/f2fs/file.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4309,7 +4309,7 @@ static ssize_t f2fs_dio_read_iter(struct kiocb *iocb, struct iov_iter *to)
43094309
*/
43104310
inc_page_count(sbi, F2FS_DIO_READ);
43114311
dio = __iomap_dio_rw(iocb, to, &f2fs_iomap_ops,
4312-
&f2fs_iomap_dio_read_ops, 0, 0);
4312+
&f2fs_iomap_dio_read_ops, 0, NULL, 0);
43134313
if (IS_ERR_OR_NULL(dio)) {
43144314
ret = PTR_ERR_OR_ZERO(dio);
43154315
if (ret != -EIOCBQUEUED)
@@ -4527,7 +4527,7 @@ static ssize_t f2fs_dio_write_iter(struct kiocb *iocb, struct iov_iter *from,
45274527
if (pos + count > inode->i_size)
45284528
dio_flags |= IOMAP_DIO_FORCE_WAIT;
45294529
dio = __iomap_dio_rw(iocb, from, &f2fs_iomap_ops,
4530-
&f2fs_iomap_dio_write_ops, dio_flags, 0);
4530+
&f2fs_iomap_dio_write_ops, dio_flags, NULL, 0);
45314531
if (IS_ERR_OR_NULL(dio)) {
45324532
ret = PTR_ERR_OR_ZERO(dio);
45334533
if (ret == -ENOTBLK)

fs/gfs2/file.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -835,7 +835,7 @@ static ssize_t gfs2_file_direct_read(struct kiocb *iocb, struct iov_iter *to,
835835
pagefault_disable();
836836
to->nofault = true;
837837
ret = iomap_dio_rw(iocb, to, &gfs2_iomap_ops, NULL,
838-
IOMAP_DIO_PARTIAL, read);
838+
IOMAP_DIO_PARTIAL, NULL, read);
839839
to->nofault = false;
840840
pagefault_enable();
841841
if (ret <= 0 && ret != -EFAULT)
@@ -898,7 +898,7 @@ static ssize_t gfs2_file_direct_write(struct kiocb *iocb, struct iov_iter *from,
898898

899899
from->nofault = true;
900900
ret = iomap_dio_rw(iocb, from, &gfs2_iomap_ops, NULL,
901-
IOMAP_DIO_PARTIAL, written);
901+
IOMAP_DIO_PARTIAL, NULL, written);
902902
from->nofault = false;
903903
if (ret <= 0) {
904904
if (ret == -ENOTBLK)

fs/iomap/direct-io.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -483,7 +483,7 @@ static loff_t iomap_dio_iter(const struct iomap_iter *iter,
483483
struct iomap_dio *
484484
__iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter,
485485
const struct iomap_ops *ops, const struct iomap_dio_ops *dops,
486-
unsigned int dio_flags, size_t done_before)
486+
unsigned int dio_flags, void *private, size_t done_before)
487487
{
488488
struct address_space *mapping = iocb->ki_filp->f_mapping;
489489
struct inode *inode = file_inode(iocb->ki_filp);
@@ -492,6 +492,7 @@ __iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter,
492492
.pos = iocb->ki_pos,
493493
.len = iov_iter_count(iter),
494494
.flags = IOMAP_DIRECT,
495+
.private = private,
495496
};
496497
loff_t end = iomi.pos + iomi.len - 1, ret = 0;
497498
bool wait_for_completion =
@@ -683,11 +684,12 @@ EXPORT_SYMBOL_GPL(__iomap_dio_rw);
683684
ssize_t
684685
iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter,
685686
const struct iomap_ops *ops, const struct iomap_dio_ops *dops,
686-
unsigned int dio_flags, size_t done_before)
687+
unsigned int dio_flags, void *private, size_t done_before)
687688
{
688689
struct iomap_dio *dio;
689690

690-
dio = __iomap_dio_rw(iocb, iter, ops, dops, dio_flags, done_before);
691+
dio = __iomap_dio_rw(iocb, iter, ops, dops, dio_flags, private,
692+
done_before);
691693
if (IS_ERR_OR_NULL(dio))
692694
return PTR_ERR_OR_ZERO(dio);
693695
return iomap_dio_complete(dio);

fs/xfs/xfs_file.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ xfs_file_dio_read(
225225
ret = xfs_ilock_iocb(iocb, XFS_IOLOCK_SHARED);
226226
if (ret)
227227
return ret;
228-
ret = iomap_dio_rw(iocb, to, &xfs_read_iomap_ops, NULL, 0, 0);
228+
ret = iomap_dio_rw(iocb, to, &xfs_read_iomap_ops, NULL, 0, NULL, 0);
229229
xfs_iunlock(ip, XFS_IOLOCK_SHARED);
230230

231231
return ret;
@@ -534,7 +534,7 @@ xfs_file_dio_write_aligned(
534534
}
535535
trace_xfs_file_direct_write(iocb, from);
536536
ret = iomap_dio_rw(iocb, from, &xfs_direct_write_iomap_ops,
537-
&xfs_dio_write_ops, 0, 0);
537+
&xfs_dio_write_ops, 0, NULL, 0);
538538
out_unlock:
539539
if (iolock)
540540
xfs_iunlock(ip, iolock);
@@ -612,7 +612,7 @@ xfs_file_dio_write_unaligned(
612612

613613
trace_xfs_file_direct_write(iocb, from);
614614
ret = iomap_dio_rw(iocb, from, &xfs_direct_write_iomap_ops,
615-
&xfs_dio_write_ops, flags, 0);
615+
&xfs_dio_write_ops, flags, NULL, 0);
616616

617617
/*
618618
* Retry unaligned I/O with exclusive blocking semantics if the DIO

fs/zonefs/super.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -861,7 +861,7 @@ static ssize_t zonefs_file_dio_write(struct kiocb *iocb, struct iov_iter *from)
861861
ret = zonefs_file_dio_append(iocb, from);
862862
else
863863
ret = iomap_dio_rw(iocb, from, &zonefs_iomap_ops,
864-
&zonefs_write_dio_ops, 0, 0);
864+
&zonefs_write_dio_ops, 0, NULL, 0);
865865
if (zi->i_ztype == ZONEFS_ZTYPE_SEQ &&
866866
(ret > 0 || ret == -EIOCBQUEUED)) {
867867
if (ret > 0)
@@ -996,7 +996,7 @@ static ssize_t zonefs_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
996996
}
997997
file_accessed(iocb->ki_filp);
998998
ret = iomap_dio_rw(iocb, to, &zonefs_iomap_ops,
999-
&zonefs_read_dio_ops, 0, 0);
999+
&zonefs_read_dio_ops, 0, NULL, 0);
10001000
} else {
10011001
ret = generic_file_read_iter(iocb, to);
10021002
if (ret == -EIO)

include/linux/iomap.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ struct iomap_iter {
188188
unsigned flags;
189189
struct iomap iomap;
190190
struct iomap srcmap;
191+
void *private;
191192
};
192193

193194
int iomap_iter(struct iomap_iter *iter, const struct iomap_ops *ops);
@@ -354,10 +355,10 @@ struct iomap_dio_ops {
354355

355356
ssize_t iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter,
356357
const struct iomap_ops *ops, const struct iomap_dio_ops *dops,
357-
unsigned int dio_flags, size_t done_before);
358+
unsigned int dio_flags, void *private, size_t done_before);
358359
struct iomap_dio *__iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter,
359360
const struct iomap_ops *ops, const struct iomap_dio_ops *dops,
360-
unsigned int dio_flags, size_t done_before);
361+
unsigned int dio_flags, void *private, size_t done_before);
361362
ssize_t iomap_dio_complete(struct iomap_dio *dio);
362363
void iomap_dio_bio_end_io(struct bio *bio);
363364

0 commit comments

Comments
 (0)