* [PATCH 1/5] f2fs: support superblock checksum
@ 2018-09-28 12:25 Junling Zheng
2018-09-28 12:25 ` [PATCH 2/5] f2fs-tools: rename CHECKSUM_OFFSET to CP_CHKSUM_OFFSET Junling Zheng
` (3 more replies)
0 siblings, 4 replies; 14+ messages in thread
From: Junling Zheng @ 2018-09-28 12:25 UTC (permalink / raw)
To: jaegeuk, yuchao0; +Cc: miaoxie, linux-f2fs-devel
Now we support crc32 checksum for superblock.
Reviewed-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Junling Zheng <zhengjunling@huawei.com>
---
fs/f2fs/f2fs.h | 2 ++
fs/f2fs/super.c | 29 +++++++++++++++++++++++++++++
fs/f2fs/sysfs.c | 7 +++++++
include/linux/f2fs_fs.h | 3 ++-
4 files changed, 40 insertions(+), 1 deletion(-)
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index 4525f4f82af0..d50d6efda96b 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -147,6 +147,7 @@ struct f2fs_mount_info {
#define F2FS_FEATURE_INODE_CRTIME 0x0100
#define F2FS_FEATURE_LOST_FOUND 0x0200
#define F2FS_FEATURE_VERITY 0x0400 /* reserved */
+#define F2FS_FEATURE_SB_CHKSUM 0x0800
#define F2FS_HAS_FEATURE(sb, mask) \
((F2FS_SB(sb)->raw_super->feature & cpu_to_le32(mask)) != 0)
@@ -3376,6 +3377,7 @@ F2FS_FEATURE_FUNCS(flexible_inline_xattr, FLEXIBLE_INLINE_XATTR);
F2FS_FEATURE_FUNCS(quota_ino, QUOTA_INO);
F2FS_FEATURE_FUNCS(inode_crtime, INODE_CRTIME);
F2FS_FEATURE_FUNCS(lost_found, LOST_FOUND);
+F2FS_FEATURE_FUNCS(sb_chksum, SB_CHKSUM);
#ifdef CONFIG_BLK_DEV_ZONED
static inline int get_blkz_type(struct f2fs_sb_info *sbi,
diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
index bd57be470e23..3ffc336caea8 100644
--- a/fs/f2fs/super.c
+++ b/fs/f2fs/super.c
@@ -2149,6 +2149,26 @@ static int sanity_check_raw_super(struct f2fs_sb_info *sbi,
(bh->b_data + F2FS_SUPER_OFFSET);
struct super_block *sb = sbi->sb;
unsigned int blocksize;
+ size_t crc_offset = 0;
+ __u32 crc = 0;
+
+ /* Check checksum_offset and crc in superblock */
+ if (le32_to_cpu(raw_super->feature) & F2FS_FEATURE_SB_CHKSUM) {
+ crc_offset = le32_to_cpu(raw_super->checksum_offset);
+ if (crc_offset !=
+ offsetof(struct f2fs_super_block, crc)) {
+ f2fs_msg(sb, KERN_INFO,
+ "Invalid SB checksum offset: %zu",
+ crc_offset);
+ return 1;
+ }
+ crc = le32_to_cpu(raw_super->crc);
+ if (!f2fs_crc_valid(sbi, crc, raw_super, crc_offset)) {
+ f2fs_msg(sb, KERN_INFO,
+ "Invalid SB checksum value: %u", crc);
+ return 1;
+ }
+ }
if (F2FS_SUPER_MAGIC != le32_to_cpu(raw_super->magic)) {
f2fs_msg(sb, KERN_INFO,
@@ -2568,6 +2588,7 @@ static int read_raw_super_block(struct f2fs_sb_info *sbi,
int f2fs_commit_super(struct f2fs_sb_info *sbi, bool recover)
{
struct buffer_head *bh;
+ __u32 crc = 0;
int err;
if ((recover && f2fs_readonly(sbi->sb)) ||
@@ -2576,6 +2597,13 @@ int f2fs_commit_super(struct f2fs_sb_info *sbi, bool recover)
return -EROFS;
}
+ /* we should update superblock crc here */
+ if (!recover && f2fs_sb_has_sb_chksum(sbi->sb)) {
+ crc = f2fs_crc32(sbi, F2FS_RAW_SUPER(sbi),
+ offsetof(struct f2fs_super_block, crc));
+ F2FS_RAW_SUPER(sbi)->crc = cpu_to_le32(crc);
+ }
+
/* write back-up superblock first */
bh = sb_bread(sbi->sb, sbi->valid_super_block ? 0 : 1);
if (!bh)
diff --git a/fs/f2fs/sysfs.c b/fs/f2fs/sysfs.c
index cd2e030e47b8..c86d91be6c48 100644
--- a/fs/f2fs/sysfs.c
+++ b/fs/f2fs/sysfs.c
@@ -120,6 +120,9 @@ static ssize_t features_show(struct f2fs_attr *a,
if (f2fs_sb_has_lost_found(sb))
len += snprintf(buf + len, PAGE_SIZE - len, "%s%s",
len ? ", " : "", "lost_found");
+ if (f2fs_sb_has_sb_chksum(sb))
+ len += snprintf(buf + len, PAGE_SIZE - len, "%s%s",
+ len ? ", " : "", "sb_checksum");
len += snprintf(buf + len, PAGE_SIZE - len, "\n");
return len;
}
@@ -337,6 +340,7 @@ enum feat_id {
FEAT_QUOTA_INO,
FEAT_INODE_CRTIME,
FEAT_LOST_FOUND,
+ FEAT_SB_CHECKSUM,
};
static ssize_t f2fs_feature_show(struct f2fs_attr *a,
@@ -353,6 +357,7 @@ static ssize_t f2fs_feature_show(struct f2fs_attr *a,
case FEAT_QUOTA_INO:
case FEAT_INODE_CRTIME:
case FEAT_LOST_FOUND:
+ case FEAT_SB_CHECKSUM:
return snprintf(buf, PAGE_SIZE, "supported\n");
}
return 0;
@@ -433,6 +438,7 @@ F2FS_FEATURE_RO_ATTR(flexible_inline_xattr, FEAT_FLEXIBLE_INLINE_XATTR);
F2FS_FEATURE_RO_ATTR(quota_ino, FEAT_QUOTA_INO);
F2FS_FEATURE_RO_ATTR(inode_crtime, FEAT_INODE_CRTIME);
F2FS_FEATURE_RO_ATTR(lost_found, FEAT_LOST_FOUND);
+F2FS_FEATURE_RO_ATTR(sb_checksum, FEAT_SB_CHECKSUM);
#define ATTR_LIST(name) (&f2fs_attr_##name.attr)
static struct attribute *f2fs_attrs[] = {
@@ -489,6 +495,7 @@ static struct attribute *f2fs_feat_attrs[] = {
ATTR_LIST(quota_ino),
ATTR_LIST(inode_crtime),
ATTR_LIST(lost_found),
+ ATTR_LIST(sb_checksum),
NULL,
};
diff --git a/include/linux/f2fs_fs.h b/include/linux/f2fs_fs.h
index f70f8ac9c4f4..aa4b586569c1 100644
--- a/include/linux/f2fs_fs.h
+++ b/include/linux/f2fs_fs.h
@@ -112,7 +112,8 @@ struct f2fs_super_block {
struct f2fs_device devs[MAX_DEVICES]; /* device list */
__le32 qf_ino[F2FS_MAX_QUOTAS]; /* quota inode numbers */
__u8 hot_ext_count; /* # of hot file extension */
- __u8 reserved[314]; /* valid reserved region */
+ __u8 reserved[310]; /* valid reserved region */
+ __le32 crc; /* checksum of superblock */
} __packed;
/*
--
2.18.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 2/5] f2fs-tools: rename CHECKSUM_OFFSET to CP_CHKSUM_OFFSET
2018-09-28 12:25 [PATCH 1/5] f2fs: support superblock checksum Junling Zheng
@ 2018-09-28 12:25 ` Junling Zheng
2018-09-28 12:25 ` [PATCH v2 3/5] fsck.f2fs: unify the updating of superblocks Junling Zheng
` (2 subsequent siblings)
3 siblings, 0 replies; 14+ messages in thread
From: Junling Zheng @ 2018-09-28 12:25 UTC (permalink / raw)
To: jaegeuk, yuchao0; +Cc: miaoxie, linux-f2fs-devel
This patch renamed CHECKSUM_OFFSET to CP_CHKSUM_OFFSET.
Reviewed-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Junling Zheng <zhengjunling@huawei.com>
---
fsck/fsck.c | 4 ++--
fsck/mount.c | 4 ++--
fsck/resize.c | 8 ++++----
include/f2fs_fs.h | 6 +++---
mkfs/f2fs_format.c | 14 +++++++-------
5 files changed, 18 insertions(+), 18 deletions(-)
diff --git a/fsck/fsck.c b/fsck/fsck.c
index d550403..f080d3c 100644
--- a/fsck/fsck.c
+++ b/fsck/fsck.c
@@ -2010,8 +2010,8 @@ static void fix_checkpoint(struct f2fs_sb_info *sbi)
set_cp(valid_node_count, fsck->chk.valid_node_cnt);
set_cp(valid_inode_count, fsck->chk.valid_inode_cnt);
- crc = f2fs_cal_crc32(F2FS_SUPER_MAGIC, cp, CHECKSUM_OFFSET);
- *((__le32 *)((unsigned char *)cp + CHECKSUM_OFFSET)) = cpu_to_le32(crc);
+ crc = f2fs_cal_crc32(F2FS_SUPER_MAGIC, cp, CP_CHKSUM_OFFSET);
+ *((__le32 *)((unsigned char *)cp + CP_CHKSUM_OFFSET)) = cpu_to_le32(crc);
cp_blk_no = get_sb(cp_blkaddr);
if (sbi->cur_cp == 2)
diff --git a/fsck/mount.c b/fsck/mount.c
index 2c2473d..1daef75 100644
--- a/fsck/mount.c
+++ b/fsck/mount.c
@@ -2252,8 +2252,8 @@ void write_checkpoint(struct f2fs_sb_info *sbi)
flags = update_nat_bits_flags(sb, cp, flags);
set_cp(ckpt_flags, flags);
- crc = f2fs_cal_crc32(F2FS_SUPER_MAGIC, cp, CHECKSUM_OFFSET);
- *((__le32 *)((unsigned char *)cp + CHECKSUM_OFFSET)) = cpu_to_le32(crc);
+ crc = f2fs_cal_crc32(F2FS_SUPER_MAGIC, cp, CP_CHKSUM_OFFSET);
+ *((__le32 *)((unsigned char *)cp + CP_CHKSUM_OFFSET)) = cpu_to_le32(crc);
cp_blk_no = get_sb(cp_blkaddr);
if (sbi->cur_cp == 2)
diff --git a/fsck/resize.c b/fsck/resize.c
index fe8a61a..e9612b3 100644
--- a/fsck/resize.c
+++ b/fsck/resize.c
@@ -90,10 +90,10 @@ static int get_new_sb(struct f2fs_super_block *sb)
* It requires more pages for cp.
*/
if (max_sit_bitmap_size > MAX_SIT_BITMAP_SIZE_IN_CKPT) {
- max_nat_bitmap_size = CHECKSUM_OFFSET - sizeof(struct f2fs_checkpoint) + 1;
+ max_nat_bitmap_size = CP_CHKSUM_OFFSET - sizeof(struct f2fs_checkpoint) + 1;
set_sb(cp_payload, F2FS_BLK_ALIGN(max_sit_bitmap_size));
} else {
- max_nat_bitmap_size = CHECKSUM_OFFSET - sizeof(struct f2fs_checkpoint) + 1
+ max_nat_bitmap_size = CP_CHKSUM_OFFSET - sizeof(struct f2fs_checkpoint) + 1
- max_sit_bitmap_size;
set_sb(cp_payload, 0);
}
@@ -520,8 +520,8 @@ static void rebuild_checkpoint(struct f2fs_sb_info *sbi,
(unsigned char *)cp);
new_cp->checkpoint_ver = cpu_to_le64(cp_ver + 1);
- crc = f2fs_cal_crc32(F2FS_SUPER_MAGIC, new_cp, CHECKSUM_OFFSET);
- *((__le32 *)((unsigned char *)new_cp + CHECKSUM_OFFSET)) =
+ crc = f2fs_cal_crc32(F2FS_SUPER_MAGIC, new_cp, CP_CHKSUM_OFFSET);
+ *((__le32 *)((unsigned char *)new_cp + CP_CHKSUM_OFFSET)) =
cpu_to_le32(crc);
/* Write a new checkpoint in the other set */
diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
index 2c086a9..38a0da4 100644
--- a/include/f2fs_fs.h
+++ b/include/f2fs_fs.h
@@ -278,7 +278,7 @@ static inline uint64_t bswap_64(uint64_t val)
#define PAGE_CACHE_SIZE 4096
#define BITS_PER_BYTE 8
#define F2FS_SUPER_MAGIC 0xF2F52010 /* F2FS Magic Number */
-#define CHECKSUM_OFFSET 4092
+#define CP_CHKSUM_OFFSET 4092
#define MAX_PATH_LEN 64
#define MAX_DEVICES 8
@@ -682,9 +682,9 @@ struct f2fs_checkpoint {
} __attribute__((packed));
#define MAX_SIT_BITMAP_SIZE_IN_CKPT \
- (CHECKSUM_OFFSET - sizeof(struct f2fs_checkpoint) + 1 - 64)
+ (CP_CHKSUM_OFFSET - sizeof(struct f2fs_checkpoint) + 1 - 64)
#define MAX_BITMAP_SIZE_IN_CKPT \
- (CHECKSUM_OFFSET - sizeof(struct f2fs_checkpoint) + 1)
+ (CP_CHKSUM_OFFSET - sizeof(struct f2fs_checkpoint) + 1)
/*
* For orphan inode management
diff --git a/mkfs/f2fs_format.c b/mkfs/f2fs_format.c
index 4b88d93..621126c 100644
--- a/mkfs/f2fs_format.c
+++ b/mkfs/f2fs_format.c
@@ -342,12 +342,12 @@ static int f2fs_prepare_super_block(void)
* It requires more pages for cp.
*/
if (max_sit_bitmap_size > MAX_SIT_BITMAP_SIZE_IN_CKPT) {
- max_nat_bitmap_size = CHECKSUM_OFFSET -
+ max_nat_bitmap_size = CP_CHKSUM_OFFSET -
sizeof(struct f2fs_checkpoint) + 1;
set_sb(cp_payload, F2FS_BLK_ALIGN(max_sit_bitmap_size));
} else {
max_nat_bitmap_size =
- CHECKSUM_OFFSET - sizeof(struct f2fs_checkpoint) + 1
+ CP_CHKSUM_OFFSET - sizeof(struct f2fs_checkpoint) + 1
- max_sit_bitmap_size;
set_sb(cp_payload, 0);
}
@@ -684,10 +684,10 @@ static int f2fs_write_check_point_pack(void)
set_cp(nat_ver_bitmap_bytesize, ((get_sb(segment_count_nat) / 2) <<
get_sb(log_blocks_per_seg)) / 8);
- set_cp(checksum_offset, CHECKSUM_OFFSET);
+ set_cp(checksum_offset, CP_CHKSUM_OFFSET);
- crc = f2fs_cal_crc32(F2FS_SUPER_MAGIC, cp, CHECKSUM_OFFSET);
- *((__le32 *)((unsigned char *)cp + CHECKSUM_OFFSET)) =
+ crc = f2fs_cal_crc32(F2FS_SUPER_MAGIC, cp, CP_CHKSUM_OFFSET);
+ *((__le32 *)((unsigned char *)cp + CP_CHKSUM_OFFSET)) =
cpu_to_le32(crc);
blk_size_bytes = 1 << get_sb(log_blocksize);
@@ -932,8 +932,8 @@ static int f2fs_write_check_point_pack(void)
*/
cp->checkpoint_ver = 0;
- crc = f2fs_cal_crc32(F2FS_SUPER_MAGIC, cp, CHECKSUM_OFFSET);
- *((__le32 *)((unsigned char *)cp + CHECKSUM_OFFSET)) =
+ crc = f2fs_cal_crc32(F2FS_SUPER_MAGIC, cp, CP_CHKSUM_OFFSET);
+ *((__le32 *)((unsigned char *)cp + CP_CHKSUM_OFFSET)) =
cpu_to_le32(crc);
cp_seg_blk = get_sb(segment0_blkaddr) + c.blks_per_seg;
DBG(1, "\tWriting cp page 1 of checkpoint pack 2, at offset 0x%08"PRIx64"\n",
--
2.19.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 3/5] fsck.f2fs: unify the updating of superblocks
2018-09-28 12:25 [PATCH 1/5] f2fs: support superblock checksum Junling Zheng
2018-09-28 12:25 ` [PATCH 2/5] f2fs-tools: rename CHECKSUM_OFFSET to CP_CHKSUM_OFFSET Junling Zheng
@ 2018-09-28 12:25 ` Junling Zheng
2018-09-28 12:25 ` [PATCH 4/5] f2fs-tools: introduce sb checksum Junling Zheng
2018-09-28 12:26 ` [PATCH 5/5] fsck.f2fs: try to recover cp_payload from valid cp pack Junling Zheng
3 siblings, 0 replies; 14+ messages in thread
From: Junling Zheng @ 2018-09-28 12:25 UTC (permalink / raw)
To: jaegeuk, yuchao0; +Cc: miaoxie, linux-f2fs-devel
Rename write_superblock() to update_superblock() and make it support updating
specified one superblock or both two superblocks, then unify all places where
sb needs to be updated.
Signed-off-by: Junling Zheng <zhengjunling@huawei.com>
---
Change log from v1:
- Rename enum SB_ADDR members and define SB_MASK(i).
fsck/fsck.h | 12 ++++++-
fsck/mount.c | 94 +++++++++++++++++++--------------------------------
fsck/resize.c | 20 ++---------
3 files changed, 47 insertions(+), 79 deletions(-)
diff --git a/fsck/fsck.h b/fsck/fsck.h
index 6042e68..bdd7f8d 100644
--- a/fsck/fsck.h
+++ b/fsck/fsck.h
@@ -32,6 +32,15 @@ enum {
EUNKNOWN_ARG,
};
+enum SB_ADDR {
+ SB0_ADDR = 0,
+ SB1_ADDR,
+ SB_MAX_ADDR,
+};
+
+#define SB_MASK(i) (1 << i)
+#define SB_MASK_ALL (SB_MASK(SB0_ADDR) | SB_MASK(SB1_ADDR))
+
/* fsck.c */
struct orphan_info {
u32 nr_inodes;
@@ -178,7 +188,7 @@ extern void move_curseg_info(struct f2fs_sb_info *, u64, int);
extern void write_curseg_info(struct f2fs_sb_info *);
extern int find_next_free_block(struct f2fs_sb_info *, u64 *, int, int);
extern void write_checkpoint(struct f2fs_sb_info *);
-extern void write_superblock(struct f2fs_super_block *);
+extern void update_superblock(struct f2fs_super_block *, int);
extern void update_data_blkaddr(struct f2fs_sb_info *, nid_t, u16, block_t);
extern void update_nat_blkaddr(struct f2fs_sb_info *, nid_t, nid_t, block_t);
diff --git a/fsck/mount.c b/fsck/mount.c
index 1daef75..74ff7c6 100644
--- a/fsck/mount.c
+++ b/fsck/mount.c
@@ -475,8 +475,28 @@ void print_sb_state(struct f2fs_super_block *sb)
MSG(0, "\n");
}
+void update_superblock(struct f2fs_super_block *sb, int sb_mask)
+{
+ int addr, ret;
+ u_int8_t *buf;
+
+ buf = calloc(BLOCK_SZ, 1);
+ ASSERT(buf);
+
+ memcpy(buf + F2FS_SUPER_OFFSET, sb, sizeof(*sb));
+ for (addr = SB0_ADDR; addr < SB_MAX_ADDR; addr++) {
+ if (SB_MASK(addr) & sb_mask) {
+ ret = dev_write_block(buf, addr);
+ ASSERT(ret >= 0);
+ }
+ }
+
+ free(buf);
+ DBG(0, "Info: Done to update superblock\n");
+}
+
static inline int sanity_check_area_boundary(struct f2fs_super_block *sb,
- u64 offset)
+ enum SB_ADDR sb_addr)
{
u32 segment0_blkaddr = get_sb(segment0_blkaddr);
u32 cp_blkaddr = get_sb(cp_blkaddr);
@@ -542,14 +562,11 @@ static inline int sanity_check_area_boundary(struct f2fs_super_block *sb,
segment_count_main << log_blocks_per_seg);
return -1;
} else if (main_end_blkaddr < seg_end_blkaddr) {
- int err;
-
set_sb(segment_count, (main_end_blkaddr -
segment0_blkaddr) >> log_blocks_per_seg);
- err = dev_write(sb, offset, sizeof(struct f2fs_super_block));
- MSG(0, "Info: Fix alignment: %s, start(%u) end(%u) block(%u)\n",
- err ? "failed": "done",
+ update_superblock(sb, SB_MASK(sb_addr));
+ MSG(0, "Info: Fix alignment: start(%u) end(%u) block(%u)\n",
main_blkaddr,
segment0_blkaddr +
(segment_count << log_blocks_per_seg),
@@ -558,7 +575,7 @@ static inline int sanity_check_area_boundary(struct f2fs_super_block *sb,
return 0;
}
-int sanity_check_raw_super(struct f2fs_super_block *sb, u64 offset)
+int sanity_check_raw_super(struct f2fs_super_block *sb, enum SB_ADDR sb_addr)
{
unsigned int blocksize;
@@ -600,30 +617,24 @@ int sanity_check_raw_super(struct f2fs_super_block *sb, u64 offset)
if (get_sb(segment_count) > F2FS_MAX_SEGMENT)
return -1;
- if (sanity_check_area_boundary(sb, offset))
+ if (sanity_check_area_boundary(sb, sb_addr))
return -1;
return 0;
}
-int validate_super_block(struct f2fs_sb_info *sbi, int block)
+int validate_super_block(struct f2fs_sb_info *sbi, enum SB_ADDR sb_addr)
{
- u64 offset;
char buf[F2FS_BLKSIZE];
sbi->raw_super = malloc(sizeof(struct f2fs_super_block));
- if (block == 0)
- offset = F2FS_SUPER_OFFSET;
- else
- offset = F2FS_BLKSIZE + F2FS_SUPER_OFFSET;
-
- if (dev_read_block(buf, block))
+ if (dev_read_block(buf, sb_addr))
return -1;
memcpy(sbi->raw_super, buf + F2FS_SUPER_OFFSET,
sizeof(struct f2fs_super_block));
- if (!sanity_check_raw_super(sbi->raw_super, offset)) {
+ if (!sanity_check_raw_super(sbi->raw_super, sb_addr)) {
/* get kernel version */
if (c.kd >= 0) {
dev_read_version(c.version, 0, VERSION_LEN);
@@ -642,13 +653,9 @@ int validate_super_block(struct f2fs_sb_info *sbi, int block)
MSG(0, "Info: FSCK version\n from \"%s\"\n to \"%s\"\n",
c.sb_version, c.version);
if (memcmp(c.sb_version, c.version, VERSION_LEN)) {
- int ret;
-
memcpy(sbi->raw_super->version,
c.version, VERSION_LEN);
- ret = dev_write(sbi->raw_super, offset,
- sizeof(struct f2fs_super_block));
- ASSERT(ret >= 0);
+ update_superblock(sbi->raw_super, SB_MASK(sb_addr));
c.auto_fix = 0;
c.fix_on = 1;
@@ -659,7 +666,7 @@ int validate_super_block(struct f2fs_sb_info *sbi, int block)
free(sbi->raw_super);
sbi->raw_super = NULL;
- MSG(0, "\tCan't find a valid F2FS superblock at 0x%x\n", block);
+ MSG(0, "\tCan't find a valid F2FS superblock at 0x%x\n", sb_addr);
return -EINVAL;
}
@@ -2295,23 +2302,6 @@ void write_checkpoint(struct f2fs_sb_info *sbi)
ASSERT(ret >= 0);
}
-void write_superblock(struct f2fs_super_block *new_sb)
-{
- int index, ret;
- u_int8_t *buf;
-
- buf = calloc(BLOCK_SZ, 1);
- ASSERT(buf);
-
- memcpy(buf + F2FS_SUPER_OFFSET, new_sb, sizeof(*new_sb));
- for (index = 0; index < 2; index++) {
- ret = dev_write_block(buf, index);
- ASSERT(ret >= 0);
- }
- free(buf);
- DBG(0, "Info: Done to rebuild superblock\n");
-}
-
void build_nat_area_bitmap(struct f2fs_sb_info *sbi)
{
struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA);
@@ -2450,9 +2440,7 @@ void build_nat_area_bitmap(struct f2fs_sb_info *sbi)
static int check_sector_size(struct f2fs_super_block *sb)
{
- int index;
u_int32_t log_sectorsize, log_sectors_per_block;
- u_int8_t *zero_buff;
log_sectorsize = log_base_2(c.sector_size);
log_sectors_per_block = log_base_2(c.sectors_per_blk);
@@ -2461,24 +2449,10 @@ static int check_sector_size(struct f2fs_super_block *sb)
log_sectors_per_block == get_sb(log_sectors_per_block))
return 0;
- zero_buff = calloc(F2FS_BLKSIZE, 1);
- ASSERT(zero_buff);
-
set_sb(log_sectorsize, log_sectorsize);
set_sb(log_sectors_per_block, log_sectors_per_block);
- memcpy(zero_buff + F2FS_SUPER_OFFSET, sb, sizeof(*sb));
- DBG(1, "\tWriting super block, at offset 0x%08x\n", 0);
- for (index = 0; index < 2; index++) {
- if (dev_write(zero_buff, index * F2FS_BLKSIZE, F2FS_BLKSIZE)) {
- MSG(1, "\tError: Failed while writing supe_blk "
- "on disk!!! index : %d\n", index);
- free(zero_buff);
- return -1;
- }
- }
-
- free(zero_buff);
+ update_superblock(sb, SB_MASK_ALL);
return 0;
}
@@ -2499,7 +2473,7 @@ static void tune_sb_features(struct f2fs_sb_info *sbi)
if (!sb_changed)
return;
- write_superblock(sb);
+ update_superblock(sb, SB_MASK_ALL);
}
int f2fs_do_mount(struct f2fs_sb_info *sbi)
@@ -2509,9 +2483,9 @@ int f2fs_do_mount(struct f2fs_sb_info *sbi)
int ret;
sbi->active_logs = NR_CURSEG_TYPE;
- ret = validate_super_block(sbi, 0);
+ ret = validate_super_block(sbi, SB0_ADDR);
if (ret) {
- ret = validate_super_block(sbi, 1);
+ ret = validate_super_block(sbi, SB1_ADDR);
if (ret)
return -1;
}
diff --git a/fsck/resize.c b/fsck/resize.c
index e9612b3..5161a1f 100644
--- a/fsck/resize.c
+++ b/fsck/resize.c
@@ -577,22 +577,6 @@ static void rebuild_checkpoint(struct f2fs_sb_info *sbi,
DBG(0, "Info: Done to rebuild checkpoint blocks\n");
}
-static void rebuild_superblock(struct f2fs_super_block *new_sb)
-{
- int index, ret;
- u_int8_t *buf;
-
- buf = calloc(BLOCK_SZ, 1);
-
- memcpy(buf + F2FS_SUPER_OFFSET, new_sb, sizeof(*new_sb));
- for (index = 0; index < 2; index++) {
- ret = dev_write_block(buf, index);
- ASSERT(ret >= 0);
- }
- free(buf);
- DBG(0, "Info: Done to rebuild superblock\n");
-}
-
static int f2fs_resize_grow(struct f2fs_sb_info *sbi)
{
struct f2fs_super_block *sb = F2FS_RAW_SUPER(sbi);
@@ -644,7 +628,7 @@ static int f2fs_resize_grow(struct f2fs_sb_info *sbi)
migrate_nat(sbi, new_sb);
migrate_sit(sbi, new_sb, offset_seg);
rebuild_checkpoint(sbi, new_sb, offset_seg);
- write_superblock(new_sb);
+ update_superblock(new_sb, SB_MASK_ALL);
return 0;
}
@@ -695,7 +679,7 @@ static int f2fs_resize_shrink(struct f2fs_sb_info *sbi)
return -ENOSPC;
}
- rebuild_superblock(new_sb);
+ update_superblock(new_sb, SB_MASK_ALL);
rebuild_checkpoint(sbi, new_sb, 0);
/*if (!c.safe_resize) {
migrate_sit(sbi, new_sb, offset_seg);
--
2.19.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 4/5] f2fs-tools: introduce sb checksum
2018-09-28 12:25 [PATCH 1/5] f2fs: support superblock checksum Junling Zheng
2018-09-28 12:25 ` [PATCH 2/5] f2fs-tools: rename CHECKSUM_OFFSET to CP_CHKSUM_OFFSET Junling Zheng
2018-09-28 12:25 ` [PATCH v2 3/5] fsck.f2fs: unify the updating of superblocks Junling Zheng
@ 2018-09-28 12:25 ` Junling Zheng
2018-09-28 12:26 ` [PATCH 5/5] fsck.f2fs: try to recover cp_payload from valid cp pack Junling Zheng
3 siblings, 0 replies; 14+ messages in thread
From: Junling Zheng @ 2018-09-28 12:25 UTC (permalink / raw)
To: jaegeuk, yuchao0; +Cc: miaoxie, linux-f2fs-devel
This patch introduced crc for superblock.
Signed-off-by: Junling Zheng <zhengjunling@huawei.com>
---
fsck/mount.c | 33 +++++++++++++++++++++++++++++++++
fsck/resize.c | 12 ++++++------
include/f2fs_fs.h | 6 +++++-
mkfs/f2fs_format.c | 8 ++++++++
4 files changed, 52 insertions(+), 7 deletions(-)
diff --git a/fsck/mount.c b/fsck/mount.c
index 74ff7c6..9019921 100644
--- a/fsck/mount.c
+++ b/fsck/mount.c
@@ -340,6 +340,7 @@ void print_raw_sb_info(struct f2fs_super_block *sb)
DISP_u32(sb, node_ino);
DISP_u32(sb, meta_ino);
DISP_u32(sb, cp_payload);
+ DISP_u32(sb, crc);
DISP("%-.256s", sb, version);
printf("\n");
}
@@ -467,6 +468,9 @@ void print_sb_state(struct f2fs_super_block *sb)
if (f & cpu_to_le32(F2FS_FEATURE_LOST_FOUND)) {
MSG(0, "%s", " lost_found");
}
+ if (f & cpu_to_le32(F2FS_FEATURE_SB_CHKSUM)) {
+ MSG(0, "%s", " sb_checksum");
+ }
MSG(0, "\n");
MSG(0, "Info: superblock encrypt level = %d, salt = ",
sb->encryption_level);
@@ -479,10 +483,20 @@ void update_superblock(struct f2fs_super_block *sb, int sb_mask)
{
int addr, ret;
u_int8_t *buf;
+ u32 old_crc, new_crc;
buf = calloc(BLOCK_SZ, 1);
ASSERT(buf);
+ if (get_sb(feature) & F2FS_FEATURE_SB_CHKSUM) {
+ old_crc = get_sb(crc);
+ new_crc = f2fs_cal_crc32(F2FS_SUPER_MAGIC, sb,
+ SB_CHKSUM_OFFSET);
+ set_sb(crc, new_crc);
+ MSG(1, "Info: SB CRC is updated (0x%x -> 0x%x)\n",
+ old_crc, new_crc);
+ }
+
memcpy(buf + F2FS_SUPER_OFFSET, sb, sizeof(*sb));
for (addr = SB0_ADDR; addr < SB_MAX_ADDR; addr++) {
if (SB_MASK(addr) & sb_mask) {
@@ -575,10 +589,29 @@ static inline int sanity_check_area_boundary(struct f2fs_super_block *sb,
return 0;
}
+static int verify_sb_chksum(struct f2fs_super_block *sb)
+{
+ if (SB_CHKSUM_OFFSET != get_sb(checksum_offset)) {
+ MSG(0, "\tInvalid SB CRC offset: %u\n",
+ get_sb(checksum_offset));
+ return -1;
+ }
+ if (f2fs_crc_valid(get_sb(crc), sb,
+ get_sb(checksum_offset))) {
+ MSG(0, "\tInvalid SB CRC: 0x%x\n", get_sb(crc));
+ return -1;
+ }
+ return 0;
+}
+
int sanity_check_raw_super(struct f2fs_super_block *sb, enum SB_ADDR sb_addr)
{
unsigned int blocksize;
+ if ((get_sb(feature) & F2FS_FEATURE_SB_CHKSUM) &&
+ verify_sb_chksum(sb))
+ return -1;
+
if (F2FS_SUPER_MAGIC != get_sb(magic))
return -1;
diff --git a/fsck/resize.c b/fsck/resize.c
index 5161a1f..3462165 100644
--- a/fsck/resize.c
+++ b/fsck/resize.c
@@ -603,9 +603,6 @@ static int f2fs_resize_grow(struct f2fs_sb_info *sbi)
}
}
- print_raw_sb_info(sb);
- print_raw_sb_info(new_sb);
-
old_main_blkaddr = get_sb(main_blkaddr);
new_main_blkaddr = get_newsb(main_blkaddr);
offset = new_main_blkaddr - old_main_blkaddr;
@@ -629,6 +626,9 @@ static int f2fs_resize_grow(struct f2fs_sb_info *sbi)
migrate_sit(sbi, new_sb, offset_seg);
rebuild_checkpoint(sbi, new_sb, offset_seg);
update_superblock(new_sb, SB_MASK_ALL);
+ print_raw_sb_info(sb);
+ print_raw_sb_info(new_sb);
+
return 0;
}
@@ -658,9 +658,6 @@ static int f2fs_resize_shrink(struct f2fs_sb_info *sbi)
}
}
- print_raw_sb_info(sb);
- print_raw_sb_info(new_sb);
-
old_main_blkaddr = get_sb(main_blkaddr);
new_main_blkaddr = get_newsb(main_blkaddr);
offset = old_main_blkaddr - new_main_blkaddr;
@@ -690,6 +687,9 @@ static int f2fs_resize_shrink(struct f2fs_sb_info *sbi)
/* move whole data region */
//if (err)
// migrate_main(sbi, offset);
+ print_raw_sb_info(sb);
+ print_raw_sb_info(new_sb);
+
return 0;
}
diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
index 38a0da4..f80632a 100644
--- a/include/f2fs_fs.h
+++ b/include/f2fs_fs.h
@@ -279,6 +279,7 @@ static inline uint64_t bswap_64(uint64_t val)
#define BITS_PER_BYTE 8
#define F2FS_SUPER_MAGIC 0xF2F52010 /* F2FS Magic Number */
#define CP_CHKSUM_OFFSET 4092
+#define SB_CHKSUM_OFFSET 3068
#define MAX_PATH_LEN 64
#define MAX_DEVICES 8
@@ -579,6 +580,7 @@ enum {
#define F2FS_FEATURE_INODE_CRTIME 0x0100
#define F2FS_FEATURE_LOST_FOUND 0x0200
#define F2FS_FEATURE_VERITY 0x0400 /* reserved */
+#define F2FS_FEATURE_SB_CHKSUM 0x0800
#define MAX_VOLUME_NAME 512
@@ -632,7 +634,8 @@ struct f2fs_super_block {
struct f2fs_device devs[MAX_DEVICES]; /* device list */
__le32 qf_ino[F2FS_MAX_QUOTAS]; /* quota inode numbers */
__u8 hot_ext_count; /* # of hot file extension */
- __u8 reserved[314]; /* valid reserved region */
+ __u8 reserved[310]; /* valid reserved region */
+ __le32 crc; /* checksum of superblock */
} __attribute__((packed));
/*
@@ -1338,6 +1341,7 @@ struct feature feature_table[] = { \
{ "inode_crtime", F2FS_FEATURE_INODE_CRTIME }, \
{ "lost_found", F2FS_FEATURE_LOST_FOUND }, \
{ "verity", F2FS_FEATURE_VERITY }, /* reserved */ \
+ { "sb_checksum", F2FS_FEATURE_SB_CHKSUM }, \
{ NULL, 0x0}, \
};
diff --git a/mkfs/f2fs_format.c b/mkfs/f2fs_format.c
index 621126c..9b0a0d1 100644
--- a/mkfs/f2fs_format.c
+++ b/mkfs/f2fs_format.c
@@ -504,6 +504,14 @@ static int f2fs_prepare_super_block(void)
sb->feature = c.feature;
+ if (get_sb(feature) & F2FS_FEATURE_SB_CHKSUM) {
+ set_sb(checksum_offset, SB_CHKSUM_OFFSET);
+ set_sb(crc, f2fs_cal_crc32(F2FS_SUPER_MAGIC, sb,
+ SB_CHKSUM_OFFSET));
+ MSG(1, "Info: SB CRC is set: offset (%d), crc (0x%x)\n",
+ get_sb(checksum_offset), get_sb(crc));
+ }
+
return 0;
}
--
2.19.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 5/5] fsck.f2fs: try to recover cp_payload from valid cp pack
2018-09-28 12:25 [PATCH 1/5] f2fs: support superblock checksum Junling Zheng
` (2 preceding siblings ...)
2018-09-28 12:25 ` [PATCH 4/5] f2fs-tools: introduce sb checksum Junling Zheng
@ 2018-09-28 12:26 ` Junling Zheng
3 siblings, 0 replies; 14+ messages in thread
From: Junling Zheng @ 2018-09-28 12:26 UTC (permalink / raw)
To: jaegeuk, yuchao0; +Cc: miaoxie, linux-f2fs-devel
From: Chao Yu <yuchao0@huawei.com>
If sb checksum is not enabled, and cp pack is valid due to no
crc inconsistence, let's try to recover cp_payload based on
cp_pack_start_sum in cp pack.
Signed-off-by: Chao Yu <yuchao0@huawei.com>
---
fsck/f2fs.h | 5 +++++
fsck/mount.c | 10 +++++++---
2 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/fsck/f2fs.h b/fsck/f2fs.h
index d216444..0d0d5e2 100644
--- a/fsck/f2fs.h
+++ b/fsck/f2fs.h
@@ -259,6 +259,11 @@ static inline unsigned long __bitmap_size(struct f2fs_sb_info *sbi, int flag)
return 0;
}
+static inline block_t __cp_payload(struct f2fs_sb_info *sbi)
+{
+ return le32_to_cpu(F2FS_RAW_SUPER(sbi)->cp_payload);
+}
+
static inline void *__bitmap_ptr(struct f2fs_sb_info *sbi, int flag)
{
struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
diff --git a/fsck/mount.c b/fsck/mount.c
index 9019921..0e8fa41 100644
--- a/fsck/mount.c
+++ b/fsck/mount.c
@@ -975,12 +975,16 @@ int sanity_check_ckpt(struct f2fs_sb_info *sbi)
}
cp_pack_start_sum = __start_sum_addr(sbi);
- cp_payload = get_sb(cp_payload);
+ cp_payload = __cp_payload(sbi);
if (cp_pack_start_sum < cp_payload + 1 ||
cp_pack_start_sum > blocks_per_seg - 1 -
NR_CURSEG_TYPE) {
- MSG(0, "\tWrong cp_pack_start_sum(%u)\n", cp_pack_start_sum);
- return 1;
+ MSG(0, "\tWrong cp_pack_start_sum(%u) or cp_payload(%u)\n",
+ cp_pack_start_sum, cp_payload);
+ if ((get_sb(feature) & F2FS_FEATURE_SB_CHKSUM))
+ return 1;
+ set_sb(cp_payload, cp_pack_start_sum - 1);
+ update_superblock(sb, SB_MASK_ALL);
}
return 0;
--
2.19.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 1/5] f2fs: support superblock checksum
@ 2018-09-19 13:53 Junling Zheng
2018-09-19 13:53 ` [PATCH 4/5] f2fs-tools: introduce sb checksum Junling Zheng
0 siblings, 1 reply; 14+ messages in thread
From: Junling Zheng @ 2018-09-19 13:53 UTC (permalink / raw)
To: jaegeuk, yuchao0; +Cc: miaoxie, linux-f2fs-devel
Now we support crc32 checksum for superblock.
Reviewed-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Junling Zheng <zhengjunling@huawei.com>
---
fs/f2fs/f2fs.h | 2 ++
fs/f2fs/super.c | 29 +++++++++++++++++++++++++++++
fs/f2fs/sysfs.c | 7 +++++++
include/linux/f2fs_fs.h | 3 ++-
4 files changed, 40 insertions(+), 1 deletion(-)
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index 4525f4f82af0..d50d6efda96b 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -147,6 +147,7 @@ struct f2fs_mount_info {
#define F2FS_FEATURE_INODE_CRTIME 0x0100
#define F2FS_FEATURE_LOST_FOUND 0x0200
#define F2FS_FEATURE_VERITY 0x0400 /* reserved */
+#define F2FS_FEATURE_SB_CHKSUM 0x0800
#define F2FS_HAS_FEATURE(sb, mask) \
((F2FS_SB(sb)->raw_super->feature & cpu_to_le32(mask)) != 0)
@@ -3376,6 +3377,7 @@ F2FS_FEATURE_FUNCS(flexible_inline_xattr, FLEXIBLE_INLINE_XATTR);
F2FS_FEATURE_FUNCS(quota_ino, QUOTA_INO);
F2FS_FEATURE_FUNCS(inode_crtime, INODE_CRTIME);
F2FS_FEATURE_FUNCS(lost_found, LOST_FOUND);
+F2FS_FEATURE_FUNCS(sb_chksum, SB_CHKSUM);
#ifdef CONFIG_BLK_DEV_ZONED
static inline int get_blkz_type(struct f2fs_sb_info *sbi,
diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
index bd57be470e23..3ffc336caea8 100644
--- a/fs/f2fs/super.c
+++ b/fs/f2fs/super.c
@@ -2149,6 +2149,26 @@ static int sanity_check_raw_super(struct f2fs_sb_info *sbi,
(bh->b_data + F2FS_SUPER_OFFSET);
struct super_block *sb = sbi->sb;
unsigned int blocksize;
+ size_t crc_offset = 0;
+ __u32 crc = 0;
+
+ /* Check checksum_offset and crc in superblock */
+ if (le32_to_cpu(raw_super->feature) & F2FS_FEATURE_SB_CHKSUM) {
+ crc_offset = le32_to_cpu(raw_super->checksum_offset);
+ if (crc_offset !=
+ offsetof(struct f2fs_super_block, crc)) {
+ f2fs_msg(sb, KERN_INFO,
+ "Invalid SB checksum offset: %zu",
+ crc_offset);
+ return 1;
+ }
+ crc = le32_to_cpu(raw_super->crc);
+ if (!f2fs_crc_valid(sbi, crc, raw_super, crc_offset)) {
+ f2fs_msg(sb, KERN_INFO,
+ "Invalid SB checksum value: %u", crc);
+ return 1;
+ }
+ }
if (F2FS_SUPER_MAGIC != le32_to_cpu(raw_super->magic)) {
f2fs_msg(sb, KERN_INFO,
@@ -2568,6 +2588,7 @@ static int read_raw_super_block(struct f2fs_sb_info *sbi,
int f2fs_commit_super(struct f2fs_sb_info *sbi, bool recover)
{
struct buffer_head *bh;
+ __u32 crc = 0;
int err;
if ((recover && f2fs_readonly(sbi->sb)) ||
@@ -2576,6 +2597,13 @@ int f2fs_commit_super(struct f2fs_sb_info *sbi, bool recover)
return -EROFS;
}
+ /* we should update superblock crc here */
+ if (!recover && f2fs_sb_has_sb_chksum(sbi->sb)) {
+ crc = f2fs_crc32(sbi, F2FS_RAW_SUPER(sbi),
+ offsetof(struct f2fs_super_block, crc));
+ F2FS_RAW_SUPER(sbi)->crc = cpu_to_le32(crc);
+ }
+
/* write back-up superblock first */
bh = sb_bread(sbi->sb, sbi->valid_super_block ? 0 : 1);
if (!bh)
diff --git a/fs/f2fs/sysfs.c b/fs/f2fs/sysfs.c
index cd2e030e47b8..c86d91be6c48 100644
--- a/fs/f2fs/sysfs.c
+++ b/fs/f2fs/sysfs.c
@@ -120,6 +120,9 @@ static ssize_t features_show(struct f2fs_attr *a,
if (f2fs_sb_has_lost_found(sb))
len += snprintf(buf + len, PAGE_SIZE - len, "%s%s",
len ? ", " : "", "lost_found");
+ if (f2fs_sb_has_sb_chksum(sb))
+ len += snprintf(buf + len, PAGE_SIZE - len, "%s%s",
+ len ? ", " : "", "sb_checksum");
len += snprintf(buf + len, PAGE_SIZE - len, "\n");
return len;
}
@@ -337,6 +340,7 @@ enum feat_id {
FEAT_QUOTA_INO,
FEAT_INODE_CRTIME,
FEAT_LOST_FOUND,
+ FEAT_SB_CHECKSUM,
};
static ssize_t f2fs_feature_show(struct f2fs_attr *a,
@@ -353,6 +357,7 @@ static ssize_t f2fs_feature_show(struct f2fs_attr *a,
case FEAT_QUOTA_INO:
case FEAT_INODE_CRTIME:
case FEAT_LOST_FOUND:
+ case FEAT_SB_CHECKSUM:
return snprintf(buf, PAGE_SIZE, "supported\n");
}
return 0;
@@ -433,6 +438,7 @@ F2FS_FEATURE_RO_ATTR(flexible_inline_xattr, FEAT_FLEXIBLE_INLINE_XATTR);
F2FS_FEATURE_RO_ATTR(quota_ino, FEAT_QUOTA_INO);
F2FS_FEATURE_RO_ATTR(inode_crtime, FEAT_INODE_CRTIME);
F2FS_FEATURE_RO_ATTR(lost_found, FEAT_LOST_FOUND);
+F2FS_FEATURE_RO_ATTR(sb_checksum, FEAT_SB_CHECKSUM);
#define ATTR_LIST(name) (&f2fs_attr_##name.attr)
static struct attribute *f2fs_attrs[] = {
@@ -489,6 +495,7 @@ static struct attribute *f2fs_feat_attrs[] = {
ATTR_LIST(quota_ino),
ATTR_LIST(inode_crtime),
ATTR_LIST(lost_found),
+ ATTR_LIST(sb_checksum),
NULL,
};
diff --git a/include/linux/f2fs_fs.h b/include/linux/f2fs_fs.h
index f70f8ac9c4f4..aa4b586569c1 100644
--- a/include/linux/f2fs_fs.h
+++ b/include/linux/f2fs_fs.h
@@ -112,7 +112,8 @@ struct f2fs_super_block {
struct f2fs_device devs[MAX_DEVICES]; /* device list */
__le32 qf_ino[F2FS_MAX_QUOTAS]; /* quota inode numbers */
__u8 hot_ext_count; /* # of hot file extension */
- __u8 reserved[314]; /* valid reserved region */
+ __u8 reserved[310]; /* valid reserved region */
+ __le32 crc; /* checksum of superblock */
} __packed;
/*
--
2.18.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 4/5] f2fs-tools: introduce sb checksum
2018-09-19 13:53 [PATCH 1/5] f2fs: support superblock checksum Junling Zheng
@ 2018-09-19 13:53 ` Junling Zheng
2018-09-19 23:35 ` Jaegeuk Kim
0 siblings, 1 reply; 14+ messages in thread
From: Junling Zheng @ 2018-09-19 13:53 UTC (permalink / raw)
To: jaegeuk, yuchao0; +Cc: miaoxie, linux-f2fs-devel
This patch introduced crc for superblock.
Signed-off-by: Junling Zheng <zhengjunling@huawei.com>
---
fsck/mount.c | 33 +++++++++++++++++++++++++++++++++
fsck/resize.c | 12 ++++++------
include/f2fs_fs.h | 6 +++++-
mkfs/f2fs_format.c | 8 ++++++++
4 files changed, 52 insertions(+), 7 deletions(-)
diff --git a/fsck/mount.c b/fsck/mount.c
index 74ff7c6..9019921 100644
--- a/fsck/mount.c
+++ b/fsck/mount.c
@@ -340,6 +340,7 @@ void print_raw_sb_info(struct f2fs_super_block *sb)
DISP_u32(sb, node_ino);
DISP_u32(sb, meta_ino);
DISP_u32(sb, cp_payload);
+ DISP_u32(sb, crc);
DISP("%-.256s", sb, version);
printf("\n");
}
@@ -467,6 +468,9 @@ void print_sb_state(struct f2fs_super_block *sb)
if (f & cpu_to_le32(F2FS_FEATURE_LOST_FOUND)) {
MSG(0, "%s", " lost_found");
}
+ if (f & cpu_to_le32(F2FS_FEATURE_SB_CHKSUM)) {
+ MSG(0, "%s", " sb_checksum");
+ }
MSG(0, "\n");
MSG(0, "Info: superblock encrypt level = %d, salt = ",
sb->encryption_level);
@@ -479,10 +483,20 @@ void update_superblock(struct f2fs_super_block *sb, int sb_mask)
{
int index, ret;
u_int8_t *buf;
+ u32 old_crc, new_crc;
buf = calloc(BLOCK_SZ, 1);
ASSERT(buf);
+ if (get_sb(feature) & F2FS_FEATURE_SB_CHKSUM) {
+ old_crc = get_sb(crc);
+ new_crc = f2fs_cal_crc32(F2FS_SUPER_MAGIC, sb,
+ SB_CHKSUM_OFFSET);
+ set_sb(crc, new_crc);
+ MSG(1, "Info: SB CRC is updated (0x%x -> 0x%x)\n",
+ old_crc, new_crc);
+ }
+
memcpy(buf + F2FS_SUPER_OFFSET, sb, sizeof(*sb));
for (index = 0; index < SB_ADDR_MAX; index++) {
if ((1 << index) & sb_mask) {
@@ -575,10 +589,29 @@ static inline int sanity_check_area_boundary(struct f2fs_super_block *sb,
return 0;
}
+static int verify_sb_chksum(struct f2fs_super_block *sb)
+{
+ if (SB_CHKSUM_OFFSET != get_sb(checksum_offset)) {
+ MSG(0, "\tInvalid SB CRC offset: %u\n",
+ get_sb(checksum_offset));
+ return -1;
+ }
+ if (f2fs_crc_valid(get_sb(crc), sb,
+ get_sb(checksum_offset))) {
+ MSG(0, "\tInvalid SB CRC: 0x%x\n", get_sb(crc));
+ return -1;
+ }
+ return 0;
+}
+
int sanity_check_raw_super(struct f2fs_super_block *sb, enum SB_ADDR sb_addr)
{
unsigned int blocksize;
+ if ((get_sb(feature) & F2FS_FEATURE_SB_CHKSUM) &&
+ verify_sb_chksum(sb))
+ return -1;
+
if (F2FS_SUPER_MAGIC != get_sb(magic))
return -1;
diff --git a/fsck/resize.c b/fsck/resize.c
index 5161a1f..3462165 100644
--- a/fsck/resize.c
+++ b/fsck/resize.c
@@ -603,9 +603,6 @@ static int f2fs_resize_grow(struct f2fs_sb_info *sbi)
}
}
- print_raw_sb_info(sb);
- print_raw_sb_info(new_sb);
-
old_main_blkaddr = get_sb(main_blkaddr);
new_main_blkaddr = get_newsb(main_blkaddr);
offset = new_main_blkaddr - old_main_blkaddr;
@@ -629,6 +626,9 @@ static int f2fs_resize_grow(struct f2fs_sb_info *sbi)
migrate_sit(sbi, new_sb, offset_seg);
rebuild_checkpoint(sbi, new_sb, offset_seg);
update_superblock(new_sb, SB_ALL);
+ print_raw_sb_info(sb);
+ print_raw_sb_info(new_sb);
+
return 0;
}
@@ -658,9 +658,6 @@ static int f2fs_resize_shrink(struct f2fs_sb_info *sbi)
}
}
- print_raw_sb_info(sb);
- print_raw_sb_info(new_sb);
-
old_main_blkaddr = get_sb(main_blkaddr);
new_main_blkaddr = get_newsb(main_blkaddr);
offset = old_main_blkaddr - new_main_blkaddr;
@@ -690,6 +687,9 @@ static int f2fs_resize_shrink(struct f2fs_sb_info *sbi)
/* move whole data region */
//if (err)
// migrate_main(sbi, offset);
+ print_raw_sb_info(sb);
+ print_raw_sb_info(new_sb);
+
return 0;
}
diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
index 38a0da4..f80632a 100644
--- a/include/f2fs_fs.h
+++ b/include/f2fs_fs.h
@@ -279,6 +279,7 @@ static inline uint64_t bswap_64(uint64_t val)
#define BITS_PER_BYTE 8
#define F2FS_SUPER_MAGIC 0xF2F52010 /* F2FS Magic Number */
#define CP_CHKSUM_OFFSET 4092
+#define SB_CHKSUM_OFFSET 3068
#define MAX_PATH_LEN 64
#define MAX_DEVICES 8
@@ -579,6 +580,7 @@ enum {
#define F2FS_FEATURE_INODE_CRTIME 0x0100
#define F2FS_FEATURE_LOST_FOUND 0x0200
#define F2FS_FEATURE_VERITY 0x0400 /* reserved */
+#define F2FS_FEATURE_SB_CHKSUM 0x0800
#define MAX_VOLUME_NAME 512
@@ -632,7 +634,8 @@ struct f2fs_super_block {
struct f2fs_device devs[MAX_DEVICES]; /* device list */
__le32 qf_ino[F2FS_MAX_QUOTAS]; /* quota inode numbers */
__u8 hot_ext_count; /* # of hot file extension */
- __u8 reserved[314]; /* valid reserved region */
+ __u8 reserved[310]; /* valid reserved region */
+ __le32 crc; /* checksum of superblock */
} __attribute__((packed));
/*
@@ -1338,6 +1341,7 @@ struct feature feature_table[] = { \
{ "inode_crtime", F2FS_FEATURE_INODE_CRTIME }, \
{ "lost_found", F2FS_FEATURE_LOST_FOUND }, \
{ "verity", F2FS_FEATURE_VERITY }, /* reserved */ \
+ { "sb_checksum", F2FS_FEATURE_SB_CHKSUM }, \
{ NULL, 0x0}, \
};
diff --git a/mkfs/f2fs_format.c b/mkfs/f2fs_format.c
index 621126c..9b0a0d1 100644
--- a/mkfs/f2fs_format.c
+++ b/mkfs/f2fs_format.c
@@ -504,6 +504,14 @@ static int f2fs_prepare_super_block(void)
sb->feature = c.feature;
+ if (get_sb(feature) & F2FS_FEATURE_SB_CHKSUM) {
+ set_sb(checksum_offset, SB_CHKSUM_OFFSET);
+ set_sb(crc, f2fs_cal_crc32(F2FS_SUPER_MAGIC, sb,
+ SB_CHKSUM_OFFSET));
+ MSG(1, "Info: SB CRC is set: offset (%d), crc (0x%x)\n",
+ get_sb(checksum_offset), get_sb(crc));
+ }
+
return 0;
}
--
2.19.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH 4/5] f2fs-tools: introduce sb checksum
2018-09-19 13:53 ` [PATCH 4/5] f2fs-tools: introduce sb checksum Junling Zheng
@ 2018-09-19 23:35 ` Jaegeuk Kim
2018-09-20 2:17 ` Junling Zheng
0 siblings, 1 reply; 14+ messages in thread
From: Jaegeuk Kim @ 2018-09-19 23:35 UTC (permalink / raw)
To: Junling Zheng; +Cc: miaoxie, linux-f2fs-devel
On 09/19, Junling Zheng wrote:
> This patch introduced crc for superblock.
>
> Signed-off-by: Junling Zheng <zhengjunling@huawei.com>
> ---
> fsck/mount.c | 33 +++++++++++++++++++++++++++++++++
> fsck/resize.c | 12 ++++++------
> include/f2fs_fs.h | 6 +++++-
> mkfs/f2fs_format.c | 8 ++++++++
> 4 files changed, 52 insertions(+), 7 deletions(-)
>
> diff --git a/fsck/mount.c b/fsck/mount.c
> index 74ff7c6..9019921 100644
> --- a/fsck/mount.c
> +++ b/fsck/mount.c
> @@ -340,6 +340,7 @@ void print_raw_sb_info(struct f2fs_super_block *sb)
> DISP_u32(sb, node_ino);
> DISP_u32(sb, meta_ino);
> DISP_u32(sb, cp_payload);
> + DISP_u32(sb, crc);
> DISP("%-.256s", sb, version);
> printf("\n");
> }
> @@ -467,6 +468,9 @@ void print_sb_state(struct f2fs_super_block *sb)
> if (f & cpu_to_le32(F2FS_FEATURE_LOST_FOUND)) {
> MSG(0, "%s", " lost_found");
> }
> + if (f & cpu_to_le32(F2FS_FEATURE_SB_CHKSUM)) {
> + MSG(0, "%s", " sb_checksum");
> + }
> MSG(0, "\n");
> MSG(0, "Info: superblock encrypt level = %d, salt = ",
> sb->encryption_level);
> @@ -479,10 +483,20 @@ void update_superblock(struct f2fs_super_block *sb, int sb_mask)
> {
> int index, ret;
> u_int8_t *buf;
> + u32 old_crc, new_crc;
>
> buf = calloc(BLOCK_SZ, 1);
> ASSERT(buf);
>
> + if (get_sb(feature) & F2FS_FEATURE_SB_CHKSUM) {
> + old_crc = get_sb(crc);
> + new_crc = f2fs_cal_crc32(F2FS_SUPER_MAGIC, sb,
> + SB_CHKSUM_OFFSET);
> + set_sb(crc, new_crc);
> + MSG(1, "Info: SB CRC is updated (0x%x -> 0x%x)\n",
> + old_crc, new_crc);
> + }
> +
> memcpy(buf + F2FS_SUPER_OFFSET, sb, sizeof(*sb));
> for (index = 0; index < SB_ADDR_MAX; index++) {
> if ((1 << index) & sb_mask) {
> @@ -575,10 +589,29 @@ static inline int sanity_check_area_boundary(struct f2fs_super_block *sb,
> return 0;
> }
>
> +static int verify_sb_chksum(struct f2fs_super_block *sb)
> +{
> + if (SB_CHKSUM_OFFSET != get_sb(checksum_offset)) {
> + MSG(0, "\tInvalid SB CRC offset: %u\n",
> + get_sb(checksum_offset));
> + return -1;
> + }
> + if (f2fs_crc_valid(get_sb(crc), sb,
> + get_sb(checksum_offset))) {
> + MSG(0, "\tInvalid SB CRC: 0x%x\n", get_sb(crc));
> + return -1;
> + }
> + return 0;
> +}
> +
> int sanity_check_raw_super(struct f2fs_super_block *sb, enum SB_ADDR sb_addr)
> {
> unsigned int blocksize;
>
> + if ((get_sb(feature) & F2FS_FEATURE_SB_CHKSUM) &&
> + verify_sb_chksum(sb))
> + return -1;
> +
> if (F2FS_SUPER_MAGIC != get_sb(magic))
> return -1;
>
> diff --git a/fsck/resize.c b/fsck/resize.c
> index 5161a1f..3462165 100644
> --- a/fsck/resize.c
> +++ b/fsck/resize.c
> @@ -603,9 +603,6 @@ static int f2fs_resize_grow(struct f2fs_sb_info *sbi)
> }
> }
>
> - print_raw_sb_info(sb);
> - print_raw_sb_info(new_sb);
It'd be worth to keep this to show the previous states.
> -
> old_main_blkaddr = get_sb(main_blkaddr);
> new_main_blkaddr = get_newsb(main_blkaddr);
> offset = new_main_blkaddr - old_main_blkaddr;
> @@ -629,6 +626,9 @@ static int f2fs_resize_grow(struct f2fs_sb_info *sbi)
> migrate_sit(sbi, new_sb, offset_seg);
> rebuild_checkpoint(sbi, new_sb, offset_seg);
> update_superblock(new_sb, SB_ALL);
> + print_raw_sb_info(sb);
> + print_raw_sb_info(new_sb);
> +
> return 0;
> }
>
> @@ -658,9 +658,6 @@ static int f2fs_resize_shrink(struct f2fs_sb_info *sbi)
> }
> }
>
> - print_raw_sb_info(sb);
> - print_raw_sb_info(new_sb);
Ditto.
> -
> old_main_blkaddr = get_sb(main_blkaddr);
> new_main_blkaddr = get_newsb(main_blkaddr);
> offset = old_main_blkaddr - new_main_blkaddr;
> @@ -690,6 +687,9 @@ static int f2fs_resize_shrink(struct f2fs_sb_info *sbi)
> /* move whole data region */
> //if (err)
> // migrate_main(sbi, offset);
> + print_raw_sb_info(sb);
> + print_raw_sb_info(new_sb);
> +
> return 0;
> }
>
> diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
> index 38a0da4..f80632a 100644
> --- a/include/f2fs_fs.h
> +++ b/include/f2fs_fs.h
> @@ -279,6 +279,7 @@ static inline uint64_t bswap_64(uint64_t val)
> #define BITS_PER_BYTE 8
> #define F2FS_SUPER_MAGIC 0xF2F52010 /* F2FS Magic Number */
> #define CP_CHKSUM_OFFSET 4092
> +#define SB_CHKSUM_OFFSET 3068
> #define MAX_PATH_LEN 64
> #define MAX_DEVICES 8
>
> @@ -579,6 +580,7 @@ enum {
> #define F2FS_FEATURE_INODE_CRTIME 0x0100
> #define F2FS_FEATURE_LOST_FOUND 0x0200
> #define F2FS_FEATURE_VERITY 0x0400 /* reserved */
> +#define F2FS_FEATURE_SB_CHKSUM 0x0800
>
> #define MAX_VOLUME_NAME 512
>
> @@ -632,7 +634,8 @@ struct f2fs_super_block {
> struct f2fs_device devs[MAX_DEVICES]; /* device list */
> __le32 qf_ino[F2FS_MAX_QUOTAS]; /* quota inode numbers */
> __u8 hot_ext_count; /* # of hot file extension */
> - __u8 reserved[314]; /* valid reserved region */
> + __u8 reserved[310]; /* valid reserved region */
> + __le32 crc; /* checksum of superblock */
> } __attribute__((packed));
>
> /*
> @@ -1338,6 +1341,7 @@ struct feature feature_table[] = { \
> { "inode_crtime", F2FS_FEATURE_INODE_CRTIME }, \
> { "lost_found", F2FS_FEATURE_LOST_FOUND }, \
> { "verity", F2FS_FEATURE_VERITY }, /* reserved */ \
> + { "sb_checksum", F2FS_FEATURE_SB_CHKSUM }, \
> { NULL, 0x0}, \
> };
>
> diff --git a/mkfs/f2fs_format.c b/mkfs/f2fs_format.c
> index 621126c..9b0a0d1 100644
> --- a/mkfs/f2fs_format.c
> +++ b/mkfs/f2fs_format.c
> @@ -504,6 +504,14 @@ static int f2fs_prepare_super_block(void)
>
> sb->feature = c.feature;
>
> + if (get_sb(feature) & F2FS_FEATURE_SB_CHKSUM) {
> + set_sb(checksum_offset, SB_CHKSUM_OFFSET);
> + set_sb(crc, f2fs_cal_crc32(F2FS_SUPER_MAGIC, sb,
> + SB_CHKSUM_OFFSET));
> + MSG(1, "Info: SB CRC is set: offset (%d), crc (0x%x)\n",
> + get_sb(checksum_offset), get_sb(crc));
> + }
> +
> return 0;
> }
>
> --
> 2.19.0
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 4/5] f2fs-tools: introduce sb checksum
2018-09-19 23:35 ` Jaegeuk Kim
@ 2018-09-20 2:17 ` Junling Zheng
2018-09-20 21:38 ` Jaegeuk Kim
0 siblings, 1 reply; 14+ messages in thread
From: Junling Zheng @ 2018-09-20 2:17 UTC (permalink / raw)
To: Jaegeuk Kim; +Cc: miaoxie, linux-f2fs-devel
Hi, Jaegeuk
On 2018/9/20 7:35, Jaegeuk Kim wrote:
> On 09/19, Junling Zheng wrote:
>> This patch introduced crc for superblock.
>>
>> Signed-off-by: Junling Zheng <zhengjunling@huawei.com>
>> ---
>> fsck/mount.c | 33 +++++++++++++++++++++++++++++++++
>> fsck/resize.c | 12 ++++++------
>> include/f2fs_fs.h | 6 +++++-
>> mkfs/f2fs_format.c | 8 ++++++++
>> 4 files changed, 52 insertions(+), 7 deletions(-)
>>
>> diff --git a/fsck/mount.c b/fsck/mount.c
>> index 74ff7c6..9019921 100644
>> --- a/fsck/mount.c
>> +++ b/fsck/mount.c
>> @@ -340,6 +340,7 @@ void print_raw_sb_info(struct f2fs_super_block *sb)
>> DISP_u32(sb, node_ino);
>> DISP_u32(sb, meta_ino);
>> DISP_u32(sb, cp_payload);
>> + DISP_u32(sb, crc);
>> DISP("%-.256s", sb, version);
>> printf("\n");
>> }
>> @@ -467,6 +468,9 @@ void print_sb_state(struct f2fs_super_block *sb)
>> if (f & cpu_to_le32(F2FS_FEATURE_LOST_FOUND)) {
>> MSG(0, "%s", " lost_found");
>> }
>> + if (f & cpu_to_le32(F2FS_FEATURE_SB_CHKSUM)) {
>> + MSG(0, "%s", " sb_checksum");
>> + }
>> MSG(0, "\n");
>> MSG(0, "Info: superblock encrypt level = %d, salt = ",
>> sb->encryption_level);
>> @@ -479,10 +483,20 @@ void update_superblock(struct f2fs_super_block *sb, int sb_mask)
>> {
>> int index, ret;
>> u_int8_t *buf;
>> + u32 old_crc, new_crc;
>>
>> buf = calloc(BLOCK_SZ, 1);
>> ASSERT(buf);
>>
>> + if (get_sb(feature) & F2FS_FEATURE_SB_CHKSUM) {
>> + old_crc = get_sb(crc);
>> + new_crc = f2fs_cal_crc32(F2FS_SUPER_MAGIC, sb,
>> + SB_CHKSUM_OFFSET);
>> + set_sb(crc, new_crc);
>> + MSG(1, "Info: SB CRC is updated (0x%x -> 0x%x)\n",
>> + old_crc, new_crc);
>> + }
>> +
>> memcpy(buf + F2FS_SUPER_OFFSET, sb, sizeof(*sb));
>> for (index = 0; index < SB_ADDR_MAX; index++) {
>> if ((1 << index) & sb_mask) {
>> @@ -575,10 +589,29 @@ static inline int sanity_check_area_boundary(struct f2fs_super_block *sb,
>> return 0;
>> }
>>
>> +static int verify_sb_chksum(struct f2fs_super_block *sb)
>> +{
>> + if (SB_CHKSUM_OFFSET != get_sb(checksum_offset)) {
>> + MSG(0, "\tInvalid SB CRC offset: %u\n",
>> + get_sb(checksum_offset));
>> + return -1;
>> + }
>> + if (f2fs_crc_valid(get_sb(crc), sb,
>> + get_sb(checksum_offset))) {
>> + MSG(0, "\tInvalid SB CRC: 0x%x\n", get_sb(crc));
>> + return -1;
>> + }
>> + return 0;
>> +}
>> +
>> int sanity_check_raw_super(struct f2fs_super_block *sb, enum SB_ADDR sb_addr)
>> {
>> unsigned int blocksize;
>>
>> + if ((get_sb(feature) & F2FS_FEATURE_SB_CHKSUM) &&
>> + verify_sb_chksum(sb))
>> + return -1;
>> +
>> if (F2FS_SUPER_MAGIC != get_sb(magic))
>> return -1;
>>
>> diff --git a/fsck/resize.c b/fsck/resize.c
>> index 5161a1f..3462165 100644
>> --- a/fsck/resize.c
>> +++ b/fsck/resize.c
>> @@ -603,9 +603,6 @@ static int f2fs_resize_grow(struct f2fs_sb_info *sbi)
>> }
>> }
>>
>> - print_raw_sb_info(sb);
>> - print_raw_sb_info(new_sb);
>
> It'd be worth to keep this to show the previous states.
>
Here, I just want to move the printing of sb and new_sb to the place
behind update_superblock(), where the crc in sb will be updated.
>> -
>> old_main_blkaddr = get_sb(main_blkaddr);
>> new_main_blkaddr = get_newsb(main_blkaddr);
>> offset = new_main_blkaddr - old_main_blkaddr;
>> @@ -629,6 +626,9 @@ static int f2fs_resize_grow(struct f2fs_sb_info *sbi)
>> migrate_sit(sbi, new_sb, offset_seg);
>> rebuild_checkpoint(sbi, new_sb, offset_seg);
>> update_superblock(new_sb, SB_ALL);
>> + print_raw_sb_info(sb);
>> + print_raw_sb_info(new_sb);
>> +
>> return 0;
>> }
>>
>> @@ -658,9 +658,6 @@ static int f2fs_resize_shrink(struct f2fs_sb_info *sbi)
>> }
>> }
>>
>> - print_raw_sb_info(sb);
>> - print_raw_sb_info(new_sb);
>
> Ditto.
>
>> -
>> old_main_blkaddr = get_sb(main_blkaddr);
>> new_main_blkaddr = get_newsb(main_blkaddr);
>> offset = old_main_blkaddr - new_main_blkaddr;
>> @@ -690,6 +687,9 @@ static int f2fs_resize_shrink(struct f2fs_sb_info *sbi)
>> /* move whole data region */
>> //if (err)
>> // migrate_main(sbi, offset);
>> + print_raw_sb_info(sb);
>> + print_raw_sb_info(new_sb);
>> +
>> return 0;
>> }
>>
>> diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
>> index 38a0da4..f80632a 100644
>> --- a/include/f2fs_fs.h
>> +++ b/include/f2fs_fs.h
>> @@ -279,6 +279,7 @@ static inline uint64_t bswap_64(uint64_t val)
>> #define BITS_PER_BYTE 8
>> #define F2FS_SUPER_MAGIC 0xF2F52010 /* F2FS Magic Number */
>> #define CP_CHKSUM_OFFSET 4092
>> +#define SB_CHKSUM_OFFSET 3068
>> #define MAX_PATH_LEN 64
>> #define MAX_DEVICES 8
>>
>> @@ -579,6 +580,7 @@ enum {
>> #define F2FS_FEATURE_INODE_CRTIME 0x0100
>> #define F2FS_FEATURE_LOST_FOUND 0x0200
>> #define F2FS_FEATURE_VERITY 0x0400 /* reserved */
>> +#define F2FS_FEATURE_SB_CHKSUM 0x0800
>>
>> #define MAX_VOLUME_NAME 512
>>
>> @@ -632,7 +634,8 @@ struct f2fs_super_block {
>> struct f2fs_device devs[MAX_DEVICES]; /* device list */
>> __le32 qf_ino[F2FS_MAX_QUOTAS]; /* quota inode numbers */
>> __u8 hot_ext_count; /* # of hot file extension */
>> - __u8 reserved[314]; /* valid reserved region */
>> + __u8 reserved[310]; /* valid reserved region */
>> + __le32 crc; /* checksum of superblock */
>> } __attribute__((packed));
>>
>> /*
>> @@ -1338,6 +1341,7 @@ struct feature feature_table[] = { \
>> { "inode_crtime", F2FS_FEATURE_INODE_CRTIME }, \
>> { "lost_found", F2FS_FEATURE_LOST_FOUND }, \
>> { "verity", F2FS_FEATURE_VERITY }, /* reserved */ \
>> + { "sb_checksum", F2FS_FEATURE_SB_CHKSUM }, \
>> { NULL, 0x0}, \
>> };
>>
>> diff --git a/mkfs/f2fs_format.c b/mkfs/f2fs_format.c
>> index 621126c..9b0a0d1 100644
>> --- a/mkfs/f2fs_format.c
>> +++ b/mkfs/f2fs_format.c
>> @@ -504,6 +504,14 @@ static int f2fs_prepare_super_block(void)
>>
>> sb->feature = c.feature;
>>
>> + if (get_sb(feature) & F2FS_FEATURE_SB_CHKSUM) {
>> + set_sb(checksum_offset, SB_CHKSUM_OFFSET);
>> + set_sb(crc, f2fs_cal_crc32(F2FS_SUPER_MAGIC, sb,
>> + SB_CHKSUM_OFFSET));
>> + MSG(1, "Info: SB CRC is set: offset (%d), crc (0x%x)\n",
>> + get_sb(checksum_offset), get_sb(crc));
>> + }
>> +
>> return 0;
>> }
>>
>> --
>> 2.19.0
>
> .
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 4/5] f2fs-tools: introduce sb checksum
2018-09-20 2:17 ` Junling Zheng
@ 2018-09-20 21:38 ` Jaegeuk Kim
2018-09-21 3:09 ` Junling Zheng
0 siblings, 1 reply; 14+ messages in thread
From: Jaegeuk Kim @ 2018-09-20 21:38 UTC (permalink / raw)
To: Junling Zheng; +Cc: miaoxie, linux-f2fs-devel
On 09/20, Junling Zheng wrote:
> Hi, Jaegeuk
>
> On 2018/9/20 7:35, Jaegeuk Kim wrote:
> > On 09/19, Junling Zheng wrote:
> >> This patch introduced crc for superblock.
> >>
> >> Signed-off-by: Junling Zheng <zhengjunling@huawei.com>
> >> ---
> >> fsck/mount.c | 33 +++++++++++++++++++++++++++++++++
> >> fsck/resize.c | 12 ++++++------
> >> include/f2fs_fs.h | 6 +++++-
> >> mkfs/f2fs_format.c | 8 ++++++++
> >> 4 files changed, 52 insertions(+), 7 deletions(-)
> >>
> >> diff --git a/fsck/mount.c b/fsck/mount.c
> >> index 74ff7c6..9019921 100644
> >> --- a/fsck/mount.c
> >> +++ b/fsck/mount.c
> >> @@ -340,6 +340,7 @@ void print_raw_sb_info(struct f2fs_super_block *sb)
> >> DISP_u32(sb, node_ino);
> >> DISP_u32(sb, meta_ino);
> >> DISP_u32(sb, cp_payload);
> >> + DISP_u32(sb, crc);
> >> DISP("%-.256s", sb, version);
> >> printf("\n");
> >> }
> >> @@ -467,6 +468,9 @@ void print_sb_state(struct f2fs_super_block *sb)
> >> if (f & cpu_to_le32(F2FS_FEATURE_LOST_FOUND)) {
> >> MSG(0, "%s", " lost_found");
> >> }
> >> + if (f & cpu_to_le32(F2FS_FEATURE_SB_CHKSUM)) {
> >> + MSG(0, "%s", " sb_checksum");
> >> + }
> >> MSG(0, "\n");
> >> MSG(0, "Info: superblock encrypt level = %d, salt = ",
> >> sb->encryption_level);
> >> @@ -479,10 +483,20 @@ void update_superblock(struct f2fs_super_block *sb, int sb_mask)
> >> {
> >> int index, ret;
> >> u_int8_t *buf;
> >> + u32 old_crc, new_crc;
> >>
> >> buf = calloc(BLOCK_SZ, 1);
> >> ASSERT(buf);
> >>
> >> + if (get_sb(feature) & F2FS_FEATURE_SB_CHKSUM) {
> >> + old_crc = get_sb(crc);
> >> + new_crc = f2fs_cal_crc32(F2FS_SUPER_MAGIC, sb,
> >> + SB_CHKSUM_OFFSET);
> >> + set_sb(crc, new_crc);
> >> + MSG(1, "Info: SB CRC is updated (0x%x -> 0x%x)\n",
> >> + old_crc, new_crc);
> >> + }
> >> +
> >> memcpy(buf + F2FS_SUPER_OFFSET, sb, sizeof(*sb));
> >> for (index = 0; index < SB_ADDR_MAX; index++) {
> >> if ((1 << index) & sb_mask) {
> >> @@ -575,10 +589,29 @@ static inline int sanity_check_area_boundary(struct f2fs_super_block *sb,
> >> return 0;
> >> }
> >>
> >> +static int verify_sb_chksum(struct f2fs_super_block *sb)
> >> +{
> >> + if (SB_CHKSUM_OFFSET != get_sb(checksum_offset)) {
> >> + MSG(0, "\tInvalid SB CRC offset: %u\n",
> >> + get_sb(checksum_offset));
> >> + return -1;
> >> + }
> >> + if (f2fs_crc_valid(get_sb(crc), sb,
> >> + get_sb(checksum_offset))) {
> >> + MSG(0, "\tInvalid SB CRC: 0x%x\n", get_sb(crc));
> >> + return -1;
> >> + }
> >> + return 0;
> >> +}
> >> +
> >> int sanity_check_raw_super(struct f2fs_super_block *sb, enum SB_ADDR sb_addr)
> >> {
> >> unsigned int blocksize;
> >>
> >> + if ((get_sb(feature) & F2FS_FEATURE_SB_CHKSUM) &&
> >> + verify_sb_chksum(sb))
> >> + return -1;
> >> +
> >> if (F2FS_SUPER_MAGIC != get_sb(magic))
> >> return -1;
> >>
> >> diff --git a/fsck/resize.c b/fsck/resize.c
> >> index 5161a1f..3462165 100644
> >> --- a/fsck/resize.c
> >> +++ b/fsck/resize.c
> >> @@ -603,9 +603,6 @@ static int f2fs_resize_grow(struct f2fs_sb_info *sbi)
> >> }
> >> }
> >>
> >> - print_raw_sb_info(sb);
> >> - print_raw_sb_info(new_sb);
> >
> > It'd be worth to keep this to show the previous states.
> >
>
> Here, I just want to move the printing of sb and new_sb to the place
> behind update_superblock(), where the crc in sb will be updated.
We'd better to see the changes, no?
>
> >> -
> >> old_main_blkaddr = get_sb(main_blkaddr);
> >> new_main_blkaddr = get_newsb(main_blkaddr);
> >> offset = new_main_blkaddr - old_main_blkaddr;
> >> @@ -629,6 +626,9 @@ static int f2fs_resize_grow(struct f2fs_sb_info *sbi)
> >> migrate_sit(sbi, new_sb, offset_seg);
> >> rebuild_checkpoint(sbi, new_sb, offset_seg);
> >> update_superblock(new_sb, SB_ALL);
> >> + print_raw_sb_info(sb);
> >> + print_raw_sb_info(new_sb);
> >> +
> >> return 0;
> >> }
> >>
> >> @@ -658,9 +658,6 @@ static int f2fs_resize_shrink(struct f2fs_sb_info *sbi)
> >> }
> >> }
> >>
> >> - print_raw_sb_info(sb);
> >> - print_raw_sb_info(new_sb);
> >
> > Ditto.
> >
> >> -
> >> old_main_blkaddr = get_sb(main_blkaddr);
> >> new_main_blkaddr = get_newsb(main_blkaddr);
> >> offset = old_main_blkaddr - new_main_blkaddr;
> >> @@ -690,6 +687,9 @@ static int f2fs_resize_shrink(struct f2fs_sb_info *sbi)
> >> /* move whole data region */
> >> //if (err)
> >> // migrate_main(sbi, offset);
> >> + print_raw_sb_info(sb);
> >> + print_raw_sb_info(new_sb);
> >> +
> >> return 0;
> >> }
> >>
> >> diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
> >> index 38a0da4..f80632a 100644
> >> --- a/include/f2fs_fs.h
> >> +++ b/include/f2fs_fs.h
> >> @@ -279,6 +279,7 @@ static inline uint64_t bswap_64(uint64_t val)
> >> #define BITS_PER_BYTE 8
> >> #define F2FS_SUPER_MAGIC 0xF2F52010 /* F2FS Magic Number */
> >> #define CP_CHKSUM_OFFSET 4092
> >> +#define SB_CHKSUM_OFFSET 3068
> >> #define MAX_PATH_LEN 64
> >> #define MAX_DEVICES 8
> >>
> >> @@ -579,6 +580,7 @@ enum {
> >> #define F2FS_FEATURE_INODE_CRTIME 0x0100
> >> #define F2FS_FEATURE_LOST_FOUND 0x0200
> >> #define F2FS_FEATURE_VERITY 0x0400 /* reserved */
> >> +#define F2FS_FEATURE_SB_CHKSUM 0x0800
> >>
> >> #define MAX_VOLUME_NAME 512
> >>
> >> @@ -632,7 +634,8 @@ struct f2fs_super_block {
> >> struct f2fs_device devs[MAX_DEVICES]; /* device list */
> >> __le32 qf_ino[F2FS_MAX_QUOTAS]; /* quota inode numbers */
> >> __u8 hot_ext_count; /* # of hot file extension */
> >> - __u8 reserved[314]; /* valid reserved region */
> >> + __u8 reserved[310]; /* valid reserved region */
> >> + __le32 crc; /* checksum of superblock */
> >> } __attribute__((packed));
> >>
> >> /*
> >> @@ -1338,6 +1341,7 @@ struct feature feature_table[] = { \
> >> { "inode_crtime", F2FS_FEATURE_INODE_CRTIME }, \
> >> { "lost_found", F2FS_FEATURE_LOST_FOUND }, \
> >> { "verity", F2FS_FEATURE_VERITY }, /* reserved */ \
> >> + { "sb_checksum", F2FS_FEATURE_SB_CHKSUM }, \
> >> { NULL, 0x0}, \
> >> };
> >>
> >> diff --git a/mkfs/f2fs_format.c b/mkfs/f2fs_format.c
> >> index 621126c..9b0a0d1 100644
> >> --- a/mkfs/f2fs_format.c
> >> +++ b/mkfs/f2fs_format.c
> >> @@ -504,6 +504,14 @@ static int f2fs_prepare_super_block(void)
> >>
> >> sb->feature = c.feature;
> >>
> >> + if (get_sb(feature) & F2FS_FEATURE_SB_CHKSUM) {
> >> + set_sb(checksum_offset, SB_CHKSUM_OFFSET);
> >> + set_sb(crc, f2fs_cal_crc32(F2FS_SUPER_MAGIC, sb,
> >> + SB_CHKSUM_OFFSET));
> >> + MSG(1, "Info: SB CRC is set: offset (%d), crc (0x%x)\n",
> >> + get_sb(checksum_offset), get_sb(crc));
> >> + }
> >> +
> >> return 0;
> >> }
> >>
> >> --
> >> 2.19.0
> >
> > .
> >
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 4/5] f2fs-tools: introduce sb checksum
2018-09-20 21:38 ` Jaegeuk Kim
@ 2018-09-21 3:09 ` Junling Zheng
2018-09-26 1:57 ` Jaegeuk Kim
0 siblings, 1 reply; 14+ messages in thread
From: Junling Zheng @ 2018-09-21 3:09 UTC (permalink / raw)
To: Jaegeuk Kim; +Cc: miaoxie, linux-f2fs-devel
On 2018/9/21 5:38, Jaegeuk Kim wrote:
> On 09/20, Junling Zheng wrote:
>> Hi, Jaegeuk
>>
>> On 2018/9/20 7:35, Jaegeuk Kim wrote:
>>> On 09/19, Junling Zheng wrote:
>>>> This patch introduced crc for superblock.
>>>>
>>>> Signed-off-by: Junling Zheng <zhengjunling@huawei.com>
>>>> ---
>>>> fsck/mount.c | 33 +++++++++++++++++++++++++++++++++
>>>> fsck/resize.c | 12 ++++++------
>>>> include/f2fs_fs.h | 6 +++++-
>>>> mkfs/f2fs_format.c | 8 ++++++++
>>>> 4 files changed, 52 insertions(+), 7 deletions(-)
>>>>
>>>> diff --git a/fsck/mount.c b/fsck/mount.c
>>>> index 74ff7c6..9019921 100644
>>>> --- a/fsck/mount.c
>>>> +++ b/fsck/mount.c
>>>> @@ -340,6 +340,7 @@ void print_raw_sb_info(struct f2fs_super_block *sb)
>>>> DISP_u32(sb, node_ino);
>>>> DISP_u32(sb, meta_ino);
>>>> DISP_u32(sb, cp_payload);
>>>> + DISP_u32(sb, crc);
>>>> DISP("%-.256s", sb, version);
>>>> printf("\n");
>>>> }
>>>> @@ -467,6 +468,9 @@ void print_sb_state(struct f2fs_super_block *sb)
>>>> if (f & cpu_to_le32(F2FS_FEATURE_LOST_FOUND)) {
>>>> MSG(0, "%s", " lost_found");
>>>> }
>>>> + if (f & cpu_to_le32(F2FS_FEATURE_SB_CHKSUM)) {
>>>> + MSG(0, "%s", " sb_checksum");
>>>> + }
>>>> MSG(0, "\n");
>>>> MSG(0, "Info: superblock encrypt level = %d, salt = ",
>>>> sb->encryption_level);
>>>> @@ -479,10 +483,20 @@ void update_superblock(struct f2fs_super_block *sb, int sb_mask)
>>>> {
>>>> int index, ret;
>>>> u_int8_t *buf;
>>>> + u32 old_crc, new_crc;
>>>>
>>>> buf = calloc(BLOCK_SZ, 1);
>>>> ASSERT(buf);
>>>>
>>>> + if (get_sb(feature) & F2FS_FEATURE_SB_CHKSUM) {
>>>> + old_crc = get_sb(crc);
>>>> + new_crc = f2fs_cal_crc32(F2FS_SUPER_MAGIC, sb,
>>>> + SB_CHKSUM_OFFSET);
>>>> + set_sb(crc, new_crc);
>>>> + MSG(1, "Info: SB CRC is updated (0x%x -> 0x%x)\n",
>>>> + old_crc, new_crc);
>>>> + }
>>>> +
>>>> memcpy(buf + F2FS_SUPER_OFFSET, sb, sizeof(*sb));
>>>> for (index = 0; index < SB_ADDR_MAX; index++) {
>>>> if ((1 << index) & sb_mask) {
>>>> @@ -575,10 +589,29 @@ static inline int sanity_check_area_boundary(struct f2fs_super_block *sb,
>>>> return 0;
>>>> }
>>>>
>>>> +static int verify_sb_chksum(struct f2fs_super_block *sb)
>>>> +{
>>>> + if (SB_CHKSUM_OFFSET != get_sb(checksum_offset)) {
>>>> + MSG(0, "\tInvalid SB CRC offset: %u\n",
>>>> + get_sb(checksum_offset));
>>>> + return -1;
>>>> + }
>>>> + if (f2fs_crc_valid(get_sb(crc), sb,
>>>> + get_sb(checksum_offset))) {
>>>> + MSG(0, "\tInvalid SB CRC: 0x%x\n", get_sb(crc));
>>>> + return -1;
>>>> + }
>>>> + return 0;
>>>> +}
>>>> +
>>>> int sanity_check_raw_super(struct f2fs_super_block *sb, enum SB_ADDR sb_addr)
>>>> {
>>>> unsigned int blocksize;
>>>>
>>>> + if ((get_sb(feature) & F2FS_FEATURE_SB_CHKSUM) &&
>>>> + verify_sb_chksum(sb))
>>>> + return -1;
>>>> +
>>>> if (F2FS_SUPER_MAGIC != get_sb(magic))
>>>> return -1;
>>>>
>>>> diff --git a/fsck/resize.c b/fsck/resize.c
>>>> index 5161a1f..3462165 100644
>>>> --- a/fsck/resize.c
>>>> +++ b/fsck/resize.c
>>>> @@ -603,9 +603,6 @@ static int f2fs_resize_grow(struct f2fs_sb_info *sbi)
>>>> }
>>>> }
>>>>
>>>> - print_raw_sb_info(sb);
>>>> - print_raw_sb_info(new_sb);
>>>
>>> It'd be worth to keep this to show the previous states.
>>>
>>
>> Here, I just want to move the printing of sb and new_sb to the place
>> behind update_superblock(), where the crc in sb will be updated.
>
> We'd better to see the changes, no?
>
Yeah, we print sb and new_sb here just for seeing the changes of superblock.
However, the crc in new_sb will not be updated until calling update_superblock(),
so if we keep the current printing location, we can't get the changes.
Thanks,
>>
>>>> -
>>>> old_main_blkaddr = get_sb(main_blkaddr);
>>>> new_main_blkaddr = get_newsb(main_blkaddr);
>>>> offset = new_main_blkaddr - old_main_blkaddr;
>>>> @@ -629,6 +626,9 @@ static int f2fs_resize_grow(struct f2fs_sb_info *sbi)
>>>> migrate_sit(sbi, new_sb, offset_seg);
>>>> rebuild_checkpoint(sbi, new_sb, offset_seg);
>>>> update_superblock(new_sb, SB_ALL);
>>>> + print_raw_sb_info(sb);
>>>> + print_raw_sb_info(new_sb);
>>>> +
>>>> return 0;
>>>> }
>>>>
>>>> @@ -658,9 +658,6 @@ static int f2fs_resize_shrink(struct f2fs_sb_info *sbi)
>>>> }
>>>> }
>>>>
>>>> - print_raw_sb_info(sb);
>>>> - print_raw_sb_info(new_sb);
>>>
>>> Ditto.
>>>
>>>> -
>>>> old_main_blkaddr = get_sb(main_blkaddr);
>>>> new_main_blkaddr = get_newsb(main_blkaddr);
>>>> offset = old_main_blkaddr - new_main_blkaddr;
>>>> @@ -690,6 +687,9 @@ static int f2fs_resize_shrink(struct f2fs_sb_info *sbi)
>>>> /* move whole data region */
>>>> //if (err)
>>>> // migrate_main(sbi, offset);
>>>> + print_raw_sb_info(sb);
>>>> + print_raw_sb_info(new_sb);
>>>> +
>>>> return 0;
>>>> }
>>>>
>>>> diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
>>>> index 38a0da4..f80632a 100644
>>>> --- a/include/f2fs_fs.h
>>>> +++ b/include/f2fs_fs.h
>>>> @@ -279,6 +279,7 @@ static inline uint64_t bswap_64(uint64_t val)
>>>> #define BITS_PER_BYTE 8
>>>> #define F2FS_SUPER_MAGIC 0xF2F52010 /* F2FS Magic Number */
>>>> #define CP_CHKSUM_OFFSET 4092
>>>> +#define SB_CHKSUM_OFFSET 3068
>>>> #define MAX_PATH_LEN 64
>>>> #define MAX_DEVICES 8
>>>>
>>>> @@ -579,6 +580,7 @@ enum {
>>>> #define F2FS_FEATURE_INODE_CRTIME 0x0100
>>>> #define F2FS_FEATURE_LOST_FOUND 0x0200
>>>> #define F2FS_FEATURE_VERITY 0x0400 /* reserved */
>>>> +#define F2FS_FEATURE_SB_CHKSUM 0x0800
>>>>
>>>> #define MAX_VOLUME_NAME 512
>>>>
>>>> @@ -632,7 +634,8 @@ struct f2fs_super_block {
>>>> struct f2fs_device devs[MAX_DEVICES]; /* device list */
>>>> __le32 qf_ino[F2FS_MAX_QUOTAS]; /* quota inode numbers */
>>>> __u8 hot_ext_count; /* # of hot file extension */
>>>> - __u8 reserved[314]; /* valid reserved region */
>>>> + __u8 reserved[310]; /* valid reserved region */
>>>> + __le32 crc; /* checksum of superblock */
>>>> } __attribute__((packed));
>>>>
>>>> /*
>>>> @@ -1338,6 +1341,7 @@ struct feature feature_table[] = { \
>>>> { "inode_crtime", F2FS_FEATURE_INODE_CRTIME }, \
>>>> { "lost_found", F2FS_FEATURE_LOST_FOUND }, \
>>>> { "verity", F2FS_FEATURE_VERITY }, /* reserved */ \
>>>> + { "sb_checksum", F2FS_FEATURE_SB_CHKSUM }, \
>>>> { NULL, 0x0}, \
>>>> };
>>>>
>>>> diff --git a/mkfs/f2fs_format.c b/mkfs/f2fs_format.c
>>>> index 621126c..9b0a0d1 100644
>>>> --- a/mkfs/f2fs_format.c
>>>> +++ b/mkfs/f2fs_format.c
>>>> @@ -504,6 +504,14 @@ static int f2fs_prepare_super_block(void)
>>>>
>>>> sb->feature = c.feature;
>>>>
>>>> + if (get_sb(feature) & F2FS_FEATURE_SB_CHKSUM) {
>>>> + set_sb(checksum_offset, SB_CHKSUM_OFFSET);
>>>> + set_sb(crc, f2fs_cal_crc32(F2FS_SUPER_MAGIC, sb,
>>>> + SB_CHKSUM_OFFSET));
>>>> + MSG(1, "Info: SB CRC is set: offset (%d), crc (0x%x)\n",
>>>> + get_sb(checksum_offset), get_sb(crc));
>>>> + }
>>>> +
>>>> return 0;
>>>> }
>>>>
>>>> --
>>>> 2.19.0
>>>
>>> .
>>>
>>
>
> .
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 4/5] f2fs-tools: introduce sb checksum
2018-09-21 3:09 ` Junling Zheng
@ 2018-09-26 1:57 ` Jaegeuk Kim
2018-09-26 3:54 ` Junling Zheng
0 siblings, 1 reply; 14+ messages in thread
From: Jaegeuk Kim @ 2018-09-26 1:57 UTC (permalink / raw)
To: Junling Zheng; +Cc: miaoxie, linux-f2fs-devel
On 09/21, Junling Zheng wrote:
> On 2018/9/21 5:38, Jaegeuk Kim wrote:
> > On 09/20, Junling Zheng wrote:
> >> Hi, Jaegeuk
> >>
> >> On 2018/9/20 7:35, Jaegeuk Kim wrote:
> >>> On 09/19, Junling Zheng wrote:
> >>>> This patch introduced crc for superblock.
> >>>>
> >>>> Signed-off-by: Junling Zheng <zhengjunling@huawei.com>
> >>>> ---
> >>>> fsck/mount.c | 33 +++++++++++++++++++++++++++++++++
> >>>> fsck/resize.c | 12 ++++++------
> >>>> include/f2fs_fs.h | 6 +++++-
> >>>> mkfs/f2fs_format.c | 8 ++++++++
> >>>> 4 files changed, 52 insertions(+), 7 deletions(-)
> >>>>
> >>>> diff --git a/fsck/mount.c b/fsck/mount.c
> >>>> index 74ff7c6..9019921 100644
> >>>> --- a/fsck/mount.c
> >>>> +++ b/fsck/mount.c
> >>>> @@ -340,6 +340,7 @@ void print_raw_sb_info(struct f2fs_super_block *sb)
> >>>> DISP_u32(sb, node_ino);
> >>>> DISP_u32(sb, meta_ino);
> >>>> DISP_u32(sb, cp_payload);
> >>>> + DISP_u32(sb, crc);
> >>>> DISP("%-.256s", sb, version);
> >>>> printf("\n");
> >>>> }
> >>>> @@ -467,6 +468,9 @@ void print_sb_state(struct f2fs_super_block *sb)
> >>>> if (f & cpu_to_le32(F2FS_FEATURE_LOST_FOUND)) {
> >>>> MSG(0, "%s", " lost_found");
> >>>> }
> >>>> + if (f & cpu_to_le32(F2FS_FEATURE_SB_CHKSUM)) {
> >>>> + MSG(0, "%s", " sb_checksum");
> >>>> + }
> >>>> MSG(0, "\n");
> >>>> MSG(0, "Info: superblock encrypt level = %d, salt = ",
> >>>> sb->encryption_level);
> >>>> @@ -479,10 +483,20 @@ void update_superblock(struct f2fs_super_block *sb, int sb_mask)
> >>>> {
> >>>> int index, ret;
> >>>> u_int8_t *buf;
> >>>> + u32 old_crc, new_crc;
> >>>>
> >>>> buf = calloc(BLOCK_SZ, 1);
> >>>> ASSERT(buf);
> >>>>
> >>>> + if (get_sb(feature) & F2FS_FEATURE_SB_CHKSUM) {
> >>>> + old_crc = get_sb(crc);
> >>>> + new_crc = f2fs_cal_crc32(F2FS_SUPER_MAGIC, sb,
> >>>> + SB_CHKSUM_OFFSET);
> >>>> + set_sb(crc, new_crc);
> >>>> + MSG(1, "Info: SB CRC is updated (0x%x -> 0x%x)\n",
> >>>> + old_crc, new_crc);
> >>>> + }
> >>>> +
> >>>> memcpy(buf + F2FS_SUPER_OFFSET, sb, sizeof(*sb));
> >>>> for (index = 0; index < SB_ADDR_MAX; index++) {
> >>>> if ((1 << index) & sb_mask) {
> >>>> @@ -575,10 +589,29 @@ static inline int sanity_check_area_boundary(struct f2fs_super_block *sb,
> >>>> return 0;
> >>>> }
> >>>>
> >>>> +static int verify_sb_chksum(struct f2fs_super_block *sb)
> >>>> +{
> >>>> + if (SB_CHKSUM_OFFSET != get_sb(checksum_offset)) {
> >>>> + MSG(0, "\tInvalid SB CRC offset: %u\n",
> >>>> + get_sb(checksum_offset));
> >>>> + return -1;
> >>>> + }
> >>>> + if (f2fs_crc_valid(get_sb(crc), sb,
> >>>> + get_sb(checksum_offset))) {
> >>>> + MSG(0, "\tInvalid SB CRC: 0x%x\n", get_sb(crc));
> >>>> + return -1;
> >>>> + }
> >>>> + return 0;
> >>>> +}
> >>>> +
> >>>> int sanity_check_raw_super(struct f2fs_super_block *sb, enum SB_ADDR sb_addr)
> >>>> {
> >>>> unsigned int blocksize;
> >>>>
> >>>> + if ((get_sb(feature) & F2FS_FEATURE_SB_CHKSUM) &&
> >>>> + verify_sb_chksum(sb))
> >>>> + return -1;
> >>>> +
> >>>> if (F2FS_SUPER_MAGIC != get_sb(magic))
> >>>> return -1;
> >>>>
> >>>> diff --git a/fsck/resize.c b/fsck/resize.c
> >>>> index 5161a1f..3462165 100644
> >>>> --- a/fsck/resize.c
> >>>> +++ b/fsck/resize.c
> >>>> @@ -603,9 +603,6 @@ static int f2fs_resize_grow(struct f2fs_sb_info *sbi)
> >>>> }
> >>>> }
> >>>>
> >>>> - print_raw_sb_info(sb);
> >>>> - print_raw_sb_info(new_sb);
> >>>
> >>> It'd be worth to keep this to show the previous states.
> >>>
> >>
> >> Here, I just want to move the printing of sb and new_sb to the place
> >> behind update_superblock(), where the crc in sb will be updated.
> >
> > We'd better to see the changes, no?
> >
>
> Yeah, we print sb and new_sb here just for seeing the changes of superblock.
> However, the crc in new_sb will not be updated until calling update_superblock(),
> so if we keep the current printing location, we can't get the changes.
I mean...
print_raw_sb_info(sb);
print_raw_sb_info(new_sb);
update...
print_raw_sb_info(new_sb);
>
> Thanks,
>
> >>
> >>>> -
> >>>> old_main_blkaddr = get_sb(main_blkaddr);
> >>>> new_main_blkaddr = get_newsb(main_blkaddr);
> >>>> offset = new_main_blkaddr - old_main_blkaddr;
> >>>> @@ -629,6 +626,9 @@ static int f2fs_resize_grow(struct f2fs_sb_info *sbi)
> >>>> migrate_sit(sbi, new_sb, offset_seg);
> >>>> rebuild_checkpoint(sbi, new_sb, offset_seg);
> >>>> update_superblock(new_sb, SB_ALL);
> >>>> + print_raw_sb_info(sb);
> >>>> + print_raw_sb_info(new_sb);
> >>>> +
> >>>> return 0;
> >>>> }
> >>>>
> >>>> @@ -658,9 +658,6 @@ static int f2fs_resize_shrink(struct f2fs_sb_info *sbi)
> >>>> }
> >>>> }
> >>>>
> >>>> - print_raw_sb_info(sb);
> >>>> - print_raw_sb_info(new_sb);
> >>>
> >>> Ditto.
> >>>
> >>>> -
> >>>> old_main_blkaddr = get_sb(main_blkaddr);
> >>>> new_main_blkaddr = get_newsb(main_blkaddr);
> >>>> offset = old_main_blkaddr - new_main_blkaddr;
> >>>> @@ -690,6 +687,9 @@ static int f2fs_resize_shrink(struct f2fs_sb_info *sbi)
> >>>> /* move whole data region */
> >>>> //if (err)
> >>>> // migrate_main(sbi, offset);
> >>>> + print_raw_sb_info(sb);
> >>>> + print_raw_sb_info(new_sb);
> >>>> +
> >>>> return 0;
> >>>> }
> >>>>
> >>>> diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
> >>>> index 38a0da4..f80632a 100644
> >>>> --- a/include/f2fs_fs.h
> >>>> +++ b/include/f2fs_fs.h
> >>>> @@ -279,6 +279,7 @@ static inline uint64_t bswap_64(uint64_t val)
> >>>> #define BITS_PER_BYTE 8
> >>>> #define F2FS_SUPER_MAGIC 0xF2F52010 /* F2FS Magic Number */
> >>>> #define CP_CHKSUM_OFFSET 4092
> >>>> +#define SB_CHKSUM_OFFSET 3068
> >>>> #define MAX_PATH_LEN 64
> >>>> #define MAX_DEVICES 8
> >>>>
> >>>> @@ -579,6 +580,7 @@ enum {
> >>>> #define F2FS_FEATURE_INODE_CRTIME 0x0100
> >>>> #define F2FS_FEATURE_LOST_FOUND 0x0200
> >>>> #define F2FS_FEATURE_VERITY 0x0400 /* reserved */
> >>>> +#define F2FS_FEATURE_SB_CHKSUM 0x0800
> >>>>
> >>>> #define MAX_VOLUME_NAME 512
> >>>>
> >>>> @@ -632,7 +634,8 @@ struct f2fs_super_block {
> >>>> struct f2fs_device devs[MAX_DEVICES]; /* device list */
> >>>> __le32 qf_ino[F2FS_MAX_QUOTAS]; /* quota inode numbers */
> >>>> __u8 hot_ext_count; /* # of hot file extension */
> >>>> - __u8 reserved[314]; /* valid reserved region */
> >>>> + __u8 reserved[310]; /* valid reserved region */
> >>>> + __le32 crc; /* checksum of superblock */
> >>>> } __attribute__((packed));
> >>>>
> >>>> /*
> >>>> @@ -1338,6 +1341,7 @@ struct feature feature_table[] = { \
> >>>> { "inode_crtime", F2FS_FEATURE_INODE_CRTIME }, \
> >>>> { "lost_found", F2FS_FEATURE_LOST_FOUND }, \
> >>>> { "verity", F2FS_FEATURE_VERITY }, /* reserved */ \
> >>>> + { "sb_checksum", F2FS_FEATURE_SB_CHKSUM }, \
> >>>> { NULL, 0x0}, \
> >>>> };
> >>>>
> >>>> diff --git a/mkfs/f2fs_format.c b/mkfs/f2fs_format.c
> >>>> index 621126c..9b0a0d1 100644
> >>>> --- a/mkfs/f2fs_format.c
> >>>> +++ b/mkfs/f2fs_format.c
> >>>> @@ -504,6 +504,14 @@ static int f2fs_prepare_super_block(void)
> >>>>
> >>>> sb->feature = c.feature;
> >>>>
> >>>> + if (get_sb(feature) & F2FS_FEATURE_SB_CHKSUM) {
> >>>> + set_sb(checksum_offset, SB_CHKSUM_OFFSET);
> >>>> + set_sb(crc, f2fs_cal_crc32(F2FS_SUPER_MAGIC, sb,
> >>>> + SB_CHKSUM_OFFSET));
> >>>> + MSG(1, "Info: SB CRC is set: offset (%d), crc (0x%x)\n",
> >>>> + get_sb(checksum_offset), get_sb(crc));
> >>>> + }
> >>>> +
> >>>> return 0;
> >>>> }
> >>>>
> >>>> --
> >>>> 2.19.0
> >>>
> >>> .
> >>>
> >>
> >
> > .
> >
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 4/5] f2fs-tools: introduce sb checksum
2018-09-26 1:57 ` Jaegeuk Kim
@ 2018-09-26 3:54 ` Junling Zheng
2018-09-26 20:27 ` Jaegeuk Kim
0 siblings, 1 reply; 14+ messages in thread
From: Junling Zheng @ 2018-09-26 3:54 UTC (permalink / raw)
To: Jaegeuk Kim; +Cc: miaoxie, linux-f2fs-devel
Hi, Jaegeuk
On 2018/9/26 9:57, Jaegeuk Kim wrote:
> On 09/21, Junling Zheng wrote:
>> On 2018/9/21 5:38, Jaegeuk Kim wrote:
>>> On 09/20, Junling Zheng wrote:
>>>> Hi, Jaegeuk
>>>>
>>>> On 2018/9/20 7:35, Jaegeuk Kim wrote:
>>>>> On 09/19, Junling Zheng wrote:
>>>>>> This patch introduced crc for superblock.
>>>>>>
>>>>>> Signed-off-by: Junling Zheng <zhengjunling@huawei.com>
>>>>>> ---
>>>>>> fsck/mount.c | 33 +++++++++++++++++++++++++++++++++
>>>>>> fsck/resize.c | 12 ++++++------
>>>>>> include/f2fs_fs.h | 6 +++++-
>>>>>> mkfs/f2fs_format.c | 8 ++++++++
>>>>>> 4 files changed, 52 insertions(+), 7 deletions(-)
>>>>>>
>>>>>> diff --git a/fsck/mount.c b/fsck/mount.c
>>>>>> index 74ff7c6..9019921 100644
>>>>>> --- a/fsck/mount.c
>>>>>> +++ b/fsck/mount.c
>>>>>> @@ -340,6 +340,7 @@ void print_raw_sb_info(struct f2fs_super_block *sb)
>>>>>> DISP_u32(sb, node_ino);
>>>>>> DISP_u32(sb, meta_ino);
>>>>>> DISP_u32(sb, cp_payload);
>>>>>> + DISP_u32(sb, crc);
>>>>>> DISP("%-.256s", sb, version);
>>>>>> printf("\n");
>>>>>> }
>>>>>> @@ -467,6 +468,9 @@ void print_sb_state(struct f2fs_super_block *sb)
>>>>>> if (f & cpu_to_le32(F2FS_FEATURE_LOST_FOUND)) {
>>>>>> MSG(0, "%s", " lost_found");
>>>>>> }
>>>>>> + if (f & cpu_to_le32(F2FS_FEATURE_SB_CHKSUM)) {
>>>>>> + MSG(0, "%s", " sb_checksum");
>>>>>> + }
>>>>>> MSG(0, "\n");
>>>>>> MSG(0, "Info: superblock encrypt level = %d, salt = ",
>>>>>> sb->encryption_level);
>>>>>> @@ -479,10 +483,20 @@ void update_superblock(struct f2fs_super_block *sb, int sb_mask)
>>>>>> {
>>>>>> int index, ret;
>>>>>> u_int8_t *buf;
>>>>>> + u32 old_crc, new_crc;
>>>>>>
>>>>>> buf = calloc(BLOCK_SZ, 1);
>>>>>> ASSERT(buf);
>>>>>>
>>>>>> + if (get_sb(feature) & F2FS_FEATURE_SB_CHKSUM) {
>>>>>> + old_crc = get_sb(crc);
>>>>>> + new_crc = f2fs_cal_crc32(F2FS_SUPER_MAGIC, sb,
>>>>>> + SB_CHKSUM_OFFSET);
>>>>>> + set_sb(crc, new_crc);
>>>>>> + MSG(1, "Info: SB CRC is updated (0x%x -> 0x%x)\n",
>>>>>> + old_crc, new_crc);
>>>>>> + }
>>>>>> +
>>>>>> memcpy(buf + F2FS_SUPER_OFFSET, sb, sizeof(*sb));
>>>>>> for (index = 0; index < SB_ADDR_MAX; index++) {
>>>>>> if ((1 << index) & sb_mask) {
>>>>>> @@ -575,10 +589,29 @@ static inline int sanity_check_area_boundary(struct f2fs_super_block *sb,
>>>>>> return 0;
>>>>>> }
>>>>>>
>>>>>> +static int verify_sb_chksum(struct f2fs_super_block *sb)
>>>>>> +{
>>>>>> + if (SB_CHKSUM_OFFSET != get_sb(checksum_offset)) {
>>>>>> + MSG(0, "\tInvalid SB CRC offset: %u\n",
>>>>>> + get_sb(checksum_offset));
>>>>>> + return -1;
>>>>>> + }
>>>>>> + if (f2fs_crc_valid(get_sb(crc), sb,
>>>>>> + get_sb(checksum_offset))) {
>>>>>> + MSG(0, "\tInvalid SB CRC: 0x%x\n", get_sb(crc));
>>>>>> + return -1;
>>>>>> + }
>>>>>> + return 0;
>>>>>> +}
>>>>>> +
>>>>>> int sanity_check_raw_super(struct f2fs_super_block *sb, enum SB_ADDR sb_addr)
>>>>>> {
>>>>>> unsigned int blocksize;
>>>>>>
>>>>>> + if ((get_sb(feature) & F2FS_FEATURE_SB_CHKSUM) &&
>>>>>> + verify_sb_chksum(sb))
>>>>>> + return -1;
>>>>>> +
>>>>>> if (F2FS_SUPER_MAGIC != get_sb(magic))
>>>>>> return -1;
>>>>>>
>>>>>> diff --git a/fsck/resize.c b/fsck/resize.c
>>>>>> index 5161a1f..3462165 100644
>>>>>> --- a/fsck/resize.c
>>>>>> +++ b/fsck/resize.c
>>>>>> @@ -603,9 +603,6 @@ static int f2fs_resize_grow(struct f2fs_sb_info *sbi)
>>>>>> }
>>>>>> }
>>>>>>
>>>>>> - print_raw_sb_info(sb);
>>>>>> - print_raw_sb_info(new_sb);
>>>>>
>>>>> It'd be worth to keep this to show the previous states.
>>>>>
>>>>
>>>> Here, I just want to move the printing of sb and new_sb to the place
>>>> behind update_superblock(), where the crc in sb will be updated.
>>>
>>> We'd better to see the changes, no?
>>>
>>
>> Yeah, we print sb and new_sb here just for seeing the changes of superblock.
>> However, the crc in new_sb will not be updated until calling update_superblock(),
>> so if we keep the current printing location, we can't get the changes.
>
> I mean...
> print_raw_sb_info(sb);
> print_raw_sb_info(new_sb);
I don't think it's necessary to print new_sb here.
Before update_superblock() is called, the crc in new_sb hasn't been updated yet,
and is the same with that in sb.
Here, as we introduce sb checksum, all we have to do is delay printing new_sb
to show the latest crc.
Thanks,
> update...
> print_raw_sb_info(new_sb);
>
>>
>> Thanks,
>>
>>>>
>>>>>> -
>>>>>> old_main_blkaddr = get_sb(main_blkaddr);
>>>>>> new_main_blkaddr = get_newsb(main_blkaddr);
>>>>>> offset = new_main_blkaddr - old_main_blkaddr;
>>>>>> @@ -629,6 +626,9 @@ static int f2fs_resize_grow(struct f2fs_sb_info *sbi)
>>>>>> migrate_sit(sbi, new_sb, offset_seg);
>>>>>> rebuild_checkpoint(sbi, new_sb, offset_seg);
>>>>>> update_superblock(new_sb, SB_ALL);
>>>>>> + print_raw_sb_info(sb);
>>>>>> + print_raw_sb_info(new_sb);
>>>>>> +
>>>>>> return 0;
>>>>>> }
>>>>>>
>>>>>> @@ -658,9 +658,6 @@ static int f2fs_resize_shrink(struct f2fs_sb_info *sbi)
>>>>>> }
>>>>>> }
>>>>>>
>>>>>> - print_raw_sb_info(sb);
>>>>>> - print_raw_sb_info(new_sb);
>>>>>
>>>>> Ditto.
>>>>>
>>>>>> -
>>>>>> old_main_blkaddr = get_sb(main_blkaddr);
>>>>>> new_main_blkaddr = get_newsb(main_blkaddr);
>>>>>> offset = old_main_blkaddr - new_main_blkaddr;
>>>>>> @@ -690,6 +687,9 @@ static int f2fs_resize_shrink(struct f2fs_sb_info *sbi)
>>>>>> /* move whole data region */
>>>>>> //if (err)
>>>>>> // migrate_main(sbi, offset);
>>>>>> + print_raw_sb_info(sb);
>>>>>> + print_raw_sb_info(new_sb);
>>>>>> +
>>>>>> return 0;
>>>>>> }
>>>>>>
>>>>>> diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
>>>>>> index 38a0da4..f80632a 100644
>>>>>> --- a/include/f2fs_fs.h
>>>>>> +++ b/include/f2fs_fs.h
>>>>>> @@ -279,6 +279,7 @@ static inline uint64_t bswap_64(uint64_t val)
>>>>>> #define BITS_PER_BYTE 8
>>>>>> #define F2FS_SUPER_MAGIC 0xF2F52010 /* F2FS Magic Number */
>>>>>> #define CP_CHKSUM_OFFSET 4092
>>>>>> +#define SB_CHKSUM_OFFSET 3068
>>>>>> #define MAX_PATH_LEN 64
>>>>>> #define MAX_DEVICES 8
>>>>>>
>>>>>> @@ -579,6 +580,7 @@ enum {
>>>>>> #define F2FS_FEATURE_INODE_CRTIME 0x0100
>>>>>> #define F2FS_FEATURE_LOST_FOUND 0x0200
>>>>>> #define F2FS_FEATURE_VERITY 0x0400 /* reserved */
>>>>>> +#define F2FS_FEATURE_SB_CHKSUM 0x0800
>>>>>>
>>>>>> #define MAX_VOLUME_NAME 512
>>>>>>
>>>>>> @@ -632,7 +634,8 @@ struct f2fs_super_block {
>>>>>> struct f2fs_device devs[MAX_DEVICES]; /* device list */
>>>>>> __le32 qf_ino[F2FS_MAX_QUOTAS]; /* quota inode numbers */
>>>>>> __u8 hot_ext_count; /* # of hot file extension */
>>>>>> - __u8 reserved[314]; /* valid reserved region */
>>>>>> + __u8 reserved[310]; /* valid reserved region */
>>>>>> + __le32 crc; /* checksum of superblock */
>>>>>> } __attribute__((packed));
>>>>>>
>>>>>> /*
>>>>>> @@ -1338,6 +1341,7 @@ struct feature feature_table[] = { \
>>>>>> { "inode_crtime", F2FS_FEATURE_INODE_CRTIME }, \
>>>>>> { "lost_found", F2FS_FEATURE_LOST_FOUND }, \
>>>>>> { "verity", F2FS_FEATURE_VERITY }, /* reserved */ \
>>>>>> + { "sb_checksum", F2FS_FEATURE_SB_CHKSUM }, \
>>>>>> { NULL, 0x0}, \
>>>>>> };
>>>>>>
>>>>>> diff --git a/mkfs/f2fs_format.c b/mkfs/f2fs_format.c
>>>>>> index 621126c..9b0a0d1 100644
>>>>>> --- a/mkfs/f2fs_format.c
>>>>>> +++ b/mkfs/f2fs_format.c
>>>>>> @@ -504,6 +504,14 @@ static int f2fs_prepare_super_block(void)
>>>>>>
>>>>>> sb->feature = c.feature;
>>>>>>
>>>>>> + if (get_sb(feature) & F2FS_FEATURE_SB_CHKSUM) {
>>>>>> + set_sb(checksum_offset, SB_CHKSUM_OFFSET);
>>>>>> + set_sb(crc, f2fs_cal_crc32(F2FS_SUPER_MAGIC, sb,
>>>>>> + SB_CHKSUM_OFFSET));
>>>>>> + MSG(1, "Info: SB CRC is set: offset (%d), crc (0x%x)\n",
>>>>>> + get_sb(checksum_offset), get_sb(crc));
>>>>>> + }
>>>>>> +
>>>>>> return 0;
>>>>>> }
>>>>>>
>>>>>> --
>>>>>> 2.19.0
>>>>>
>>>>> .
>>>>>
>>>>
>>>
>>> .
>>>
>>
>
> .
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 4/5] f2fs-tools: introduce sb checksum
2018-09-26 3:54 ` Junling Zheng
@ 2018-09-26 20:27 ` Jaegeuk Kim
2018-09-27 2:46 ` Junling Zheng
0 siblings, 1 reply; 14+ messages in thread
From: Jaegeuk Kim @ 2018-09-26 20:27 UTC (permalink / raw)
To: Junling Zheng; +Cc: miaoxie, linux-f2fs-devel
On 09/26, Junling Zheng wrote:
> Hi, Jaegeuk
>
> On 2018/9/26 9:57, Jaegeuk Kim wrote:
> > On 09/21, Junling Zheng wrote:
> >> On 2018/9/21 5:38, Jaegeuk Kim wrote:
> >>> On 09/20, Junling Zheng wrote:
> >>>> Hi, Jaegeuk
> >>>>
> >>>> On 2018/9/20 7:35, Jaegeuk Kim wrote:
> >>>>> On 09/19, Junling Zheng wrote:
> >>>>>> This patch introduced crc for superblock.
> >>>>>>
> >>>>>> Signed-off-by: Junling Zheng <zhengjunling@huawei.com>
> >>>>>> ---
> >>>>>> fsck/mount.c | 33 +++++++++++++++++++++++++++++++++
> >>>>>> fsck/resize.c | 12 ++++++------
> >>>>>> include/f2fs_fs.h | 6 +++++-
> >>>>>> mkfs/f2fs_format.c | 8 ++++++++
> >>>>>> 4 files changed, 52 insertions(+), 7 deletions(-)
> >>>>>>
> >>>>>> diff --git a/fsck/mount.c b/fsck/mount.c
> >>>>>> index 74ff7c6..9019921 100644
> >>>>>> --- a/fsck/mount.c
> >>>>>> +++ b/fsck/mount.c
> >>>>>> @@ -340,6 +340,7 @@ void print_raw_sb_info(struct f2fs_super_block *sb)
> >>>>>> DISP_u32(sb, node_ino);
> >>>>>> DISP_u32(sb, meta_ino);
> >>>>>> DISP_u32(sb, cp_payload);
> >>>>>> + DISP_u32(sb, crc);
> >>>>>> DISP("%-.256s", sb, version);
> >>>>>> printf("\n");
> >>>>>> }
> >>>>>> @@ -467,6 +468,9 @@ void print_sb_state(struct f2fs_super_block *sb)
> >>>>>> if (f & cpu_to_le32(F2FS_FEATURE_LOST_FOUND)) {
> >>>>>> MSG(0, "%s", " lost_found");
> >>>>>> }
> >>>>>> + if (f & cpu_to_le32(F2FS_FEATURE_SB_CHKSUM)) {
> >>>>>> + MSG(0, "%s", " sb_checksum");
> >>>>>> + }
> >>>>>> MSG(0, "\n");
> >>>>>> MSG(0, "Info: superblock encrypt level = %d, salt = ",
> >>>>>> sb->encryption_level);
> >>>>>> @@ -479,10 +483,20 @@ void update_superblock(struct f2fs_super_block *sb, int sb_mask)
> >>>>>> {
> >>>>>> int index, ret;
> >>>>>> u_int8_t *buf;
> >>>>>> + u32 old_crc, new_crc;
> >>>>>>
> >>>>>> buf = calloc(BLOCK_SZ, 1);
> >>>>>> ASSERT(buf);
> >>>>>>
> >>>>>> + if (get_sb(feature) & F2FS_FEATURE_SB_CHKSUM) {
> >>>>>> + old_crc = get_sb(crc);
> >>>>>> + new_crc = f2fs_cal_crc32(F2FS_SUPER_MAGIC, sb,
> >>>>>> + SB_CHKSUM_OFFSET);
> >>>>>> + set_sb(crc, new_crc);
> >>>>>> + MSG(1, "Info: SB CRC is updated (0x%x -> 0x%x)\n",
> >>>>>> + old_crc, new_crc);
> >>>>>> + }
> >>>>>> +
> >>>>>> memcpy(buf + F2FS_SUPER_OFFSET, sb, sizeof(*sb));
> >>>>>> for (index = 0; index < SB_ADDR_MAX; index++) {
> >>>>>> if ((1 << index) & sb_mask) {
> >>>>>> @@ -575,10 +589,29 @@ static inline int sanity_check_area_boundary(struct f2fs_super_block *sb,
> >>>>>> return 0;
> >>>>>> }
> >>>>>>
> >>>>>> +static int verify_sb_chksum(struct f2fs_super_block *sb)
> >>>>>> +{
> >>>>>> + if (SB_CHKSUM_OFFSET != get_sb(checksum_offset)) {
> >>>>>> + MSG(0, "\tInvalid SB CRC offset: %u\n",
> >>>>>> + get_sb(checksum_offset));
> >>>>>> + return -1;
> >>>>>> + }
> >>>>>> + if (f2fs_crc_valid(get_sb(crc), sb,
> >>>>>> + get_sb(checksum_offset))) {
> >>>>>> + MSG(0, "\tInvalid SB CRC: 0x%x\n", get_sb(crc));
> >>>>>> + return -1;
> >>>>>> + }
> >>>>>> + return 0;
> >>>>>> +}
> >>>>>> +
> >>>>>> int sanity_check_raw_super(struct f2fs_super_block *sb, enum SB_ADDR sb_addr)
> >>>>>> {
> >>>>>> unsigned int blocksize;
> >>>>>>
> >>>>>> + if ((get_sb(feature) & F2FS_FEATURE_SB_CHKSUM) &&
> >>>>>> + verify_sb_chksum(sb))
> >>>>>> + return -1;
> >>>>>> +
> >>>>>> if (F2FS_SUPER_MAGIC != get_sb(magic))
> >>>>>> return -1;
> >>>>>>
> >>>>>> diff --git a/fsck/resize.c b/fsck/resize.c
> >>>>>> index 5161a1f..3462165 100644
> >>>>>> --- a/fsck/resize.c
> >>>>>> +++ b/fsck/resize.c
> >>>>>> @@ -603,9 +603,6 @@ static int f2fs_resize_grow(struct f2fs_sb_info *sbi)
> >>>>>> }
> >>>>>> }
> >>>>>>
> >>>>>> - print_raw_sb_info(sb);
> >>>>>> - print_raw_sb_info(new_sb);
> >>>>>
> >>>>> It'd be worth to keep this to show the previous states.
> >>>>>
> >>>>
> >>>> Here, I just want to move the printing of sb and new_sb to the place
> >>>> behind update_superblock(), where the crc in sb will be updated.
> >>>
> >>> We'd better to see the changes, no?
> >>>
> >>
> >> Yeah, we print sb and new_sb here just for seeing the changes of superblock.
> >> However, the crc in new_sb will not be updated until calling update_superblock(),
> >> so if we keep the current printing location, we can't get the changes.
> >
> > I mean...
> > print_raw_sb_info(sb);
> > print_raw_sb_info(new_sb);
>
> I don't think it's necessary to print new_sb here.
> Before update_superblock() is called, the crc in new_sb hasn't been updated yet,
> and is the same with that in sb.
>
> Here, as we introduce sb checksum, all we have to do is delay printing new_sb
> to show the latest crc.
I see. The contents except crc in sb and new_sb weren't changed during
migration. If so, printing them later would make sense, right?
>
> Thanks,
>
> > update...
> > print_raw_sb_info(new_sb);
> >
> >>
> >> Thanks,
> >>
> >>>>
> >>>>>> -
> >>>>>> old_main_blkaddr = get_sb(main_blkaddr);
> >>>>>> new_main_blkaddr = get_newsb(main_blkaddr);
> >>>>>> offset = new_main_blkaddr - old_main_blkaddr;
> >>>>>> @@ -629,6 +626,9 @@ static int f2fs_resize_grow(struct f2fs_sb_info *sbi)
> >>>>>> migrate_sit(sbi, new_sb, offset_seg);
> >>>>>> rebuild_checkpoint(sbi, new_sb, offset_seg);
> >>>>>> update_superblock(new_sb, SB_ALL);
> >>>>>> + print_raw_sb_info(sb);
> >>>>>> + print_raw_sb_info(new_sb);
> >>>>>> +
> >>>>>> return 0;
> >>>>>> }
> >>>>>>
> >>>>>> @@ -658,9 +658,6 @@ static int f2fs_resize_shrink(struct f2fs_sb_info *sbi)
> >>>>>> }
> >>>>>> }
> >>>>>>
> >>>>>> - print_raw_sb_info(sb);
> >>>>>> - print_raw_sb_info(new_sb);
> >>>>>
> >>>>> Ditto.
> >>>>>
> >>>>>> -
> >>>>>> old_main_blkaddr = get_sb(main_blkaddr);
> >>>>>> new_main_blkaddr = get_newsb(main_blkaddr);
> >>>>>> offset = old_main_blkaddr - new_main_blkaddr;
> >>>>>> @@ -690,6 +687,9 @@ static int f2fs_resize_shrink(struct f2fs_sb_info *sbi)
> >>>>>> /* move whole data region */
> >>>>>> //if (err)
> >>>>>> // migrate_main(sbi, offset);
> >>>>>> + print_raw_sb_info(sb);
> >>>>>> + print_raw_sb_info(new_sb);
> >>>>>> +
> >>>>>> return 0;
> >>>>>> }
> >>>>>>
> >>>>>> diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
> >>>>>> index 38a0da4..f80632a 100644
> >>>>>> --- a/include/f2fs_fs.h
> >>>>>> +++ b/include/f2fs_fs.h
> >>>>>> @@ -279,6 +279,7 @@ static inline uint64_t bswap_64(uint64_t val)
> >>>>>> #define BITS_PER_BYTE 8
> >>>>>> #define F2FS_SUPER_MAGIC 0xF2F52010 /* F2FS Magic Number */
> >>>>>> #define CP_CHKSUM_OFFSET 4092
> >>>>>> +#define SB_CHKSUM_OFFSET 3068
> >>>>>> #define MAX_PATH_LEN 64
> >>>>>> #define MAX_DEVICES 8
> >>>>>>
> >>>>>> @@ -579,6 +580,7 @@ enum {
> >>>>>> #define F2FS_FEATURE_INODE_CRTIME 0x0100
> >>>>>> #define F2FS_FEATURE_LOST_FOUND 0x0200
> >>>>>> #define F2FS_FEATURE_VERITY 0x0400 /* reserved */
> >>>>>> +#define F2FS_FEATURE_SB_CHKSUM 0x0800
> >>>>>>
> >>>>>> #define MAX_VOLUME_NAME 512
> >>>>>>
> >>>>>> @@ -632,7 +634,8 @@ struct f2fs_super_block {
> >>>>>> struct f2fs_device devs[MAX_DEVICES]; /* device list */
> >>>>>> __le32 qf_ino[F2FS_MAX_QUOTAS]; /* quota inode numbers */
> >>>>>> __u8 hot_ext_count; /* # of hot file extension */
> >>>>>> - __u8 reserved[314]; /* valid reserved region */
> >>>>>> + __u8 reserved[310]; /* valid reserved region */
> >>>>>> + __le32 crc; /* checksum of superblock */
> >>>>>> } __attribute__((packed));
> >>>>>>
> >>>>>> /*
> >>>>>> @@ -1338,6 +1341,7 @@ struct feature feature_table[] = { \
> >>>>>> { "inode_crtime", F2FS_FEATURE_INODE_CRTIME }, \
> >>>>>> { "lost_found", F2FS_FEATURE_LOST_FOUND }, \
> >>>>>> { "verity", F2FS_FEATURE_VERITY }, /* reserved */ \
> >>>>>> + { "sb_checksum", F2FS_FEATURE_SB_CHKSUM }, \
> >>>>>> { NULL, 0x0}, \
> >>>>>> };
> >>>>>>
> >>>>>> diff --git a/mkfs/f2fs_format.c b/mkfs/f2fs_format.c
> >>>>>> index 621126c..9b0a0d1 100644
> >>>>>> --- a/mkfs/f2fs_format.c
> >>>>>> +++ b/mkfs/f2fs_format.c
> >>>>>> @@ -504,6 +504,14 @@ static int f2fs_prepare_super_block(void)
> >>>>>>
> >>>>>> sb->feature = c.feature;
> >>>>>>
> >>>>>> + if (get_sb(feature) & F2FS_FEATURE_SB_CHKSUM) {
> >>>>>> + set_sb(checksum_offset, SB_CHKSUM_OFFSET);
> >>>>>> + set_sb(crc, f2fs_cal_crc32(F2FS_SUPER_MAGIC, sb,
> >>>>>> + SB_CHKSUM_OFFSET));
> >>>>>> + MSG(1, "Info: SB CRC is set: offset (%d), crc (0x%x)\n",
> >>>>>> + get_sb(checksum_offset), get_sb(crc));
> >>>>>> + }
> >>>>>> +
> >>>>>> return 0;
> >>>>>> }
> >>>>>>
> >>>>>> --
> >>>>>> 2.19.0
> >>>>>
> >>>>> .
> >>>>>
> >>>>
> >>>
> >>> .
> >>>
> >>
> >
> > .
> >
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 4/5] f2fs-tools: introduce sb checksum
2018-09-26 20:27 ` Jaegeuk Kim
@ 2018-09-27 2:46 ` Junling Zheng
0 siblings, 0 replies; 14+ messages in thread
From: Junling Zheng @ 2018-09-27 2:46 UTC (permalink / raw)
To: Jaegeuk Kim; +Cc: miaoxie, linux-f2fs-devel
On 2018/9/27 4:27, Jaegeuk Kim wrote:
> On 09/26, Junling Zheng wrote:
>> Hi, Jaegeuk
>>
>> On 2018/9/26 9:57, Jaegeuk Kim wrote:
>>> On 09/21, Junling Zheng wrote:
>>>> On 2018/9/21 5:38, Jaegeuk Kim wrote:
>>>>> On 09/20, Junling Zheng wrote:
>>>>>> Hi, Jaegeuk
>>>>>>
>>>>>> On 2018/9/20 7:35, Jaegeuk Kim wrote:
>>>>>>> On 09/19, Junling Zheng wrote:
>>>>>>>> This patch introduced crc for superblock.
>>>>>>>>
>>>>>>>> Signed-off-by: Junling Zheng <zhengjunling@huawei.com>
>>>>>>>> ---
>>>>>>>> fsck/mount.c | 33 +++++++++++++++++++++++++++++++++
>>>>>>>> fsck/resize.c | 12 ++++++------
>>>>>>>> include/f2fs_fs.h | 6 +++++-
>>>>>>>> mkfs/f2fs_format.c | 8 ++++++++
>>>>>>>> 4 files changed, 52 insertions(+), 7 deletions(-)
>>>>>>>>
>>>>>>>> diff --git a/fsck/mount.c b/fsck/mount.c
>>>>>>>> index 74ff7c6..9019921 100644
>>>>>>>> --- a/fsck/mount.c
>>>>>>>> +++ b/fsck/mount.c
>>>>>>>> @@ -340,6 +340,7 @@ void print_raw_sb_info(struct f2fs_super_block *sb)
>>>>>>>> DISP_u32(sb, node_ino);
>>>>>>>> DISP_u32(sb, meta_ino);
>>>>>>>> DISP_u32(sb, cp_payload);
>>>>>>>> + DISP_u32(sb, crc);
>>>>>>>> DISP("%-.256s", sb, version);
>>>>>>>> printf("\n");
>>>>>>>> }
>>>>>>>> @@ -467,6 +468,9 @@ void print_sb_state(struct f2fs_super_block *sb)
>>>>>>>> if (f & cpu_to_le32(F2FS_FEATURE_LOST_FOUND)) {
>>>>>>>> MSG(0, "%s", " lost_found");
>>>>>>>> }
>>>>>>>> + if (f & cpu_to_le32(F2FS_FEATURE_SB_CHKSUM)) {
>>>>>>>> + MSG(0, "%s", " sb_checksum");
>>>>>>>> + }
>>>>>>>> MSG(0, "\n");
>>>>>>>> MSG(0, "Info: superblock encrypt level = %d, salt = ",
>>>>>>>> sb->encryption_level);
>>>>>>>> @@ -479,10 +483,20 @@ void update_superblock(struct f2fs_super_block *sb, int sb_mask)
>>>>>>>> {
>>>>>>>> int index, ret;
>>>>>>>> u_int8_t *buf;
>>>>>>>> + u32 old_crc, new_crc;
>>>>>>>>
>>>>>>>> buf = calloc(BLOCK_SZ, 1);
>>>>>>>> ASSERT(buf);
>>>>>>>>
>>>>>>>> + if (get_sb(feature) & F2FS_FEATURE_SB_CHKSUM) {
>>>>>>>> + old_crc = get_sb(crc);
>>>>>>>> + new_crc = f2fs_cal_crc32(F2FS_SUPER_MAGIC, sb,
>>>>>>>> + SB_CHKSUM_OFFSET);
>>>>>>>> + set_sb(crc, new_crc);
>>>>>>>> + MSG(1, "Info: SB CRC is updated (0x%x -> 0x%x)\n",
>>>>>>>> + old_crc, new_crc);
>>>>>>>> + }
>>>>>>>> +
>>>>>>>> memcpy(buf + F2FS_SUPER_OFFSET, sb, sizeof(*sb));
>>>>>>>> for (index = 0; index < SB_ADDR_MAX; index++) {
>>>>>>>> if ((1 << index) & sb_mask) {
>>>>>>>> @@ -575,10 +589,29 @@ static inline int sanity_check_area_boundary(struct f2fs_super_block *sb,
>>>>>>>> return 0;
>>>>>>>> }
>>>>>>>>
>>>>>>>> +static int verify_sb_chksum(struct f2fs_super_block *sb)
>>>>>>>> +{
>>>>>>>> + if (SB_CHKSUM_OFFSET != get_sb(checksum_offset)) {
>>>>>>>> + MSG(0, "\tInvalid SB CRC offset: %u\n",
>>>>>>>> + get_sb(checksum_offset));
>>>>>>>> + return -1;
>>>>>>>> + }
>>>>>>>> + if (f2fs_crc_valid(get_sb(crc), sb,
>>>>>>>> + get_sb(checksum_offset))) {
>>>>>>>> + MSG(0, "\tInvalid SB CRC: 0x%x\n", get_sb(crc));
>>>>>>>> + return -1;
>>>>>>>> + }
>>>>>>>> + return 0;
>>>>>>>> +}
>>>>>>>> +
>>>>>>>> int sanity_check_raw_super(struct f2fs_super_block *sb, enum SB_ADDR sb_addr)
>>>>>>>> {
>>>>>>>> unsigned int blocksize;
>>>>>>>>
>>>>>>>> + if ((get_sb(feature) & F2FS_FEATURE_SB_CHKSUM) &&
>>>>>>>> + verify_sb_chksum(sb))
>>>>>>>> + return -1;
>>>>>>>> +
>>>>>>>> if (F2FS_SUPER_MAGIC != get_sb(magic))
>>>>>>>> return -1;
>>>>>>>>
>>>>>>>> diff --git a/fsck/resize.c b/fsck/resize.c
>>>>>>>> index 5161a1f..3462165 100644
>>>>>>>> --- a/fsck/resize.c
>>>>>>>> +++ b/fsck/resize.c
>>>>>>>> @@ -603,9 +603,6 @@ static int f2fs_resize_grow(struct f2fs_sb_info *sbi)
>>>>>>>> }
>>>>>>>> }
>>>>>>>>
>>>>>>>> - print_raw_sb_info(sb);
>>>>>>>> - print_raw_sb_info(new_sb);
>>>>>>>
>>>>>>> It'd be worth to keep this to show the previous states.
>>>>>>>
>>>>>>
>>>>>> Here, I just want to move the printing of sb and new_sb to the place
>>>>>> behind update_superblock(), where the crc in sb will be updated.
>>>>>
>>>>> We'd better to see the changes, no?
>>>>>
>>>>
>>>> Yeah, we print sb and new_sb here just for seeing the changes of superblock.
>>>> However, the crc in new_sb will not be updated until calling update_superblock(),
>>>> so if we keep the current printing location, we can't get the changes.
>>>
>>> I mean...
>>> print_raw_sb_info(sb);
>>> print_raw_sb_info(new_sb);
>>
>> I don't think it's necessary to print new_sb here.
>> Before update_superblock() is called, the crc in new_sb hasn't been updated yet,
>> and is the same with that in sb.
>>
>> Here, as we introduce sb checksum, all we have to do is delay printing new_sb
>> to show the latest crc.
>
> I see. The contents except crc in sb and new_sb weren't changed during
> migration. If so, printing them later would make sense, right?
>
Yes, migration wouldn't change the contents of sb and new_sb. And besides,
in my opinion, we don't neet to print the middle status of sb and new_sb,
which would make log too long :)
>>
>> Thanks,
>>
>>> update...
>>> print_raw_sb_info(new_sb);
>>>
>>>>
>>>> Thanks,
>>>>
>>>>>>
>>>>>>>> -
>>>>>>>> old_main_blkaddr = get_sb(main_blkaddr);
>>>>>>>> new_main_blkaddr = get_newsb(main_blkaddr);
>>>>>>>> offset = new_main_blkaddr - old_main_blkaddr;
>>>>>>>> @@ -629,6 +626,9 @@ static int f2fs_resize_grow(struct f2fs_sb_info *sbi)
>>>>>>>> migrate_sit(sbi, new_sb, offset_seg);
>>>>>>>> rebuild_checkpoint(sbi, new_sb, offset_seg);
>>>>>>>> update_superblock(new_sb, SB_ALL);
>>>>>>>> + print_raw_sb_info(sb);
>>>>>>>> + print_raw_sb_info(new_sb);
>>>>>>>> +
>>>>>>>> return 0;
>>>>>>>> }
>>>>>>>>
>>>>>>>> @@ -658,9 +658,6 @@ static int f2fs_resize_shrink(struct f2fs_sb_info *sbi)
>>>>>>>> }
>>>>>>>> }
>>>>>>>>
>>>>>>>> - print_raw_sb_info(sb);
>>>>>>>> - print_raw_sb_info(new_sb);
>>>>>>>
>>>>>>> Ditto.
>>>>>>>
>>>>>>>> -
>>>>>>>> old_main_blkaddr = get_sb(main_blkaddr);
>>>>>>>> new_main_blkaddr = get_newsb(main_blkaddr);
>>>>>>>> offset = old_main_blkaddr - new_main_blkaddr;
>>>>>>>> @@ -690,6 +687,9 @@ static int f2fs_resize_shrink(struct f2fs_sb_info *sbi)
>>>>>>>> /* move whole data region */
>>>>>>>> //if (err)
>>>>>>>> // migrate_main(sbi, offset);
>>>>>>>> + print_raw_sb_info(sb);
>>>>>>>> + print_raw_sb_info(new_sb);
>>>>>>>> +
>>>>>>>> return 0;
>>>>>>>> }
>>>>>>>>
>>>>>>>> diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h
>>>>>>>> index 38a0da4..f80632a 100644
>>>>>>>> --- a/include/f2fs_fs.h
>>>>>>>> +++ b/include/f2fs_fs.h
>>>>>>>> @@ -279,6 +279,7 @@ static inline uint64_t bswap_64(uint64_t val)
>>>>>>>> #define BITS_PER_BYTE 8
>>>>>>>> #define F2FS_SUPER_MAGIC 0xF2F52010 /* F2FS Magic Number */
>>>>>>>> #define CP_CHKSUM_OFFSET 4092
>>>>>>>> +#define SB_CHKSUM_OFFSET 3068
>>>>>>>> #define MAX_PATH_LEN 64
>>>>>>>> #define MAX_DEVICES 8
>>>>>>>>
>>>>>>>> @@ -579,6 +580,7 @@ enum {
>>>>>>>> #define F2FS_FEATURE_INODE_CRTIME 0x0100
>>>>>>>> #define F2FS_FEATURE_LOST_FOUND 0x0200
>>>>>>>> #define F2FS_FEATURE_VERITY 0x0400 /* reserved */
>>>>>>>> +#define F2FS_FEATURE_SB_CHKSUM 0x0800
>>>>>>>>
>>>>>>>> #define MAX_VOLUME_NAME 512
>>>>>>>>
>>>>>>>> @@ -632,7 +634,8 @@ struct f2fs_super_block {
>>>>>>>> struct f2fs_device devs[MAX_DEVICES]; /* device list */
>>>>>>>> __le32 qf_ino[F2FS_MAX_QUOTAS]; /* quota inode numbers */
>>>>>>>> __u8 hot_ext_count; /* # of hot file extension */
>>>>>>>> - __u8 reserved[314]; /* valid reserved region */
>>>>>>>> + __u8 reserved[310]; /* valid reserved region */
>>>>>>>> + __le32 crc; /* checksum of superblock */
>>>>>>>> } __attribute__((packed));
>>>>>>>>
>>>>>>>> /*
>>>>>>>> @@ -1338,6 +1341,7 @@ struct feature feature_table[] = { \
>>>>>>>> { "inode_crtime", F2FS_FEATURE_INODE_CRTIME }, \
>>>>>>>> { "lost_found", F2FS_FEATURE_LOST_FOUND }, \
>>>>>>>> { "verity", F2FS_FEATURE_VERITY }, /* reserved */ \
>>>>>>>> + { "sb_checksum", F2FS_FEATURE_SB_CHKSUM }, \
>>>>>>>> { NULL, 0x0}, \
>>>>>>>> };
>>>>>>>>
>>>>>>>> diff --git a/mkfs/f2fs_format.c b/mkfs/f2fs_format.c
>>>>>>>> index 621126c..9b0a0d1 100644
>>>>>>>> --- a/mkfs/f2fs_format.c
>>>>>>>> +++ b/mkfs/f2fs_format.c
>>>>>>>> @@ -504,6 +504,14 @@ static int f2fs_prepare_super_block(void)
>>>>>>>>
>>>>>>>> sb->feature = c.feature;
>>>>>>>>
>>>>>>>> + if (get_sb(feature) & F2FS_FEATURE_SB_CHKSUM) {
>>>>>>>> + set_sb(checksum_offset, SB_CHKSUM_OFFSET);
>>>>>>>> + set_sb(crc, f2fs_cal_crc32(F2FS_SUPER_MAGIC, sb,
>>>>>>>> + SB_CHKSUM_OFFSET));
>>>>>>>> + MSG(1, "Info: SB CRC is set: offset (%d), crc (0x%x)\n",
>>>>>>>> + get_sb(checksum_offset), get_sb(crc));
>>>>>>>> + }
>>>>>>>> +
>>>>>>>> return 0;
>>>>>>>> }
>>>>>>>>
>>>>>>>> --
>>>>>>>> 2.19.0
>>>>>>>
>>>>>>> .
>>>>>>>
>>>>>>
>>>>>
>>>>> .
>>>>>
>>>>
>>>
>>> .
>>>
>>
>
> .
>
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2018-09-28 12:26 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-09-28 12:25 [PATCH 1/5] f2fs: support superblock checksum Junling Zheng
2018-09-28 12:25 ` [PATCH 2/5] f2fs-tools: rename CHECKSUM_OFFSET to CP_CHKSUM_OFFSET Junling Zheng
2018-09-28 12:25 ` [PATCH v2 3/5] fsck.f2fs: unify the updating of superblocks Junling Zheng
2018-09-28 12:25 ` [PATCH 4/5] f2fs-tools: introduce sb checksum Junling Zheng
2018-09-28 12:26 ` [PATCH 5/5] fsck.f2fs: try to recover cp_payload from valid cp pack Junling Zheng
-- strict thread matches above, loose matches on Subject: below --
2018-09-19 13:53 [PATCH 1/5] f2fs: support superblock checksum Junling Zheng
2018-09-19 13:53 ` [PATCH 4/5] f2fs-tools: introduce sb checksum Junling Zheng
2018-09-19 23:35 ` Jaegeuk Kim
2018-09-20 2:17 ` Junling Zheng
2018-09-20 21:38 ` Jaegeuk Kim
2018-09-21 3:09 ` Junling Zheng
2018-09-26 1:57 ` Jaegeuk Kim
2018-09-26 3:54 ` Junling Zheng
2018-09-26 20:27 ` Jaegeuk Kim
2018-09-27 2:46 ` Junling Zheng
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).