[PATCH 5.15 032/317] f2fs: implement iomap operations

Sasha Levin posted 317 patches 1 year, 6 months ago
[PATCH 5.15 032/317] f2fs: implement iomap operations
Posted by Sasha Levin 1 year, 6 months ago
From: Eric Biggers <ebiggers@google.com>

[ Upstream commit 1517c1a7a4456f080fabc4ac9853930e4b880d14 ]

Implement 'struct iomap_ops' for f2fs, in preparation for making f2fs
use iomap for direct I/O.

Note that this may be used for other things besides direct I/O in the
future; however, for now I've only tested it for direct I/O.

Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Stable-dep-of: ec16b147a55b ("fs: Fix rw_hint validation")
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 fs/f2fs/Kconfig |  1 +
 fs/f2fs/data.c  | 56 +++++++++++++++++++++++++++++++++++++++++++++++++
 fs/f2fs/f2fs.h  |  1 +
 3 files changed, 58 insertions(+)

diff --git a/fs/f2fs/Kconfig b/fs/f2fs/Kconfig
index 7eea3cfd894d1..f46a7339d6cf7 100644
--- a/fs/f2fs/Kconfig
+++ b/fs/f2fs/Kconfig
@@ -7,6 +7,7 @@ config F2FS_FS
 	select CRYPTO_CRC32
 	select F2FS_FS_XATTR if FS_ENCRYPTION
 	select FS_ENCRYPTION_ALGS if FS_ENCRYPTION
+	select FS_IOMAP
 	select LZ4_COMPRESS if F2FS_FS_LZ4
 	select LZ4_DECOMPRESS if F2FS_FS_LZ4
 	select LZ4HC_COMPRESS if F2FS_FS_LZ4HC
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
index 73a7906a49b1e..5766a9f0773b1 100644
--- a/fs/f2fs/data.c
+++ b/fs/f2fs/data.c
@@ -21,6 +21,7 @@
 #include <linux/cleancache.h>
 #include <linux/sched/signal.h>
 #include <linux/fiemap.h>
+#include <linux/iomap.h>
 
 #include "f2fs.h"
 #include "node.h"
@@ -4242,3 +4243,58 @@ void f2fs_destroy_bio_entry_cache(void)
 {
 	kmem_cache_destroy(bio_entry_slab);
 }
+
+static int f2fs_iomap_begin(struct inode *inode, loff_t offset, loff_t length,
+			    unsigned int flags, struct iomap *iomap,
+			    struct iomap *srcmap)
+{
+	struct f2fs_map_blocks map = {};
+	pgoff_t next_pgofs = 0;
+	int err;
+
+	map.m_lblk = bytes_to_blks(inode, offset);
+	map.m_len = bytes_to_blks(inode, offset + length - 1) - map.m_lblk + 1;
+	map.m_next_pgofs = &next_pgofs;
+	map.m_seg_type = f2fs_rw_hint_to_seg_type(inode->i_write_hint);
+	if (flags & IOMAP_WRITE)
+		map.m_may_create = true;
+
+	err = f2fs_map_blocks(inode, &map, flags & IOMAP_WRITE,
+			      F2FS_GET_BLOCK_DIO);
+	if (err)
+		return err;
+
+	iomap->offset = blks_to_bytes(inode, map.m_lblk);
+
+	if (map.m_flags & (F2FS_MAP_MAPPED | F2FS_MAP_UNWRITTEN)) {
+		iomap->length = blks_to_bytes(inode, map.m_len);
+		if (map.m_flags & F2FS_MAP_MAPPED) {
+			iomap->type = IOMAP_MAPPED;
+			iomap->flags |= IOMAP_F_MERGED;
+		} else {
+			iomap->type = IOMAP_UNWRITTEN;
+		}
+		if (WARN_ON_ONCE(!__is_valid_data_blkaddr(map.m_pblk)))
+			return -EINVAL;
+
+		iomap->bdev = map.m_bdev;
+		iomap->addr = blks_to_bytes(inode, map.m_pblk);
+	} else {
+		iomap->length = blks_to_bytes(inode, next_pgofs) -
+				iomap->offset;
+		iomap->type = IOMAP_HOLE;
+		iomap->addr = IOMAP_NULL_ADDR;
+	}
+
+	if (map.m_flags & F2FS_MAP_NEW)
+		iomap->flags |= IOMAP_F_NEW;
+	if ((inode->i_state & I_DIRTY_DATASYNC) ||
+	    offset + length > i_size_read(inode))
+		iomap->flags |= IOMAP_F_DIRTY;
+
+	return 0;
+}
+
+const struct iomap_ops f2fs_iomap_ops = {
+	.iomap_begin	= f2fs_iomap_begin,
+};
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index 835ef98643bd4..4cabc37c20b90 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -3650,6 +3650,7 @@ int f2fs_init_post_read_processing(void);
 void f2fs_destroy_post_read_processing(void);
 int f2fs_init_post_read_wq(struct f2fs_sb_info *sbi);
 void f2fs_destroy_post_read_wq(struct f2fs_sb_info *sbi);
