[f2fs-dev] [PATCH 3/3] mkfs.f2fs: remove android features for RO
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
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
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]); -