Skip to content

Commit 6781eab

Browse files
author
Jaegeuk Kim
committed
f2fs: give -EINVAL for norecovery and rw mount
Once detecting something to recover, f2fs should stop mounting, given norecovery and rw mount options. Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
1 parent df728b0 commit 6781eab

File tree

3 files changed

+20
-7
lines changed

3 files changed

+20
-7
lines changed

fs/f2fs/f2fs.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1907,7 +1907,7 @@ void build_gc_manager(struct f2fs_sb_info *);
19071907
/*
19081908
* recovery.c
19091909
*/
1910-
int recover_fsync_data(struct f2fs_sb_info *);
1910+
int recover_fsync_data(struct f2fs_sb_info *, bool);
19111911
bool space_for_roll_forward(struct f2fs_sb_info *);
19121912

19131913
/*

fs/f2fs/recovery.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -551,12 +551,13 @@ static int recover_data(struct f2fs_sb_info *sbi, struct list_head *head)
551551
return err;
552552
}
553553

554-
int recover_fsync_data(struct f2fs_sb_info *sbi)
554+
int recover_fsync_data(struct f2fs_sb_info *sbi, bool check_only)
555555
{
556556
struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_WARM_NODE);
557557
struct list_head inode_list;
558558
block_t blkaddr;
559559
int err;
560+
int ret = 0;
560561
bool need_writecp = false;
561562

562563
fsync_entry_slab = f2fs_kmem_cache_create("f2fs_fsync_inode_entry",
@@ -573,11 +574,13 @@ int recover_fsync_data(struct f2fs_sb_info *sbi)
573574

574575
/* step #1: find fsynced inode numbers */
575576
err = find_fsync_dnodes(sbi, &inode_list);
576-
if (err)
577+
if (err || list_empty(&inode_list))
577578
goto out;
578579

579-
if (list_empty(&inode_list))
580+
if (check_only) {
581+
ret = 1;
580582
goto out;
583+
}
581584

582585
need_writecp = true;
583586

@@ -625,5 +628,5 @@ int recover_fsync_data(struct f2fs_sb_info *sbi)
625628
} else {
626629
mutex_unlock(&sbi->cp_mutex);
627630
}
628-
return err;
631+
return ret ? ret: err;
629632
}

fs/f2fs/super.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1562,14 +1562,24 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent)
15621562
if (need_fsck)
15631563
set_sbi_flag(sbi, SBI_NEED_FSCK);
15641564

1565-
err = recover_fsync_data(sbi);
1566-
if (err) {
1565+
err = recover_fsync_data(sbi, false);
1566+
if (err < 0) {
15671567
need_fsck = true;
15681568
f2fs_msg(sb, KERN_ERR,
15691569
"Cannot recover all fsync data errno=%ld", err);
15701570
goto free_kobj;
15711571
}
1572+
} else {
1573+
err = recover_fsync_data(sbi, true);
1574+
1575+
if (!f2fs_readonly(sb) && err > 0) {
1576+
err = -EINVAL;
1577+
f2fs_msg(sb, KERN_ERR,
1578+
"Need to recover fsync data");
1579+
goto free_kobj;
1580+
}
15721581
}
1582+
15731583
/* recover_fsync_data() cleared this already */
15741584
clear_sbi_flag(sbi, SBI_POR_DOING);
15751585

0 commit comments

Comments
 (0)