* [f2fs-dev] [PATCH 2/3] fsck.f2fs: add -M to get file map
2021-06-13 5:55 [f2fs-dev] [PATCH 1/3] dump.f2fs: add -M to get block map Jaegeuk Kim
@ 2021-06-13 5:55 ` Jaegeuk Kim
2021-06-13 5:55 ` [f2fs-dev] [PATCH 3/3] mkfs.f2fs: remove android features for RO Jaegeuk Kim
1 sibling, 0 replies; 3+ messages in thread
From: Jaegeuk Kim @ 2021-06-13 5:55 UTC (permalink / raw)
To: linux-f2fs-devel; +Cc: Jaegeuk Kim
This option shows all the file names in the disk.
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
---
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]);
-
pretty_print_filename(name, name_len, new, enc_name);
- printf("%c-- %s <ino = 0x%x>, <encrypted (%d)>\n",
+ if (c.show_file_map) {
+ struct f2fs_dentry *d = fsck->dentry;
+
+ if (dentry[idx].file_type != F2FS_FT_REG_FILE)
+ return;
+
+ while (d) {
+ if (d->depth > 1)
+ printf("/%s", d->name);
+ d = d->next;
+ }
+ printf("/%s", new);
+ if (dump_node(sbi, le32_to_cpu(dentry[idx].ino), 0))
+ printf("\33[2K\r");
+ } else {
+ for (i = 1; i < depth; i++)
+ printf("%c ", tree_mark[i]);
+
+ printf("%c-- %s <ino = 0x%x>, <encrypted (%d)>\n",
last_de ? '`' : '|',
new, le32_to_cpu(dentry[idx].ino),
enc_name);
+ }
}
static int f2fs_check_hash_code(int encoding, int casefolded,
@@ -1609,7 +1629,7 @@ static int __chk_dentries(struct f2fs_sb_info *sbi, int casefolded,
le32_to_cpu(dentry[i].ino),
dentry[i].file_type);
- print_dentry(fsck->dentry_depth, name, bitmap,
+ print_dentry(sbi, name, bitmap,
dentry, max, i, last_blk, enc_name);
blk_cnt = 1;
@@ -1645,6 +1665,8 @@ int fsck_chk_inline_dentries(struct f2fs_sb_info *sbi,
struct f2fs_node *node_blk, struct child_info *child)
{
struct f2fs_fsck *fsck = F2FS_FSCK(sbi);
+ struct f2fs_dentry *cur_dentry = fsck->dentry_end;
+ struct f2fs_dentry *new_dentry;
struct f2fs_dentry_ptr d;
void *inline_dentry;
int dentries;
@@ -1655,6 +1677,12 @@ int fsck_chk_inline_dentries(struct f2fs_sb_info *sbi,
make_dentry_ptr(&d, node_blk, inline_dentry, 2);
fsck->dentry_depth++;
+ new_dentry = calloc(sizeof(struct f2fs_dentry), 1);
+ new_dentry->depth = fsck->dentry_depth;
+ memcpy(new_dentry->name, child->p_name, F2FS_NAME_LEN);
+ cur_dentry->next = new_dentry;
+ fsck->dentry_end = new_dentry;
+
dentries = __chk_dentries(sbi, IS_CASEFOLDED(&node_blk->i), child,
d.bitmap, d.dentry, d.filename, d.max, 1,
file_is_encrypt(&node_blk->i));// pass through
@@ -1667,6 +1695,10 @@ int fsck_chk_inline_dentries(struct f2fs_sb_info *sbi,
fsck->dentry_depth, dentries,
d.max, F2FS_NAME_LEN);
}
+ fsck->dentry = cur_dentry;
+ fsck->dentry_end =cur_dentry;
+ cur_dentry->next = NULL;
+ free(new_dentry);
fsck->dentry_depth--;
return dentries;
}
@@ -1676,6 +1708,8 @@ int fsck_chk_dentry_blk(struct f2fs_sb_info *sbi, int casefolded, u32 blk_addr,
{
struct f2fs_fsck *fsck = F2FS_FSCK(sbi);
struct f2fs_dentry_block *de_blk;
+ struct f2fs_dentry *cur_dentry = fsck->dentry_end;
+ struct f2fs_dentry *new_dentry;
int dentries, ret;
de_blk = (struct f2fs_dentry_block *)calloc(BLOCK_SZ, 1);
@@ -1685,6 +1719,12 @@ int fsck_chk_dentry_blk(struct f2fs_sb_info *sbi, int casefolded, u32 blk_addr,
ASSERT(ret >= 0);
fsck->dentry_depth++;
+ new_dentry = calloc(sizeof(struct f2fs_dentry), 1);
+ new_dentry->depth = fsck->dentry_depth;
+ memcpy(new_dentry->name, child->p_name, F2FS_NAME_LEN);
+ cur_dentry->next = new_dentry;
+ fsck->dentry_end = new_dentry;
+
dentries = __chk_dentries(sbi, casefolded, child,
de_blk->dentry_bitmap,
de_blk->dentry, de_blk->filename,
@@ -1701,6 +1741,10 @@ int fsck_chk_dentry_blk(struct f2fs_sb_info *sbi, int casefolded, u32 blk_addr,
fsck->dentry_depth, blk_addr, dentries,
NR_DENTRY_IN_BLOCK, F2FS_NAME_LEN);
}
+ fsck->dentry = cur_dentry;
+ fsck->dentry_end =cur_dentry;
+ cur_dentry->next = NULL;
+ free(new_dentry);
fsck->dentry_depth--;
free(de_blk);
return 0;
@@ -2061,6 +2105,9 @@ void fsck_init(struct f2fs_sb_info *sbi)
ASSERT(tree_mark_size != 0);
tree_mark = calloc(tree_mark_size, 1);
ASSERT(tree_mark != NULL);
+ fsck->dentry = calloc(sizeof(struct f2fs_dentry), 1);
+ memcpy(fsck->dentry->name, "/", 1);
+ fsck->dentry_end = fsck->dentry;
}
static void fix_hard_links(struct f2fs_sb_info *sbi)
@@ -3022,6 +3069,9 @@ int fsck_verify(struct f2fs_sb_info *sbi)
struct f2fs_fsck *fsck = F2FS_FSCK(sbi);
struct hard_link_node *node = NULL;
+ if (c.show_file_map)
+ return 0;
+
printf("\n");
if (c.zoned_model == F2FS_ZONED_HM) {
diff --git a/fsck/fsck.h b/fsck/fsck.h
index b9dcd5c27982..6b3246aa57fa 100644
--- a/fsck/fsck.h
+++ b/fsck/fsck.h
@@ -72,13 +72,20 @@ struct child_info {
u32 pgofs;
u8 dots;
u8 dir_level;
- u32 p_ino; /*parent ino*/
- u32 pp_ino; /*parent parent ino*/
+ u32 p_ino; /* parent ino */
+ char p_name[F2FS_NAME_LEN]; /* parent name */
+ u32 pp_ino; /* parent parent ino*/
struct extent_info ei;
u32 last_blk;
u32 i_namelen; /* dentry namelen */
};
+struct f2fs_dentry {
+ char name[F2FS_NAME_LEN];
+ int depth;
+ struct f2fs_dentry *next;
+};
+
struct f2fs_fsck {
struct f2fs_sb_info sbi;
@@ -110,6 +117,8 @@ struct f2fs_fsck {
u32 nr_nat_entries;
u32 dentry_depth;
+ struct f2fs_dentry *dentry;
+ struct f2fs_dentry *dentry_end;
struct f2fs_nat_entry *entries;
u32 nat_valid_inode_cnt;
@@ -253,7 +262,7 @@ struct dump_option {
extern void nat_dump(struct f2fs_sb_info *, nid_t, nid_t);
extern void sit_dump(struct f2fs_sb_info *, unsigned int, unsigned int);
extern void ssa_dump(struct f2fs_sb_info *, int, int);
-extern void dump_node(struct f2fs_sb_info *, nid_t, int);
+extern int dump_node(struct f2fs_sb_info *, nid_t, int);
extern int dump_info_from_blkaddr(struct f2fs_sb_info *, u32);
extern unsigned int start_bidx_of_node(unsigned int, struct f2fs_node *);
diff --git a/fsck/main.c b/fsck/main.c
index 2588a01799c2..a8a9562cf7b7 100644
--- a/fsck/main.c
+++ b/fsck/main.c
@@ -72,6 +72,7 @@ void fsck_usage()
MSG(0, " -f check/fix entire partition\n");
MSG(0, " -g add default options\n");
MSG(0, " -l show superblock/checkpoint\n");
+ MSG(0, " -M show a file map\n");
MSG(0, " -O feature1[feature2,feature3,...] e.g. \"encrypt\"\n");
MSG(0, " -p preen mode [default:0 the same as -a [0|1]]\n");
MSG(0, " -S sparse_mode\n");
@@ -228,7 +229,7 @@ void f2fs_parse_options(int argc, char *argv[])
}
if (!strcmp("fsck.f2fs", prog)) {
- const char *option_string = ":aC:c:m:d:fg:lO:p:q:StyV";
+ const char *option_string = ":aC:c:m:Md:fg:lO:p:q:StyV";
int opt = 0, val;
char *token;
struct option long_opt[] = {
@@ -278,6 +279,9 @@ void f2fs_parse_options(int argc, char *argv[])
case 'l':
c.layout = 1;
break;
+ case 'M':
+ c.show_file_map = 1;
+ break;
case 'O':
if (parse_feature(feature_table, optarg))
fsck_usage();
@@ -1212,7 +1216,8 @@ retry:
if (c.func == SLOAD)
c.compress.filter_ops->destroy();
- printf("\nDone: %lf secs\n", (get_boottime_ns() - start) / 1000000000.0);
+ if (!c.show_file_map)
+ printf("\nDone: %lf secs\n", (get_boottime_ns() - start) / 1000000000.0);
return ret;
out_err:
diff --git a/fsck/mount.c b/fsck/mount.c
index de692b62e1c2..598410e5f4fa 100644
--- a/fsck/mount.c
+++ b/fsck/mount.c
@@ -489,6 +489,9 @@ printout:
void print_cp_state(u32 flag)
{
+ if (c.show_file_map)
+ return;
+
MSG(0, "Info: checkpoint state = %x : ", flag);
if (flag & CP_QUOTA_NEED_FSCK_FLAG)
MSG(0, "%s", " quota_need_fsck");
diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
index 8969ae2ebc34..1618d654973d 100644
--- a/include/f2fs_fs.h
+++ b/include/f2fs_fs.h
@@ -240,14 +240,14 @@ static inline uint64_t bswap_64(uint64_t val)
#define MSG(n, fmt, ...) \
do { \
- if (c.dbg_lv >= n && !c.layout) { \
+ if (c.dbg_lv >= n && !c.layout && !c.show_file_map) { \
printf(fmt, ##__VA_ARGS__); \
} \
} while (0)
#define DBG(n, fmt, ...) \
do { \
- if (c.dbg_lv >= n && !c.layout) { \
+ if (c.dbg_lv >= n && !c.layout && !c.show_file_map) { \
printf("[%s:%4d] " fmt, \
__func__, __LINE__, ##__VA_ARGS__); \
} \
@@ -491,6 +491,7 @@ struct f2fs_configuration {
int alloc_failed;
int auto_fix;
int layout;
+ int show_file_map;
int quota_fix;
int preen_mode;
int ro;
diff --git a/man/fsck.f2fs.8 b/man/fsck.f2fs.8
index af1076cb72bc..aff4ff24a2e1 100644
--- a/man/fsck.f2fs.8
+++ b/man/fsck.f2fs.8
@@ -14,6 +14,10 @@ fsck.f2fs \- check a Linux F2FS file system
.I enable force fix
]
[
+.B \-M
+.I show file map
+]
+[
.B \-p
.I enable preen mode
]
@@ -44,6 +48,9 @@ module. It is disabled by default.
.BI \-f " enable force fix"
Enable to fix all the inconsistency in the partition.
.TP
+.BI \-M " show files map"
+Enable to show all the filenames and inode numbers stored in the image
+.TP
.BI \-p " enable preen mode"
Same as "-a" to support general fsck convention.
.TP
--
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
^ permalink raw reply related [flat|nested] 3+ messages in thread