aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJaegeuk Kim <jaegeuk@kernel.org>2015-03-26 21:27:56 -0700
committerDan Pasanen <dan.pasanen@gmail.com>2015-11-12 09:37:21 -0600
commit56800db4d5e09a3d159765364674261b874ef03d (patch)
tree7bfe0dfa4b179a10afa65e94604c11c0855a0a18
parent7e5acfbb1b3cfb46dda950ef0f0ed98e3f85016f (diff)
downloadandroid_external_f2fs-tools-56800db4d5e09a3d159765364674261b874ef03d.tar.gz
android_external_f2fs-tools-56800db4d5e09a3d159765364674261b874ef03d.tar.bz2
android_external_f2fs-tools-56800db4d5e09a3d159765364674261b874ef03d.zip
fsck.f2fs: return summary block pointer and types
This patch adds to return summry_block pointer to callers, which will be used when fixing them. Change-Id: I5ff2af3cd7c39cfbfa132fc008b2a68960f5ec29 Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
-rw-r--r--fsck/dump.c16
-rw-r--r--fsck/f2fs.h1
-rw-r--r--fsck/fsck.h4
-rw-r--r--fsck/mount.c45
4 files changed, 40 insertions, 26 deletions
diff --git a/fsck/dump.c b/fsck/dump.c
index 3c4a8d1..8698b28 100644
--- a/fsck/dump.c
+++ b/fsck/dump.c
@@ -15,11 +15,12 @@
#define BUF_SZ 80
-const char *seg_type_name[SEG_TYPE_MAX] = {
+const char *seg_type_name[SEG_TYPE_MAX + 1] = {
"SEG_TYPE_DATA",
"SEG_TYPE_CUR_DATA",
"SEG_TYPE_NODE",
"SEG_TYPE_CUR_NODE",
+ "SEG_TYPE_NONE",
};
void sit_dump(struct f2fs_sb_info *sbi, int start_sit, int end_sit)
@@ -65,7 +66,7 @@ void sit_dump(struct f2fs_sb_info *sbi, int start_sit, int end_sit)
void ssa_dump(struct f2fs_sb_info *sbi, int start_ssa, int end_ssa)
{
- struct f2fs_summary_block sum_blk;
+ struct f2fs_summary_block *sum_blk;
char buf[BUF_SZ];
int segno, i, ret;
int fd;
@@ -80,7 +81,7 @@ void ssa_dump(struct f2fs_sb_info *sbi, int start_ssa, int end_ssa)
ASSERT(ret >= 0);
for (segno = start_ssa; segno < end_ssa; segno++) {
- ret = get_sum_block(sbi, segno, &sum_blk);
+ sum_blk = get_sum_block(sbi, segno, &ret);
memset(buf, 0, BUF_SZ);
switch (ret) {
@@ -108,10 +109,13 @@ void ssa_dump(struct f2fs_sb_info *sbi, int start_ssa, int end_ssa)
ASSERT(ret >= 0);
}
snprintf(buf, BUF_SZ, "[%3d: %6x]", i,
- le32_to_cpu(sum_blk.entries[i].nid));
+ le32_to_cpu(sum_blk->entries[i].nid));
ret = write(fd, buf, strlen(buf));
ASSERT(ret >= 0);
}
+ if (ret == SEG_TYPE_NODE || ret == SEG_TYPE_DATA ||
+ ret == SEG_TYPE_MAX)
+ free(sum_blk);
}
close(fd);
}
@@ -418,7 +422,9 @@ int dump_info_from_blkaddr(struct f2fs_sb_info *sbi, u32 blk_addr)
DBG(1, " - Segno [0x%x]\n", GET_SEGNO(sbi, blk_addr));
DBG(1, " - Offset [0x%x]\n", OFFSET_IN_SEG(sbi, blk_addr));
DBG(1, "SUM.nid [0x%x]\n", nid);
- DBG(1, "SUM.type [%s]\n", seg_type_name[type]);
+ DBG(1, "SUM.type [%s]\n", type >= 0 ?
+ seg_type_name[type] :
+ "Broken");
DBG(1, "SUM.version [%d]\n", sum_entry.version);
DBG(1, "SUM.ofs_in_node [0x%x]\n", sum_entry.ofs_in_node);
DBG(1, "NAT.blkaddr [0x%x]\n", ni.blk_addr);
diff --git a/fsck/f2fs.h b/fsck/f2fs.h
index 246b510..034e0d1 100644
--- a/fsck/f2fs.h
+++ b/fsck/f2fs.h
@@ -384,5 +384,6 @@ static inline void node_info_from_raw_nat(struct node_info *ni,
extern int lookup_nat_in_journal(struct f2fs_sb_info *sbi, u32 nid, struct f2fs_nat_entry *ne);
#define IS_SUM_NODE_SEG(footer) (footer.entry_type == SUM_TYPE_NODE)
+#define IS_SUM_DATA_SEG(footer) (footer.entry_type == SUM_TYPE_DATA)
#endif /* _F2FS_H_ */
diff --git a/fsck/fsck.h b/fsck/fsck.h
index 1c2ef94..ffb3ae2 100644
--- a/fsck/fsck.h
+++ b/fsck/fsck.h
@@ -101,8 +101,8 @@ void print_cp_state(u32);
extern void print_node_info(struct f2fs_node *);
extern void print_inode_info(struct f2fs_inode *, int);
extern struct seg_entry *get_seg_entry(struct f2fs_sb_info *, unsigned int);
-extern int get_sum_block(struct f2fs_sb_info *, unsigned int,
- struct f2fs_summary_block *);
+extern struct f2fs_summary_block *get_sum_block(struct f2fs_sb_info *,
+ unsigned int, int *);
extern int get_sum_entry(struct f2fs_sb_info *, u32, struct f2fs_summary *);
extern void get_node_info(struct f2fs_sb_info *, nid_t, struct node_info *);
extern void nullify_nat_entry(struct f2fs_sb_info *, u32);
diff --git a/fsck/mount.c b/fsck/mount.c
index dfaa596..f900dd7 100644
--- a/fsck/mount.c
+++ b/fsck/mount.c
@@ -845,14 +845,17 @@ struct seg_entry *get_seg_entry(struct f2fs_sb_info *sbi,
return &sit_i->sentries[segno];
}
-int get_sum_block(struct f2fs_sb_info *sbi, unsigned int segno,
- struct f2fs_summary_block *sum_blk)
+struct f2fs_summary_block *get_sum_block(struct f2fs_sb_info *sbi,
+ unsigned int segno, int *ret_type)
{
struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
+ struct f2fs_summary_block *sum_blk;
struct curseg_info *curseg;
int type, ret;
u64 ssa_blk;
+ *ret_type= SEG_TYPE_MAX;
+
ssa_blk = GET_SUM_BLKADDR(sbi, segno);
for (type = 0; type < NR_CURSEG_NODE_TYPE; type++) {
if (segno == ckpt->cur_node_segno[type]) {
@@ -861,10 +864,11 @@ int get_sum_block(struct f2fs_sb_info *sbi, unsigned int segno,
ASSERT_MSG("segno [0x%x] indicates a data "
"segment, but should be node",
segno);
- return -EINVAL;
+ *ret_type = -SEG_TYPE_CUR_NODE;
+ } else {
+ *ret_type = SEG_TYPE_CUR_NODE;
}
- memcpy(sum_blk, curseg->sum_blk, BLOCK_SZ);
- return SEG_TYPE_CUR_NODE;
+ return curseg->sum_blk;
}
}
@@ -875,23 +879,26 @@ int get_sum_block(struct f2fs_sb_info *sbi, unsigned int segno,
ASSERT_MSG("segno [0x%x] indicates a node "
"segment, but should be data",
segno);
- return -EINVAL;
+ *ret_type = -SEG_TYPE_CUR_DATA;
+ } else {
+ *ret_type = SEG_TYPE_CUR_DATA;
}
- DBG(2, "segno [0x%x] is current data seg[0x%x]\n",
- segno, type);
- memcpy(sum_blk, curseg->sum_blk, BLOCK_SZ);
- return SEG_TYPE_CUR_DATA;
+ return curseg->sum_blk;
}
}
+ sum_blk = calloc(BLOCK_SZ, 1);
+ ASSERT(sum_blk);
+
ret = dev_read_block(sum_blk, ssa_blk);
ASSERT(ret >= 0);
if (IS_SUM_NODE_SEG(sum_blk->footer))
- return SEG_TYPE_NODE;
- else
- return SEG_TYPE_DATA;
+ *ret_type = SEG_TYPE_NODE;
+ else if (IS_SUM_DATA_SEG(sum_blk->footer))
+ *ret_type = SEG_TYPE_DATA;
+ return sum_blk;
}
int get_sum_entry(struct f2fs_sb_info *sbi, u32 blk_addr,
@@ -899,18 +906,18 @@ int get_sum_entry(struct f2fs_sb_info *sbi, u32 blk_addr,
{
struct f2fs_summary_block *sum_blk;
u32 segno, offset;
- int ret;
+ int type;
segno = GET_SEGNO(sbi, blk_addr);
offset = OFFSET_IN_SEG(sbi, blk_addr);
- sum_blk = calloc(BLOCK_SZ, 1);
-
- ret = get_sum_block(sbi, segno, sum_blk);
+ sum_blk = get_sum_block(sbi, segno, &type);
memcpy(sum_entry, &(sum_blk->entries[offset]),
sizeof(struct f2fs_summary));
- free(sum_blk);
- return ret;
+ if (type == SEG_TYPE_NODE || type == SEG_TYPE_DATA ||
+ type == SEG_TYPE_MAX)
+ free(sum_blk);
+ return type;
}
static void get_nat_entry(struct f2fs_sb_info *sbi, nid_t nid,