UPSTREAM: f2fs: change fiemap way in printing compression chunk
When we print out a discontinuous compression chunk, it shows like a continuous chunk now. To show it more correctly, I've changed the way of printing fiemap info like below. Plus, eliminated NEW_ADDR(-1) in fiemap info, since it is not in fiemap user api manual. Let's assume 16KB compression cluster. <before> Logical Physical Length Flags 0: 0000000000000000 00000002c091f000 0000000000004000 1008 1: 0000000000004000 00000002c0920000 0000000000004000 1008 ... 9: 0000000000034000 0000000f8c623000 0000000000004000 1008 10: 0000000000038000 000000101a6eb000 0000000000004000 1008 <after> 0: 0000000000000000 00000002c091f000 0000000000004000 1008 1: 0000000000004000 00000002c0920000 0000000000004000 1008 ... 9: 0000000000034000 0000000f8c623000 0000000000001000 1008 10: 0000000000035000 000000101a6ea000 0000000000003000 1008 11: 0000000000038000 000000101a6eb000 0000000000002000 1008 12: 000000000003a000 00000002c3544000 0000000000002000 1008 Flags 0x1000 => FIEMAP_EXTENT_MERGED 0x0008 => FIEMAP_EXTENT_ENCODED Signed-off-by: Daeho Jeong <daehojeong@google.com> Tested-by: Eric Biggers <ebiggers@google.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> Bug: 205123902 (cherry picked from commit 093f0bac32b617960899c7e00f4550373c383dd0) Change-Id: Id140cc153be1213c4823b24076a6da0684e195ba Signed-off-by: Daeho Jeong <daehojeong@google.com>
This commit is contained in:
parent
cc98cd4a3e
commit
a1a4c80265
@ -1859,8 +1859,9 @@ int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
|
||||
u64 logical = 0, phys = 0, size = 0;
|
||||
u32 flags = 0;
|
||||
int ret = 0;
|
||||
bool compr_cluster = false;
|
||||
bool compr_cluster = false, compr_appended;
|
||||
unsigned int cluster_size = F2FS_I(inode)->i_cluster_size;
|
||||
unsigned int count_in_cluster = 0;
|
||||
loff_t maxbytes;
|
||||
|
||||
if (fieinfo->fi_flags & FIEMAP_FLAG_CACHE) {
|
||||
@ -1908,15 +1909,17 @@ int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
|
||||
map.m_next_pgofs = &next_pgofs;
|
||||
map.m_seg_type = NO_CHECK_TYPE;
|
||||
|
||||
if (compr_cluster)
|
||||
map.m_len = cluster_size - 1;
|
||||
if (compr_cluster) {
|
||||
map.m_lblk += 1;
|
||||
map.m_len = cluster_size - count_in_cluster;
|
||||
}
|
||||
|
||||
ret = f2fs_map_blocks(inode, &map, 0, F2FS_GET_BLOCK_FIEMAP);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
/* HOLE */
|
||||
if (!(map.m_flags & F2FS_MAP_FLAGS)) {
|
||||
if (!compr_cluster && !(map.m_flags & F2FS_MAP_FLAGS)) {
|
||||
start_blk = next_pgofs;
|
||||
|
||||
if (blks_to_bytes(inode, start_blk) < blks_to_bytes(inode,
|
||||
@ -1926,6 +1929,14 @@ int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
|
||||
flags |= FIEMAP_EXTENT_LAST;
|
||||
}
|
||||
|
||||
compr_appended = false;
|
||||
/* In a case of compressed cluster, append this to the last extent */
|
||||
if (compr_cluster && ((map.m_flags & F2FS_MAP_UNWRITTEN) ||
|
||||
!(map.m_flags & F2FS_MAP_FLAGS))) {
|
||||
compr_appended = true;
|
||||
goto skip_fill;
|
||||
}
|
||||
|
||||
if (size) {
|
||||
flags |= FIEMAP_EXTENT_MERGED;
|
||||
if (IS_ENCRYPTED(inode))
|
||||
@ -1942,39 +1953,37 @@ int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
|
||||
if (start_blk > last_blk)
|
||||
goto out;
|
||||
|
||||
if (compr_cluster) {
|
||||
compr_cluster = false;
|
||||
|
||||
|
||||
logical = blks_to_bytes(inode, start_blk - 1);
|
||||
phys = blks_to_bytes(inode, map.m_pblk);
|
||||
size = blks_to_bytes(inode, cluster_size);
|
||||
|
||||
flags |= FIEMAP_EXTENT_ENCODED;
|
||||
|
||||
start_blk += cluster_size - 1;
|
||||
|
||||
if (start_blk > last_blk)
|
||||
goto out;
|
||||
|
||||
goto prep_next;
|
||||
}
|
||||
|
||||
skip_fill:
|
||||
if (map.m_pblk == COMPRESS_ADDR) {
|
||||
compr_cluster = true;
|
||||
start_blk++;
|
||||
goto prep_next;
|
||||
count_in_cluster = 1;
|
||||
} else if (compr_appended) {
|
||||
unsigned int appended_blks = cluster_size -
|
||||
count_in_cluster + 1;
|
||||
size += blks_to_bytes(inode, appended_blks);
|
||||
start_blk += appended_blks;
|
||||
compr_cluster = false;
|
||||
} else {
|
||||
logical = blks_to_bytes(inode, start_blk);
|
||||
phys = __is_valid_data_blkaddr(map.m_pblk) ?
|
||||
blks_to_bytes(inode, map.m_pblk) : 0;
|
||||
size = blks_to_bytes(inode, map.m_len);
|
||||
flags = 0;
|
||||
|
||||
if (compr_cluster) {
|
||||
flags = FIEMAP_EXTENT_ENCODED;
|
||||
count_in_cluster += map.m_len;
|
||||
if (count_in_cluster == cluster_size) {
|
||||
compr_cluster = false;
|
||||
size += blks_to_bytes(inode, 1);
|
||||
}
|
||||
} else if (map.m_flags & F2FS_MAP_UNWRITTEN) {
|
||||
flags = FIEMAP_EXTENT_UNWRITTEN;
|
||||
}
|
||||
|
||||
start_blk += bytes_to_blks(inode, size);
|
||||
}
|
||||
|
||||
logical = blks_to_bytes(inode, start_blk);
|
||||
phys = blks_to_bytes(inode, map.m_pblk);
|
||||
size = blks_to_bytes(inode, map.m_len);
|
||||
flags = 0;
|
||||
if (map.m_flags & F2FS_MAP_UNWRITTEN)
|
||||
flags = FIEMAP_EXTENT_UNWRITTEN;
|
||||
|
||||
start_blk += bytes_to_blks(inode, size);
|
||||
|
||||
prep_next:
|
||||
cond_resched();
|
||||
if (fatal_signal_pending(current))
|
||||
|
Loading…
Reference in New Issue
Block a user