Re: [f2fs-dev] [PATCH] f2fs: make fibmap consistent with fiemap for compression chunk

From: Chao Yu
Date: Sat Aug 29 2020 - 19:44:34 EST


On 2020-8-28 11:49, Daeho Jeong wrote:
From: Daeho Jeong <daehojeong@xxxxxxxxxx>

Currently fibmap returns zero address for compression chunk. But it
is not consistent with the output of fiemap, since fiemap returns
real pysical block address related to the compression chunk. Therefore
I suggest fibmap returns the same output with fiemap.

We can return real physical block address in fiemap, because we have set
FIEMAP_EXTENT_ENCODED flag in extent.fe_flags, then user can be noticed that he can not just read/write that block address for access/update in-there data.

Quoted from Documentation/filesystems/fiemap.rst
"
FIEMAP_EXTENT_ENCODED
This extent does not consist of plain filesystem blocks but is
encoded (e.g. encrypted or compressed). Reading the data in this
extent via I/O to the block device will have undefined results.
"

However, there is no such flag in fibmap interface, so I just return block address for those logical pages in non-compressed cluster.

Thanks,


Signed-off-by: Daeho Jeong <daehojeong@xxxxxxxxxx>
---
fs/f2fs/data.c | 33 ---------------------------------
1 file changed, 33 deletions(-)

diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
index c1b676be67b9..8c26c5d0c778 100644
--- a/fs/f2fs/data.c
+++ b/fs/f2fs/data.c
@@ -3708,36 +3708,6 @@ static int f2fs_set_data_page_dirty(struct page *page)
return 0;
}

-
-static sector_t f2fs_bmap_compress(struct inode *inode, sector_t block)
-{
-#ifdef CONFIG_F2FS_FS_COMPRESSION
- struct dnode_of_data dn;
- sector_t start_idx, blknr = 0;
- int ret;
-
- start_idx = round_down(block, F2FS_I(inode)->i_cluster_size);
-
- set_new_dnode(&dn, inode, NULL, NULL, 0);
- ret = f2fs_get_dnode_of_data(&dn, start_idx, LOOKUP_NODE);
- if (ret)
- return 0;
-
- if (dn.data_blkaddr != COMPRESS_ADDR) {
- dn.ofs_in_node += block - start_idx;
- blknr = f2fs_data_blkaddr(&dn);
- if (!__is_valid_data_blkaddr(blknr))
- blknr = 0;
- }
-
- f2fs_put_dnode(&dn);
- return blknr;
-#else
- return 0;
-#endif
-}
-
-
static sector_t f2fs_bmap(struct address_space *mapping, sector_t block)
{
struct inode *inode = mapping->host;
@@ -3753,9 +3723,6 @@ static sector_t f2fs_bmap(struct address_space *mapping, sector_t block)
if (mapping_tagged(mapping, PAGECACHE_TAG_DIRTY))
filemap_write_and_wait(mapping);

- if (f2fs_compressed_file(inode))
- blknr = f2fs_bmap_compress(inode, block);
-
if (!get_data_block_bmap(inode, block, &tmp, 0))
blknr = tmp.b_blocknr;
out: