[f2fs-dev] [PATCH 3/3] mkfs.f2fs: remove android features for RO

2021-06-12 Thread Jaegeuk Kim
We don't need to enable all android features for RO.

Signed-off-by: Jaegeuk Kim 
---
 mkfs/f2fs_format_main.c | 9 +++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/mkfs/f2fs_format_main.c b/mkfs/f2fs_format_main.c
index 03eb748170ad..031244d5d67a 100644
--- a/mkfs/f2fs_format_main.c
+++ b/mkfs/f2fs_format_main.c
@@ -110,11 +110,16 @@ static void add_default_options(void)
/* -d1 -f -O encrypt -O quota -O verity -w 4096 -R 0:0 */
c.dbg_lv = 1;
force_overwrite = 1;
+   c.wanted_sector_size = 4096;
+   c.root_uid = c.root_gid = 0;
+
+   /* RO doesn't need any other features */
+   if (c.feature & cpu_to_le32(F2FS_FEATURE_RO))
+   return;
+
c.feature |= cpu_to_le32(F2FS_FEATURE_ENCRYPT);
c.feature |= cpu_to_le32(F2FS_FEATURE_QUOTA_INO);
c.feature |= cpu_to_le32(F2FS_FEATURE_VERITY);
-   c.wanted_sector_size = 4096;
-   c.root_uid = c.root_gid = 0;
break;
}
 #ifdef CONF_CASEFOLD
-- 
2.32.0.272.g935e593368-goog



___
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel


[f2fs-dev] [PATCH 1/3] dump.f2fs: add -M to get block map

2021-06-12 Thread Jaegeuk Kim
Signed-off-by: Jaegeuk Kim 
---
 fsck/dump.c | 38 +-
 fsck/main.c |  6 +-
 man/dump.f2fs.8 |  7 +++
 3 files changed, 49 insertions(+), 2 deletions(-)

diff --git a/fsck/dump.c b/fsck/dump.c
index 042a2e52edca..e25c70af84ed 100644
--- a/fsck/dump.c
+++ b/fsck/dump.c
@@ -23,6 +23,9 @@
 
 #define BUF_SZ 80
 
+/* current extent info */
+struct extent_info dump_extent = { 0, 0, 0};
+
 const char *seg_type_name[SEG_TYPE_MAX + 1] = {
"SEG_TYPE_DATA",
"SEG_TYPE_CUR_DATA",
@@ -227,6 +230,21 @@ void ssa_dump(struct f2fs_sb_info *sbi, int start_ssa, int 
end_ssa)
close(fd);
 }
 
+static void print_extent(bool last)
+{
+   if (dump_extent.len == 1) {
+   printf(" %d", dump_extent.blk);
+   dump_extent.len = 0;
+   } else {
+   printf(" %d-%d",
+   dump_extent.blk,
+   dump_extent.blk + dump_extent.len - 1);
+   dump_extent.len = 0;
+   }
+   if (last)
+   printf("\n");
+}
+
 static void dump_data_blk(struct f2fs_sb_info *sbi, __u64 offset, u32 blkaddr)
 {
char buf[F2FS_BLKSIZE];
@@ -237,8 +255,19 @@ static void dump_data_blk(struct f2fs_sb_info *sbi, __u64 
offset, u32 blkaddr)
/* get data */
if (blkaddr == NEW_ADDR || !IS_VALID_BLK_ADDR(sbi, blkaddr)) {
memset(buf, 0, F2FS_BLKSIZE);
+   } else if (c.show_file_map) {
+   if (dump_extent.len == 0) {
+   dump_extent.blk = blkaddr;
+   dump_extent.len = 1;
+   } else if (dump_extent.blk + dump_extent.len == blkaddr) {
+   dump_extent.len++;
+   } else {
+   print_extent(false);
+   }
+   return;
} else {
int ret;
+
ret = dev_read_block(buf, blkaddr);
ASSERT(ret >= 0);
}
@@ -404,6 +433,8 @@ static void dump_inode_blk(struct f2fs_sb_info *sbi, u32 
nid,
else
ASSERT(0);
}
+   /* last block in extent cache */
+   print_extent(true);
 
dump_xattr(sbi, node_blk);
 }
