|
| 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