From: Jaegeuk Kim <jaegeuk@kernel.org>
To: linux-f2fs-devel@lists.sourceforge.net
Subject: Re: [f2fs-dev] [PATCH 2/4 v2] fsck|dump.f2fs: add -M to get file map
Date: Wed, 23 Jun 2021 09:04:35 -0700 [thread overview]
Message-ID: <YNNbk/AI2T6fkhLC@google.com> (raw)
In-Reply-To: <20210621023939.1510591-2-jaegeuk@kernel.org>
This option shows all the file names in the disk.
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
---
Change log from v1:
- fix typos and add asserts
- add memory free
fsck/dump.c | 74 ++++++++++++++++++++++++++++++++++++++++++-----
fsck/fsck.c | 74 ++++++++++++++++++++++++++++++++++++++++++-----
fsck/fsck.h | 15 ++++++++--
fsck/main.c | 15 ++++++++--
fsck/mount.c | 3 ++
include/f2fs_fs.h | 7 +++--
lib/libf2fs.c | 11 ++++++-
man/dump.f2fs.8 | 7 +++++
man/fsck.f2fs.8 | 7 +++++
9 files changed, 189 insertions(+), 24 deletions(-)
diff --git a/fsck/dump.c b/fsck/dump.c
index 042a2e52edca..3307a54474ac 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;
+
const char *seg_type_name[SEG_TYPE_MAX + 1] = {
"SEG_TYPE_DATA",
"SEG_TYPE_CUR_DATA",
@@ -227,10 +230,51 @@ 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 == 0)
+ goto out;
+
+ if (dump_extent.len == 1)
+ printf(" %d", dump_extent.blk);
+ else
+ printf(" %d-%d",
+ dump_extent.blk,
+ dump_extent.blk + dump_extent.len - 1);
+ dump_extent.len = 0;
+out:
+ if (last)
+ printf("\n");
+}
+
static void dump_data_blk(struct f2fs_sb_info *sbi, __u64 offset, u32 blkaddr)
{
char buf[F2FS_BLKSIZE];
+ if (c.show_file_map) {
+ if (c.show_file_map_max_offset < offset) {
+ ASSERT(blkaddr == NULL_ADDR);
+ return;
+ }
+ if (blkaddr == NULL_ADDR || blkaddr == NEW_ADDR ||
+ blkaddr == COMPRESS_ADDR) {
+ print_extent(false);
+ dump_extent.blk = 0;
+ dump_extent.len = 1;
+ print_extent(false);
+ } else 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);
+ dump_extent.blk = blkaddr;
+ dump_extent.len = 1;
+ }
+ return;
+ }
+
if (blkaddr == NULL_ADDR)
return;
@@ -239,6 +283,7 @@ static void dump_data_blk(struct f2fs_sb_info *sbi, __u64 offset, u32 blkaddr)
memset(buf, 0, F2FS_BLKSIZE);
} else {
int ret;
+
ret = dev_read_block(buf, blkaddr);
ASSERT(ret >= 0);
}
@@ -371,7 +416,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;
@@ -382,9 +427,11 @@ 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;
}
+ c.show_file_map_max_offset = f2fs_max_file_offset(&node_blk->i);
+
/* check data blocks in inode */
for (i = 0; i < ADDRS_PER_INODE(&node_blk->i); i++, ofs++)
dump_data_blk(sbi, ofs * F2FS_BLKSIZE, le32_to_cpu(
@@ -404,11 +451,14 @@ 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);
+ 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;
@@ -422,17 +472,21 @@ 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;
+ /* 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);
@@ -459,6 +513,7 @@ dump:
close(c.dump_fd);
}
+ return 0;
}
static bool is_sit_bitmap_set(struct f2fs_sb_info *sbi, u32 blk_addr)
@@ -473,10 +528,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);
@@ -505,16 +561,18 @@ 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);
+ 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..6ca85f0870b9 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,14 @@ 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);
+ ASSERT(new_dentry != NULL);
+
+ 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 +1697,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 +1710,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 +1721,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 +1743,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 +2107,10 @@ 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);
+ ASSERT(fsck->dentry != NULL);
+ memcpy(fsck->dentry->name, "/", 1);
+ fsck->dentry_end = fsck->dentry;
}
static void fix_hard_links(struct f2fs_sb_info *sbi)
@@ -3022,6 +3072,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) {
@@ -3229,4 +3282,11 @@ void fsck_free(struct f2fs_sb_info *sbi)
if (tree_mark)
free(tree_mark);
+
+ while (fsck->dentry) {
+ struct f2fs_dentry *dentry = fsck->dentry;
+
+ fsck->dentry = fsck->dentry->next;
+ free(dentry);
+ }
}
diff --git a/fsck/fsck.h b/fsck/fsck.h
index b9dcd5c27982..d79afef55025 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 + 1]; /* 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 + 1];
+ 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 b36169845762..260ff29dcdd2 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");
@@ -93,6 +94,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");
@@ -228,7 +230,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 +280,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();
@@ -377,7 +382,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,
@@ -424,6 +429,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,
@@ -1209,7 +1217,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..45f72573dadd 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,8 @@ struct f2fs_configuration {
int alloc_failed;
int auto_fix;
int layout;
+ int show_file_map;
+ u64 show_file_map_max_offset;
int quota_fix;
int preen_mode;
int ro;
@@ -1298,6 +1300,7 @@ extern int utf16_to_utf8(char *, const u_int16_t *, size_t, size_t);
extern int log_base_2(u_int32_t);
extern unsigned int addrs_per_inode(struct f2fs_inode *);
extern unsigned int addrs_per_block(struct f2fs_inode *);
+extern unsigned int f2fs_max_file_offset(struct f2fs_inode *);
extern __u32 f2fs_inode_chksum(struct f2fs_node *);
extern __u32 f2fs_checkpoint_chksum(struct f2fs_checkpoint *);
extern int write_inode(struct f2fs_node *, u64);
diff --git a/lib/libf2fs.c b/lib/libf2fs.c
index 0add9018d2ce..876c1dc848b3 100644
--- a/lib/libf2fs.c
+++ b/lib/libf2fs.c
@@ -499,7 +499,8 @@ opaque_seq:
return __f2fs_dentry_hash(name, len);
}
-#define ALIGN_DOWN(addrs, size) (((addrs) / (size)) * (size))
+#define ALIGN_DOWN(addrs, size) (((addrs) / (size)) * (size))
+#define ALIGN_UP(addrs, size) ALIGN_DOWN(((addrs) + (size) - 1), (size))
unsigned int addrs_per_inode(struct f2fs_inode *i)
{
unsigned int addrs = CUR_ADDRS_PER_INODE(i) - get_inline_xattr_addrs(i);
@@ -518,6 +519,14 @@ unsigned int addrs_per_block(struct f2fs_inode *i)
return ALIGN_DOWN(DEF_ADDRS_PER_BLOCK, 1 << i->i_log_cluster_size);
}
+unsigned int f2fs_max_file_offset(struct f2fs_inode *i)
+{
+ if (!LINUX_S_ISREG(le16_to_cpu(i->i_mode)) ||
+ !(le32_to_cpu(i->i_flags) & F2FS_COMPR_FL))
+ return le64_to_cpu(i->i_size);
+ return ALIGN_UP(le64_to_cpu(i->i_size), 1 << i->i_log_cluster_size);
+}
+
/*
* CRC32
*/
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 dump out.
.BI \-n " NAT range"
Specify a range presented by nids to dump NAT entries.
.TP
+.BI \-M " Block map"
+Show all the allocated block addresses given inode number.
+.TP
.BI \-s " SIT range"
Specify a range presented by segment numbers to dump SIT entries.
.TP
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.288.g62a8d224e6-goog
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
next prev parent reply other threads:[~2021-06-23 16:04 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-21 2:39 [f2fs-dev] [PATCH 1/4] mkfs.f2fs: remove android features for RO Jaegeuk Kim
2021-06-21 2:39 ` [f2fs-dev] [PATCH 2/4] fsck|dump.f2fs: add -M to get file map Jaegeuk Kim
2021-06-23 14:28 ` Chao Yu
2021-06-23 16:04 ` Jaegeuk Kim [this message]
2021-07-08 6:30 ` [f2fs-dev] [PATCH 2/4 v2] " Chao Yu
2021-06-21 2:39 ` [f2fs-dev] [PATCH 3/4] f2fs-tools: fix wrong file offset Jaegeuk Kim
2021-06-23 14:47 ` Chao Yu
2021-06-23 16:03 ` Jaegeuk Kim
2021-06-21 2:39 ` [f2fs-dev] [PATCH 4/4] f2fs-tools: add extent cache for each file Jaegeuk Kim
2021-06-23 13:51 ` [f2fs-dev] [PATCH 1/4] mkfs.f2fs: remove android features for RO Chao Yu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YNNbk/AI2T6fkhLC@google.com \
--to=jaegeuk@kernel.org \
--cc=linux-f2fs-devel@lists.sourceforge.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.