+extern const struct iomap_ops f2fs_iomap_ops;
 
 /*
  * gc.c
-- 
2.43.0
Re: [PATCH 5.15 032/317] f2fs: implement iomap operations
Posted by Eric Biggers 1 year, 6 months ago
On Sun, Mar 24, 2024 at 07:30:12PM -0400, Sasha Levin wrote:
> From: Eric Biggers <ebiggers@google.com>
> 
> [ Upstream commit 1517c1a7a4456f080fabc4ac9853930e4b880d14 ]
> 
> Implement 'struct iomap_ops' for f2fs, in preparation for making f2fs
> use iomap for direct I/O.
> 
> Note that this may be used for other things besides direct I/O in the
> future; however, for now I've only tested it for direct I/O.
> 
> Signed-off-by: Eric Biggers <ebiggers@google.com>
> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
> Stable-dep-of: ec16b147a55b ("fs: Fix rw_hint validation")
> Signed-off-by: Sasha Levin <sashal@kernel.org>

Nacked-by: Eric Biggers <ebiggers@google.com>

No reason to backport this, and the f2fs mailing list wasn't even Cc'ed...

- Eric
Re: [PATCH 5.15 032/317] f2fs: implement iomap operations
Posted by Sasha Levin 1 year, 6 months ago
On Sun, Mar 24, 2024 at 08:37:17PM -0700, Eric Biggers wrote:
>On Sun, Mar 24, 2024 at 07:30:12PM -0400, Sasha Levin wrote:
>> From: Eric Biggers <ebiggers@google.com>
>>
>> [ Upstream commit 1517c1a7a4456f080fabc4ac9853930e4b880d14 ]
>>
>> Implement 'struct iomap_ops' for f2fs, in preparation for making f2fs
>> use iomap for direct I/O.
>>
>> Note that this may be used for other things besides direct I/O in the
>> future; however, for now I've only tested it for direct I/O.
>>
>> Signed-off-by: Eric Biggers <ebiggers@google.com>
>> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
>> Stable-dep-of: ec16b147a55b ("fs: Fix rw_hint validation")
>> Signed-off-by: Sasha Levin <sashal@kernel.org>
>
>Nacked-by: Eric Biggers <ebiggers@google.com>
>
>No reason to backport this, and the f2fs mailing list wasn't even Cc'ed...

You're right, it should have been dropped when the dependency it was
needed for got dropped, I'll do it now.

-- 
Thanks,
Sasha
Re: [PATCH 5.15 032/317] f2fs: implement iomap operations
Posted by Eric Biggers 1 year, 6 months ago
On Sun, Mar 24, 2024 at 08:37:19PM -0700, Eric Biggers wrote:
> On Sun, Mar 24, 2024 at 07:30:12PM -0400, Sasha Levin wrote:
> > From: Eric Biggers <ebiggers@google.com>
> > 
> > [ Upstream commit 1517c1a7a4456f080fabc4ac9853930e4b880d14 ]
> > 
> > Implement 'struct iomap_ops' for f2fs, in preparation for making f2fs
> > use iomap for direct I/O.
> > 
> > Note that this may be used for other things besides direct I/O in the
> > future; however, for now I've only tested it for direct I/O.
> > 
> > Signed-off-by: Eric Biggers <ebiggers@google.com>
> > Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
> > Stable-dep-of: ec16b147a55b ("fs: Fix rw_hint validation")
> > Signed-off-by: Sasha Levin <sashal@kernel.org>
> 
> Nacked-by: Eric Biggers <ebiggers@google.com>
> 
> No reason to backport this, and the f2fs mailing list wasn't even Cc'ed...
> 
> - Eric

I see a lot of other f2fs patches in the queue too, have these been tested?

- Eric