Skip to content

Commit ccfd1ca

Browse files
committed
gfs2: Replace sd_freeze_state with SDF_FROZEN flag
jira LE-1907 Rebuild_History Non-Buildable kernel-4.18.0-477.27.1.el8_8 commit-author Andreas Gruenbacher <[email protected]> commit 5432af1 Empty-Commit: Cherry-Pick Conflicts during history rebuild. Will be included in final tarball splat. Ref for failed cherry-pick at: ciq/ciq_backports/kernel-4.18.0-477.27.1.el8_8/5432af15.failed Replace sd_freeze_state with a new SDF_FROZEN flag. There no longer is a need for indicating that a freeze is in progress (SDF_STARTING_FREEZE); we are now protecting the critical sections with the sd_freeze_mutex. Signed-off-by: Andreas Gruenbacher <[email protected]> (cherry picked from commit 5432af1) Signed-off-by: Jonathan Maple <[email protected]> # Conflicts: # fs/gfs2/log.c # fs/gfs2/recovery.c # fs/gfs2/super.c # fs/gfs2/sys.c
1 parent 46e300a commit ccfd1ca

File tree

1 file changed

+351
-0
lines changed

1 file changed

+351
-0
lines changed
Lines changed: 351 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,351 @@
1+
gfs2: Replace sd_freeze_state with SDF_FROZEN flag
2+
3+
jira LE-1907
4+
Rebuild_History Non-Buildable kernel-4.18.0-477.27.1.el8_8
5+
commit-author Andreas Gruenbacher <[email protected]>
6+
commit 5432af15f8772d5e1a44d59d6ffcd513da8436b4
7+
Empty-Commit: Cherry-Pick Conflicts during history rebuild.
8+
Will be included in final tarball splat. Ref for failed cherry-pick at:
9+
ciq/ciq_backports/kernel-4.18.0-477.27.1.el8_8/5432af15.failed
10+
11+
Replace sd_freeze_state with a new SDF_FROZEN flag.
12+
13+
There no longer is a need for indicating that a freeze is in progress
14+
(SDF_STARTING_FREEZE); we are now protecting the critical sections with
15+
the sd_freeze_mutex.
16+
17+
Signed-off-by: Andreas Gruenbacher <[email protected]>
18+
(cherry picked from commit 5432af15f8772d5e1a44d59d6ffcd513da8436b4)
19+
Signed-off-by: Jonathan Maple <[email protected]>
20+
21+
# Conflicts:
22+
# fs/gfs2/log.c
23+
# fs/gfs2/recovery.c
24+
# fs/gfs2/super.c
25+
# fs/gfs2/sys.c
26+
diff --cc fs/gfs2/log.c
27+
index aded98844110,aa568796207c..000000000000
28+
--- a/fs/gfs2/log.c
29+
+++ b/fs/gfs2/log.c
30+
@@@ -875,10 -913,9 +875,14 @@@ void gfs2_write_log_header(struct gfs2_
31+
32+
static void log_write_header(struct gfs2_sbd *sdp, u32 flags)
33+
{
34+
++<<<<<<< HEAD
35+
+ int op_flags = REQ_PREFLUSH | REQ_FUA | REQ_META | REQ_SYNC;
36+
+ enum gfs2_freeze_state state = atomic_read(&sdp->sd_freeze_state);
37+
++=======
38+
+ blk_opf_t op_flags = REQ_PREFLUSH | REQ_FUA | REQ_META | REQ_SYNC;
39+
++>>>>>>> 5432af15f877 (gfs2: Replace sd_freeze_state with SDF_FROZEN flag)
40+
41+
- gfs2_assert_withdraw(sdp, (state != SFS_FROZEN));
42+
+ gfs2_assert_withdraw(sdp, !test_bit(SDF_FROZEN, &sdp->sd_flags));
43+
44+
if (test_bit(SDF_NOBARRIERS, &sdp->sd_flags)) {
45+
gfs2_ordered_wait(sdp);
46+
diff --cc fs/gfs2/recovery.c
47+
index 121d7855a3af,9c7a9f640bad..000000000000
48+
--- a/fs/gfs2/recovery.c
49+
+++ b/fs/gfs2/recovery.c
50+
@@@ -469,14 -465,14 +469,21 @@@ void gfs2_recover_func(struct work_stru
51+
ktime_ms_delta(t_jhd, t_jlck));
52+
53+
if (!(head.lh_flags & GFS2_LOG_HEAD_UNMOUNT)) {
54+
- mutex_lock(&sdp->sd_freeze_mutex);
55+
+ fs_info(sdp, "jid=%u: Acquiring the freeze glock...\n",
56+
+ jd->jd_jid);
57+
+
58+
++<<<<<<< HEAD
59+
+ /* Acquire a shared hold on the freeze glock */
60+
61+
+ error = gfs2_freeze_lock_shared(sdp, &thaw_gh, LM_FLAG_PRIORITY);
62+
+ if (error)
63+
++=======
64+
+ if (test_bit(SDF_FROZEN, &sdp->sd_flags)) {
65+
+ mutex_unlock(&sdp->sd_freeze_mutex);
66+
+ fs_warn(sdp, "jid=%u: Can't replay: filesystem "
67+
+ "is frozen\n", jd->jd_jid);
68+
++>>>>>>> 5432af15f877 (gfs2: Replace sd_freeze_state with SDF_FROZEN flag)
69+
goto fail_gunlock_ji;
70+
- }
71+
72+
if (test_bit(SDF_RORECOVERY, &sdp->sd_flags)) {
73+
ro = 1;
74+
diff --cc fs/gfs2/super.c
75+
index f0078c4bdb56,6dcbfb9b9306..000000000000
76+
--- a/fs/gfs2/super.c
77+
+++ b/fs/gfs2/super.c
78+
@@@ -679,31 -684,75 +679,99 @@@ static int gfs2_sync_fs(struct super_bl
79+
return sdp->sd_log_error;
80+
}
81+
82+
++<<<<<<< HEAD
83+
++=======
84+
+ static int gfs2_freeze_locally(struct gfs2_sbd *sdp)
85+
+ {
86+
+ struct super_block *sb = sdp->sd_vfs;
87+
+ int error;
88+
+
89+
+ error = freeze_super(sb);
90+
+ if (error)
91+
+ return error;
92+
+
93+
+ if (test_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags)) {
94+
+ gfs2_log_flush(sdp, NULL, GFS2_LOG_HEAD_FLUSH_FREEZE |
95+
+ GFS2_LFC_FREEZE_GO_SYNC);
96+
+ if (gfs2_withdrawn(sdp)) {
97+
+ thaw_super(sb);
98+
+ return -EIO;
99+
+ }
100+
+ }
101+
+ return 0;
102+
+ }
103+
+
104+
+ static int gfs2_do_thaw(struct gfs2_sbd *sdp)
105+
+ {
106+
+ struct super_block *sb = sdp->sd_vfs;
107+
+ int error;
108+
+
109+
+ error = gfs2_freeze_lock_shared(sdp, &sdp->sd_freeze_gh, 0);
110+
+ if (error)
111+
+ goto fail;
112+
+ error = thaw_super(sb);
113+
+ if (!error)
114+
+ return 0;
115+
+
116+
+ fail:
117+
+ fs_info(sdp, "GFS2: couldn't thaw filesystem: %d\n", error);
118+
+ gfs2_assert_withdraw(sdp, 0);
119+
+ return error;
120+
+ }
121+
+
122+
++>>>>>>> 5432af15f877 (gfs2: Replace sd_freeze_state with SDF_FROZEN flag)
123+
void gfs2_freeze_func(struct work_struct *work)
124+
{
125+
+ int error;
126+
+ struct gfs2_holder freeze_gh;
127+
struct gfs2_sbd *sdp = container_of(work, struct gfs2_sbd, sd_freeze_work);
128+
struct super_block *sb = sdp->sd_vfs;
129+
- int error;
130+
131+
++<<<<<<< HEAD
132+
+ atomic_inc(&sb->s_active);
133+
+ error = gfs2_freeze_lock_shared(sdp, &freeze_gh, 0);
134+
+ if (error) {
135+
+ gfs2_assert_withdraw(sdp, 0);
136+
+ } else {
137+
+ atomic_set(&sdp->sd_freeze_state, SFS_UNFROZEN);
138+
+ error = thaw_super(sb);
139+
+ if (error) {
140+
+ fs_info(sdp, "GFS2: couldn't thaw filesystem: %d\n",
141+
+ error);
142+
+ gfs2_assert_withdraw(sdp, 0);
143+
+ }
144+
+ gfs2_freeze_unlock(&freeze_gh);
145+
+ }
146+
++=======
147+
+ mutex_lock(&sdp->sd_freeze_mutex);
148+
+ error = -EBUSY;
149+
+ if (test_bit(SDF_FROZEN, &sdp->sd_flags))
150+
+ goto freeze_failed;
151+
+
152+
+ error = gfs2_freeze_locally(sdp);
153+
+ if (error)
154+
+ goto freeze_failed;
155+
+
156+
+ gfs2_freeze_unlock(&sdp->sd_freeze_gh);
157+
+ set_bit(SDF_FROZEN, &sdp->sd_flags);
158+
+
159+
+ error = gfs2_do_thaw(sdp);
160+
+ if (error)
161+
+ goto out;
162+
+
163+
+ clear_bit(SDF_FROZEN, &sdp->sd_flags);
164+
+ goto out;
165+
+
166+
+ freeze_failed:
167+
+ fs_info(sdp, "GFS2: couldn't freeze filesystem: %d\n", error);
168+
+
169+
+ out:
170+
+ mutex_unlock(&sdp->sd_freeze_mutex);
171+
++>>>>>>> 5432af15f877 (gfs2: Replace sd_freeze_state with SDF_FROZEN flag)
172+
deactivate_super(sb);
173+
+ clear_bit(SDF_FS_FROZEN, &sdp->sd_flags);
174+
+ wake_up_bit(&sdp->sd_flags, SDF_FS_FROZEN);
175+
+ return;
176+
}
177+
178+
/**
179+
@@@ -717,15 -766,17 +785,22 @@@ static int gfs2_freeze_super(struct sup
180+
struct gfs2_sbd *sdp = sb->s_fs_info;
181+
int error;
182+
183+
++<<<<<<< HEAD
184+
+ mutex_lock(&sdp->sd_freeze_mutex);
185+
+ if (atomic_read(&sdp->sd_freeze_state) != SFS_UNFROZEN) {
186+
+ error = -EBUSY;
187+
++=======
188+
+ if (!mutex_trylock(&sdp->sd_freeze_mutex))
189+
+ return -EBUSY;
190+
+ error = -EBUSY;
191+
+ if (test_bit(SDF_FROZEN, &sdp->sd_flags))
192+
++>>>>>>> 5432af15f877 (gfs2: Replace sd_freeze_state with SDF_FROZEN flag)
193+
goto out;
194+
+ }
195+
196+
for (;;) {
197+
- error = gfs2_freeze_locally(sdp);
198+
- if (error) {
199+
- fs_info(sdp, "GFS2: couldn't freeze filesystem: %d\n",
200+
- error);
201+
+ if (gfs2_withdrawn(sdp)) {
202+
+ error = -EINVAL;
203+
goto out;
204+
}
205+
206+
@@@ -745,8 -800,12 +820,15 @@@
207+
fs_err(sdp, "retrying...\n");
208+
msleep(1000);
209+
}
210+
-
211+
+ set_bit(SDF_FS_FROZEN, &sdp->sd_flags);
212+
out:
213+
++<<<<<<< HEAD
214+
++=======
215+
+ if (!error) {
216+
+ set_bit(SDF_FREEZE_INITIATOR, &sdp->sd_flags);
217+
+ set_bit(SDF_FROZEN, &sdp->sd_flags);
218+
+ }
219+
++>>>>>>> 5432af15f877 (gfs2: Replace sd_freeze_state with SDF_FROZEN flag)
220+
mutex_unlock(&sdp->sd_freeze_mutex);
221+
return error;
222+
}
223+
@@@ -760,17 -819,39 +842,44 @@@
224+
static int gfs2_thaw_super(struct super_block *sb)
225+
{
226+
struct gfs2_sbd *sdp = sb->s_fs_info;
227+
++<<<<<<< HEAD
228+
++=======
229+
+ int error;
230+
+
231+
+ if (!mutex_trylock(&sdp->sd_freeze_mutex))
232+
+ return -EBUSY;
233+
+ error = -EINVAL;
234+
+ if (!test_bit(SDF_FREEZE_INITIATOR, &sdp->sd_flags))
235+
+ goto out;
236+
+
237+
+ gfs2_freeze_unlock(&sdp->sd_freeze_gh);
238+
+
239+
+ error = gfs2_do_thaw(sdp);
240+
+
241+
+ if (!error) {
242+
+ clear_bit(SDF_FREEZE_INITIATOR, &sdp->sd_flags);
243+
+ clear_bit(SDF_FROZEN, &sdp->sd_flags);
244+
+ }
245+
+ out:
246+
+ mutex_unlock(&sdp->sd_freeze_mutex);
247+
+ return error;
248+
+ }
249+
+
250+
+ void gfs2_thaw_freeze_initiator(struct super_block *sb)
251+
+ {
252+
+ struct gfs2_sbd *sdp = sb->s_fs_info;
253+
++>>>>>>> 5432af15f877 (gfs2: Replace sd_freeze_state with SDF_FROZEN flag)
254+
255+
mutex_lock(&sdp->sd_freeze_mutex);
256+
- if (!test_bit(SDF_FREEZE_INITIATOR, &sdp->sd_flags))
257+
- goto out;
258+
+ if (atomic_read(&sdp->sd_freeze_state) != SFS_FROZEN ||
259+
+ !gfs2_holder_initialized(&sdp->sd_freeze_gh)) {
260+
+ mutex_unlock(&sdp->sd_freeze_mutex);
261+
+ return -EINVAL;
262+
+ }
263+
264+
gfs2_freeze_unlock(&sdp->sd_freeze_gh);
265+
-
266+
-out:
267+
mutex_unlock(&sdp->sd_freeze_mutex);
268+
+ return wait_on_bit(&sdp->sd_flags, SDF_FS_FROZEN, TASK_INTERRUPTIBLE);
269+
}
270+
271+
/**
272+
diff --cc fs/gfs2/sys.c
273+
index 72a071f12c50,2dfbe2f188dd..000000000000
274+
--- a/fs/gfs2/sys.c
275+
+++ b/fs/gfs2/sys.c
276+
@@@ -114,7 -112,8 +115,12 @@@ static ssize_t status_show(struct gfs2_
277+
test_bit(SDF_RORECOVERY, &f),
278+
test_bit(SDF_SKIP_DLM_UNLOCK, &f),
279+
test_bit(SDF_FORCE_AIL_FLUSH, &f),
280+
++<<<<<<< HEAD
281+
+ test_bit(SDF_FS_FROZEN, &f),
282+
++=======
283+
+ test_bit(SDF_FREEZE_INITIATOR, &f),
284+
+ test_bit(SDF_FROZEN, &f),
285+
++>>>>>>> 5432af15f877 (gfs2: Replace sd_freeze_state with SDF_FROZEN flag)
286+
test_bit(SDF_WITHDRAWING, &f),
287+
test_bit(SDF_WITHDRAW_IN_PROG, &f),
288+
test_bit(SDF_REMOTE_WITHDRAW, &f),
289+
diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h
290+
index a5f7b8007a85..377e51027c17 100644
291+
--- a/fs/gfs2/incore.h
292+
+++ b/fs/gfs2/incore.h
293+
@@ -613,12 +613,7 @@ enum {
294+
withdrawing */
295+
SDF_DEACTIVATING = 15,
296+
SDF_EVICTING = 16,
297+
-};
298+
-
299+
-enum gfs2_freeze_state {
300+
- SFS_UNFROZEN = 0,
301+
- SFS_STARTING_FREEZE = 1,
302+
- SFS_FROZEN = 2,
303+
+ SDF_FROZEN = 17,
304+
};
305+
306+
#define GFS2_FSNAME_LEN 256
307+
@@ -845,7 +840,6 @@ struct gfs2_sbd {
308+
309+
/* For quiescing the filesystem */
310+
struct gfs2_holder sd_freeze_gh;
311+
- atomic_t sd_freeze_state;
312+
struct mutex sd_freeze_mutex;
313+
314+
char sd_fsname[GFS2_FSNAME_LEN + 3 * sizeof(int) + 2];
315+
* Unmerged path fs/gfs2/log.c
316+
diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c
317+
index 698fc2257f73..411d715452fb 100644
318+
--- a/fs/gfs2/ops_fstype.c
319+
+++ b/fs/gfs2/ops_fstype.c
320+
@@ -137,7 +137,6 @@ static struct gfs2_sbd *init_sbd(struct super_block *sb)
321+
init_rwsem(&sdp->sd_log_flush_lock);
322+
atomic_set(&sdp->sd_log_in_flight, 0);
323+
init_waitqueue_head(&sdp->sd_log_flush_wait);
324+
- atomic_set(&sdp->sd_freeze_state, SFS_UNFROZEN);
325+
mutex_init(&sdp->sd_freeze_mutex);
326+
327+
return sdp;
328+
* Unmerged path fs/gfs2/recovery.c
329+
* Unmerged path fs/gfs2/super.c
330+
* Unmerged path fs/gfs2/sys.c
331+
diff --git a/fs/gfs2/trans.c b/fs/gfs2/trans.c
332+
index d4cda4f24672..2b56da538007 100644
333+
--- a/fs/gfs2/trans.c
334+
+++ b/fs/gfs2/trans.c
335+
@@ -236,7 +236,6 @@ void gfs2_trans_add_meta(struct gfs2_glock *gl, struct buffer_head *bh)
336+
struct gfs2_bufdata *bd;
337+
struct gfs2_meta_header *mh;
338+
struct gfs2_trans *tr = current->journal_info;
339+
- enum gfs2_freeze_state state = atomic_read(&sdp->sd_freeze_state);
340+
341+
lock_buffer(bh);
342+
if (buffer_pinned(bh)) {
343+
@@ -270,7 +269,7 @@ void gfs2_trans_add_meta(struct gfs2_glock *gl, struct buffer_head *bh)
344+
(unsigned long long)bd->bd_bh->b_blocknr);
345+
BUG();
346+
}
347+
- if (unlikely(state == SFS_FROZEN)) {
348+
+ if (unlikely(test_bit(SDF_FROZEN, &sdp->sd_flags))) {
349+
fs_info(sdp, "GFS2:adding buf while frozen\n");
350+
gfs2_assert_withdraw(sdp, 0);
351+
}

0 commit comments

Comments
 (0)