@@ -433,6 +464,10 @@ static void dump_file(struct f2fs_sb_info *sbi, struct 
node_info *ni,
if (force)
goto dump;
 
+   /* dump file's data */
+   if (c.show_file_map)
+   return dump_inode_blk(sbi, ni->ino, node_blk);
+
printf("Do you want to dump this file into ./lost_found/? [Y/N] ");
ret = scanf("%s", ans);
ASSERT(ret >= 0);
@@ -505,7 +540,8 @@ void dump_node(struct f2fs_sb_info *sbi, nid_t nid, int 
force)
 
if (le32_to_cpu(node_blk->footer.ino) == ni.ino &&
le32_to_cpu(node_blk->footer.nid) == ni.nid) {
-   print_node_info(sbi, node_blk, force);
+   if (!c.show_file_map)
+   print_node_info(sbi, node_blk, force);
 
if (ni.ino == ni.nid)
dump_file(sbi, &ni, node_blk, force);
diff --git a/fsck/main.c b/fsck/main.c
index c07be1edc94e..2588a01799c2 100644
--- a/fsck/main.c
+++ b/fsck/main.c
@@ -93,6 +93,7 @@ void dump_usage()
MSG(0, "  -d debug level [default:0]\n");
MSG(0, "  -i inode no (hex)\n");
MSG(0, "  -n [NAT dump nid from #1~#2 (decimal), for all 0~-1]\n");
+   MSG(0, "  -M show a block map\n");
MSG(0, "  -s [SIT dump segno from #1~#2 (decimal), for all 0~-1]\n");
MSG(0, "  -S sparse_mode\n");
MSG(0, "  -a [SSA dump segno from #1~#2 (decimal), for all 0~-1]\n");
@@ -376,7 +377,7 @@ void f2fs_parse_options(int argc, char *argv[])
}
} else if (!strcmp("dump.f2fs", prog)) {
 #ifdef WITH_DUMP
-   const char *option_string = "d:i:n:s:Sa:b:V";
+   const char *option_string = "d:i:n:Ms:Sa:b:V";
static struct dump_option dump_opt = {
.nid = 0,   /* default root ino */
.start_nat = -1,
@@ -423,6 +424,9 @@ void f2fs_parse_options(int argc, char *argv[])
&dump_opt.start_nat,
&dump_opt.end_nat);
break;
+   case 'M':
+   c.show_file_map = 1;
+   break;
case 's':
ret = sscanf(optarg, "%d~%d",
&dump_opt.start_sit,
diff --git a/man/dump.f2fs.8 b/man/dump.f2fs.8
index eedba855721f..1ddb7fc5d0d9 100644
--- a/man/dump.f2fs.8
+++ b/man/dump.f2fs.8
@@ -14,6 +14,10 @@ dump.f2fs \- retrieve directory and file entries from an 
F2FS-formated image
 .I NAT range
 ]
 [
+.B \-M
+.I Block map
+]
+[
 .B \-s
 .I SIT range
 ]
@@ -51,6 +55,9 @@ Specify an inode number to

[f2fs-dev] [PATCH 2/3] fsck.f2fs: add -M to get file map

2021-06-12 Thread Jaegeuk Kim
This option shows all the file names in the disk.

Signed-off-by: Jaegeuk Kim 
---
 fsck/dump.c   | 18 +++--
 fsck/fsck.c   | 64 +--
 fsck/fsck.h   | 15 ---
 fsck/main.c   |  9 +--
 fsck/mount.c  |  3 +++
 include/f2fs_fs.h |  5 ++--
 man/fsck.f2fs.8   |  7 ++
 7 files changed, 100 insertions(+), 21 deletions(-)

diff --git a/fsck/dump.c b/fsck/dump.c
index e25c70af84ed..01e5954bd47d 100644
--- a/fsck/dump.c
+++ b/fsck/dump.c
@@ -400,7 +400,7 @@ static void dump_xattr(struct f2fs_sb_info *UNUSED(sbi),
 }
 #endif
 
-static void dump_inode_blk(struct f2fs_sb_info *sbi, u32 nid,
+static int dump_inode_blk(struct f2fs_sb_info *sbi, u32 nid,
struct f2fs_node *node_blk)
 {
u32 i = 0;
@@ -411,7 +411,7 @@ static void dump_inode_blk(struct f2fs_sb_info *sbi, u32 
nid,
/* recover from inline data */
dev_write_dump(((unsigned char *)node_blk) + INLINE_DATA_OFFSET,
0, MAX_INLINE_DATA(node_blk));
-   return;
+   return -1;
}
 
/* check data blocks in inode */
@@ -437,9 +437,10 @@ static void dump_inode_blk(struct f2fs_sb_info *sbi, u32 
nid,
print_extent(true);
 
dump_xattr(sbi, node_blk);
+   return 0;
 }
 
-static void dump_file(struct f2fs_sb_info *sbi, struct node_info *ni,
+static int dump_file(struct f2fs_sb_info *sbi, struct node_info *ni,
struct f2fs_node *node_blk, int force)
 {
struct f2fs_inode *inode = &node_blk->i;
@@ -453,13 +454,13 @@ static void dump_file(struct f2fs_sb_info *sbi, struct 
node_info *ni,
 
if (is_encrypted) {
MSG(force, "File is encrypted\n");
-   return;
+   return -1;
}
 
if ((!S_ISREG(imode) && !S_ISLNK(imode)) ||
namelen == 0 || namelen > F2FS_NAME_LEN) {
MSG(force, "Not a regular file or wrong name info\n\n");
-   return;
+   return -1;
}
if (force)
goto dump;
@@ -494,6 +495,7 @@ dump:
 
close(c.dump_fd);
}
+   return 0;
 }
 
 static bool is_sit_bitmap_set(struct f2fs_sb_info *sbi, u32 blk_addr)
@@ -508,10 +510,11 @@ static bool is_sit_bitmap_set(struct f2fs_sb_info *sbi, 
u32 blk_addr)
(const char *)se->cur_valid_map) != 0;
 }
 
-void dump_node(struct f2fs_sb_info *sbi, nid_t nid, int force)
+int dump_node(struct f2fs_sb_info *sbi, nid_t nid, int force)
 {
struct node_info ni;
struct f2fs_node *node_blk;
+   int ret = 0;
 
get_node_info(sbi, nid, &ni);
 
@@ -544,13 +547,14 @@ void dump_node(struct f2fs_sb_info *sbi, nid_t nid, int 
force)
print_node_info(sbi, node_blk, force);
 
if (ni.ino == ni.nid)
-   dump_file(sbi, &ni, node_blk, force);
+   ret = dump_file(sbi, &ni, node_blk, force);
} else {
print_node_info(sbi, node_blk, force);
MSG(force, "Invalid (i)node block\n\n");
}
 out:
free(node_blk);
+   return ret;
 }
 
 static void dump_node_from_blkaddr(struct f2fs_sb_info *sbi, u32 blk_addr)
diff --git a/fsck/fsck.c b/fsck/fsck.c
index 80a6d8edfe71..2c741c16124f 100644
--- a/fsck/fsck.c
+++ b/fsck/fsck.c
@@ -695,6 +695,8 @@ void fsck_chk_inode_blk(struct f2fs_sb_info *sbi, u32 nid,
 
if (ftype == F2FS_FT_DIR) {
f2fs_set_main_bitmap(sbi, ni->blk_addr, CURSEG_HOT_NODE);
+   memcpy(child.p_name, node_blk->i.i_name,
+   node_blk->i.i_namelen);;
} else {
if (f2fs_test_main_bitmap(sbi, ni->blk_addr) == 0) {
f2fs_set_main_bitmap(sbi, ni->blk_addr,
@@ -1298,10 +1300,12 @@ void pretty_print_filename(const u8 *raw_name, u32 len,
out[len] = 0;
 }
 
-static void print_dentry(__u32 depth, __u8 *name,
+static void print_dentry(struct f2fs_sb_info *sbi, __u8 *name,
u8 *bitmap, struct f2fs_dir_entry *dentry,
int max, int idx, int last_blk, int enc_name)
 {
+   struct f2fs_fsck *fsck = F2FS_FSCK(sbi);
+   u32 depth = fsck->dentry_depth;
int last_de = 0;
int next_idx = 0;
u32 name_len;
@@ -1309,7 +1313,7 @@ static void print_dentry(__u32 depth, __u8 *name,
int bit_offset;
char new[F2FS_PRINT_NAMELEN];
 
-   if (!c.show_dentry)
+   if (!c.show_dentry && !c.show_file_map)
return;
 
name_len = le16_to_cpu(dentry[idx].name_len);
@@ -1334,15 +1338,31 @@ static void print_dentry(__u32 depth, __u8 *name,
if (tree_mark[depth - 1] == '`')
tree_mark[depth - 1] = ' ';
 
-   for (i = 1; i < depth; i++)
-   printf("%c   ", tree_mark[i]);
-