]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/4.4.172/f2fs-give-einval-for-norecovery-and-rw-mount.patch
4.14-stable patches
[thirdparty/kernel/stable-queue.git] / releases / 4.4.172 / f2fs-give-einval-for-norecovery-and-rw-mount.patch
CommitLineData
c2a518a0
GKH
1From foo@baz Fri Jan 18 09:16:11 CET 2019
2From: Jaegeuk Kim <jaegeuk@kernel.org>
3Date: Wed, 23 Mar 2016 16:12:58 -0700
4Subject: f2fs: give -EINVAL for norecovery and rw mount
5
6From: Jaegeuk Kim <jaegeuk@kernel.org>
7
8commit 6781eabba1bdb133eb9125c4acf6704ccbe4df02 upstream.
9
10Once detecting something to recover, f2fs should stop mounting, given norecovery
11and rw mount options.
12
13Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
14Signed-off-by: Ben Hutchings <ben.hutchings@codethink.co.uk>
15Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
16---
17 fs/f2fs/f2fs.h | 2 +-
18 fs/f2fs/recovery.c | 11 +++++++----
19 fs/f2fs/super.c | 14 ++++++++++++--
20 3 files changed, 20 insertions(+), 7 deletions(-)
21
22--- a/fs/f2fs/f2fs.h
23+++ b/fs/f2fs/f2fs.h
24@@ -1867,7 +1867,7 @@ void build_gc_manager(struct f2fs_sb_inf
25 /*
26 * recovery.c
27 */
28-int recover_fsync_data(struct f2fs_sb_info *);
29+int recover_fsync_data(struct f2fs_sb_info *, bool);
30 bool space_for_roll_forward(struct f2fs_sb_info *);
31
32 /*
33--- a/fs/f2fs/recovery.c
34+++ b/fs/f2fs/recovery.c
35@@ -524,12 +524,13 @@ next:
36 return err;
37 }
38
39-int recover_fsync_data(struct f2fs_sb_info *sbi)
40+int recover_fsync_data(struct f2fs_sb_info *sbi, bool check_only)
41 {
42 struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_WARM_NODE);
43 struct list_head inode_list;
44 block_t blkaddr;
45 int err;
46+ int ret = 0;
47 bool need_writecp = false;
48
49 fsync_entry_slab = f2fs_kmem_cache_create("f2fs_fsync_inode_entry",
50@@ -546,11 +547,13 @@ int recover_fsync_data(struct f2fs_sb_in
51
52 /* step #1: find fsynced inode numbers */
53 err = find_fsync_dnodes(sbi, &inode_list);
54- if (err)
55+ if (err || list_empty(&inode_list))
56 goto out;
57
58- if (list_empty(&inode_list))
59+ if (check_only) {
60+ ret = 1;
61 goto out;
62+ }
63
64 need_writecp = true;
65
66@@ -598,5 +601,5 @@ out:
67 } else {
68 mutex_unlock(&sbi->cp_mutex);
69 }
70- return err;
71+ return ret ? ret: err;
72 }
73--- a/fs/f2fs/super.c
74+++ b/fs/f2fs/super.c
75@@ -1457,14 +1457,24 @@ try_onemore:
76 if (need_fsck)
77 set_sbi_flag(sbi, SBI_NEED_FSCK);
78
79- err = recover_fsync_data(sbi);
80- if (err) {
81+ err = recover_fsync_data(sbi, false);
82+ if (err < 0) {
83 need_fsck = true;
84 f2fs_msg(sb, KERN_ERR,
85 "Cannot recover all fsync data errno=%ld", err);
86 goto free_kobj;
87 }
88+ } else {
89+ err = recover_fsync_data(sbi, true);
90+
91+ if (!f2fs_readonly(sb) && err > 0) {
92+ err = -EINVAL;
93+ f2fs_msg(sb, KERN_ERR,
94+ "Need to recover fsync data");
95+ goto free_kobj;
96+ }
97 }
98+
99 /* recover_fsync_data() cleared this already */
100 clear_sbi_flag(sbi, SBI_POR_DOING);
101