aboutsummaryrefslogtreecommitdiffstats
path: root/fsck
diff options
context:
space:
mode:
authorJaegeuk Kim <jaegeuk@kernel.org>2014-11-06 19:34:40 -0800
committerJP Abgrall <jpa@google.com>2015-03-23 10:10:26 -0700
commitc07795e73cbc509286e35193759e80d65ee12a44 (patch)
treead84c5484be8c3aca3f7ec957a16f9b2891a50ac /fsck
parentf54dd91d065c15b84686a3fde7a096786e368201 (diff)
downloadandroid_external_f2fs-tools-c07795e73cbc509286e35193759e80d65ee12a44.tar.gz
android_external_f2fs-tools-c07795e73cbc509286e35193759e80d65ee12a44.tar.bz2
android_external_f2fs-tools-c07795e73cbc509286e35193759e80d65ee12a44.zip
fsck.f2fs: trigger fsck.f2fs when new change was made
This patch remains user specified triggering information in superblock. Then, if the information was changed, fsck.f2fs is triggered. Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Diffstat (limited to 'fsck')
-rw-r--r--fsck/mount.c31
1 files changed, 30 insertions, 1 deletions
diff --git a/fsck/mount.c b/fsck/mount.c
index 9a9c842..37bd8c7 100644
--- a/fsck/mount.c
+++ b/fsck/mount.c
@@ -133,6 +133,7 @@ void print_raw_sb_info(struct f2fs_sb_info *sbi)
DISP_u32(sb, node_ino);
DISP_u32(sb, meta_ino);
DISP_u32(sb, cp_payload);
+ DISP("%s", sb, version);
printf("\n");
}
@@ -225,6 +226,7 @@ int sanity_check_raw_super(struct f2fs_super_block *raw_super)
int validate_super_block(struct f2fs_sb_info *sbi, int block)
{
u64 offset;
+
sbi->raw_super = malloc(sizeof(struct f2fs_super_block));
if (block == 0)
@@ -235,8 +237,35 @@ int validate_super_block(struct f2fs_sb_info *sbi, int block)
if (dev_read(sbi->raw_super, offset, sizeof(struct f2fs_super_block)))
return -1;
- if (!sanity_check_raw_super(sbi->raw_super))
+ if (!sanity_check_raw_super(sbi->raw_super)) {
+ /* get kernel version */
+ if (config.kd >= 0) {
+ dev_read_version(config.version, 0, VERSION_LEN);
+ get_kernel_version(config.version);
+ } else {
+ memset(config.version, 0, VERSION_LEN);
+ }
+
+ /* build sb version */
+ memcpy(config.sb_version, sbi->raw_super->version, VERSION_LEN);
+ get_kernel_version(config.sb_version);
+
+ MSG(0, "Info: FSCK version\n from \"%s\"\n to \"%s\"\n",
+ config.sb_version, config.version);
+ if (memcmp(config.sb_version, config.version, VERSION_LEN)) {
+ int ret;
+
+ memcpy(sbi->raw_super->version,
+ config.version, VERSION_LEN);
+ ret = dev_write(sbi->raw_super, offset,
+ sizeof(struct f2fs_super_block));
+ ASSERT(ret >= 0);
+
+ config.auto_fix = 0;
+ config.fix_on = 1;
+ }
return 0;
+ }
free(sbi->raw_super);
MSG(0, "\tCan't find a valid F2FS superblock at 0x%x\n", block);