Lines Matching +full:keep +full:- +full:a +full:- +full:live

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
4 * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved.
45 * check_journal_clean - Make sure a journal is clean for a spectator mount
60 ip = GFS2_I(jd->jd_inode); in check_journal_clean()
61 error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_NOEXP | in check_journal_clean()
67 return -EPERM; in check_journal_clean()
84 error = -EPERM; in check_journal_clean()
87 "mounter must not be a spectator.\n", in check_journal_clean()
88 jd->jd_jid); in check_journal_clean()
97 * gfs2_freeze_lock_shared - hold the freeze glock
105 error = gfs2_glock_nq_init(sdp->sd_freeze_gl, LM_ST_SHARED, flags, in gfs2_freeze_lock_shared()
106 &sdp->sd_freeze_gh); in gfs2_freeze_lock_shared()
114 if (gfs2_holder_initialized(&sdp->sd_freeze_gh)) in gfs2_freeze_unlock()
115 gfs2_glock_dq_uninit(&sdp->sd_freeze_gh); in gfs2_freeze_unlock()
120 struct gfs2_glock *live_gl = sdp->sd_live_gh.gh_gl; in signal_our_withdraw()
128 if (test_bit(SDF_NORECOVERY, &sdp->sd_flags) || !sdp->sd_jdesc) in signal_our_withdraw()
132 inode = sdp->sd_jdesc->jd_inode; in signal_our_withdraw()
134 i_gl = ip->i_gl; in signal_our_withdraw()
135 no_formal_ino = ip->i_no_formal_ino; in signal_our_withdraw()
138 set_bit(SDF_WITHDRAW_RECOVERY, &sdp->sd_flags); in signal_our_withdraw()
143 * file system read-only will flush the journal, etc. in signal_our_withdraw()
145 * During a normal unmount, gfs2_make_fs_ro calls gfs2_log_shutdown in signal_our_withdraw()
146 * which clears SDF_JOURNAL_LIVE. In a withdraw, we must not write in signal_our_withdraw()
150 clear_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags); in signal_our_withdraw()
151 if (!sb_rdonly(sdp->sd_vfs)) { in signal_our_withdraw()
152 bool locked = mutex_trylock(&sdp->sd_freeze_mutex); in signal_our_withdraw()
154 wake_up(&sdp->sd_logd_waitq); in signal_our_withdraw()
155 wake_up(&sdp->sd_quota_wait); in signal_our_withdraw()
157 wait_event_timeout(sdp->sd_log_waitq, in signal_our_withdraw()
161 sdp->sd_vfs->s_flags |= SB_RDONLY; in signal_our_withdraw()
164 mutex_unlock(&sdp->sd_freeze_mutex); in signal_our_withdraw()
167 * Dequeue any pending non-system glock holders that can no in signal_our_withdraw()
173 if (sdp->sd_lockstruct.ls_ops->lm_lock == NULL) { /* lock_nolock */ in signal_our_withdraw()
175 ret = -EIO; in signal_our_withdraw()
176 clear_bit(SDF_WITHDRAW_RECOVERY, &sdp->sd_flags); in signal_our_withdraw()
182 if (gfs2_holder_initialized(&sdp->sd_journal_gh)) { in signal_our_withdraw()
183 gfs2_glock_dq_wait(&sdp->sd_journal_gh); in signal_our_withdraw()
184 gfs2_holder_uninit(&sdp->sd_journal_gh); in signal_our_withdraw()
186 sdp->sd_jinode_gh.gh_flags |= GL_NOCACHE; in signal_our_withdraw()
187 gfs2_glock_dq(&sdp->sd_jinode_gh); in signal_our_withdraw()
188 gfs2_thaw_freeze_initiator(sdp->sd_vfs); in signal_our_withdraw()
189 wait_on_bit(&i_gl->gl_flags, GLF_DEMOTE, TASK_UNINTERRUPTIBLE); in signal_our_withdraw()
194 gfs2_holder_uninit(&sdp->sd_jinode_gh); in signal_our_withdraw()
203 sdp->sd_jdesc->jd_inode = NULL; in signal_our_withdraw()
209 if (i_gl->gl_ops->go_unlocked) { in signal_our_withdraw()
210 set_bit(GLF_UNLOCKED, &i_gl->gl_flags); in signal_our_withdraw()
211 wait_on_bit(&i_gl->gl_flags, GLF_UNLOCKED, TASK_UNINTERRUPTIBLE); in signal_our_withdraw()
215 * Dequeue the "live" glock, but keep a reference so it's never freed. in signal_our_withdraw()
218 gfs2_glock_dq_wait(&sdp->sd_live_gh); in signal_our_withdraw()
220 * We enqueue the "live" glock in EX so that all other nodes in signal_our_withdraw()
221 * get a demote request and act on it. We don't really want the in signal_our_withdraw()
222 * lock in EX, so we send a "try" lock with 1CB to produce a callback. in signal_our_withdraw()
225 sdp->sd_lockstruct.ls_jid); in signal_our_withdraw()
228 &sdp->sd_live_gh); in signal_our_withdraw()
231 * This will likely fail in a cluster, but succeed standalone: in signal_our_withdraw()
233 ret = gfs2_glock_nq(&sdp->sd_live_gh); in signal_our_withdraw()
236 * If we actually got the "live" lock in EX mode, there are no other in signal_our_withdraw()
238 * ourselves. We hold the "live" glock to prevent other mounters in signal_our_withdraw()
247 "own journal jid %d.\n", sdp->sd_lockstruct.ls_jid); in signal_our_withdraw()
248 if (gfs2_recover_journal(sdp->sd_jdesc, 1)) in signal_our_withdraw()
250 sdp->sd_lockstruct.ls_jid); in signal_our_withdraw()
251 gfs2_glock_dq_wait(&sdp->sd_live_gh); in signal_our_withdraw()
254 &sdp->sd_live_gh); in signal_our_withdraw()
255 gfs2_glock_nq(&sdp->sd_live_gh); in signal_our_withdraw()
259 clear_bit(SDF_WITHDRAW_RECOVERY, &sdp->sd_flags); in signal_our_withdraw()
262 * At this point our journal is evicted, so we need to get a new inode in signal_our_withdraw()
266 * Note that we don't really want it to look up a FREE block. The in signal_our_withdraw()
267 * GFS2_BLKST_FREE simply overrides a block check in gfs2_inode_lookup in signal_our_withdraw()
269 * glock, which would fail with -EIO because we're withdrawing. in signal_our_withdraw()
271 inode = gfs2_inode_lookup(sdp->sd_vfs, DT_UNKNOWN, in signal_our_withdraw()
272 sdp->sd_jdesc->jd_no_addr, no_formal_ino, in signal_our_withdraw()
276 sdp->sd_lockstruct.ls_jid, PTR_ERR(inode)); in signal_our_withdraw()
279 sdp->sd_jdesc->jd_inode = inode; in signal_our_withdraw()
286 ret = check_journal_clean(sdp, sdp->sd_jdesc, false); in signal_our_withdraw()
291 sdp->sd_lockstruct.ls_jid); in signal_our_withdraw()
296 sdp->sd_lockstruct.ls_jid); in signal_our_withdraw()
299 "mount.\n", sdp->sd_lockstruct.ls_jid); in signal_our_withdraw()
300 fs_warn(sdp, "Glock dequeues delayed: %lu\n", sdp->sd_glock_dqs_held); in signal_our_withdraw()
301 sdp->sd_glock_dqs_held = 0; in signal_our_withdraw()
302 wake_up_bit(&sdp->sd_flags, SDF_WITHDRAW_RECOVERY); in signal_our_withdraw()
310 if (sdp->sd_args.ar_errors == GFS2_ERRORS_WITHDRAW && in gfs2_lm()
311 test_bit(SDF_WITHDRAWN, &sdp->sd_flags)) in gfs2_lm()
323 struct lm_lockstruct *ls = &sdp->sd_lockstruct; in gfs2_withdraw()
324 const struct lm_lockops *lm = ls->ls_ops; in gfs2_withdraw()
326 if (sdp->sd_args.ar_errors == GFS2_ERRORS_WITHDRAW) { in gfs2_withdraw()
327 unsigned long old = READ_ONCE(sdp->sd_flags), new; in gfs2_withdraw()
331 wait_on_bit(&sdp->sd_flags, in gfs2_withdraw()
334 return -1; in gfs2_withdraw()
337 } while (unlikely(!try_cmpxchg(&sdp->sd_flags, &old, new))); in gfs2_withdraw()
340 BUG_ON(sdp->sd_args.ar_debug); in gfs2_withdraw()
344 kobject_uevent(&sdp->sd_kobj, KOBJ_OFFLINE); in gfs2_withdraw()
346 if (!strcmp(sdp->sd_lockstruct.ls_ops->lm_proto_name, "lock_dlm")) in gfs2_withdraw()
347 wait_for_completion(&sdp->sd_wdack); in gfs2_withdraw()
349 if (lm->lm_unmount) { in gfs2_withdraw()
351 lm->lm_unmount(sdp); in gfs2_withdraw()
355 clear_bit(SDF_WITHDRAW_IN_PROG, &sdp->sd_flags); in gfs2_withdraw()
357 wake_up_bit(&sdp->sd_flags, SDF_WITHDRAW_IN_PROG); in gfs2_withdraw()
360 if (sdp->sd_args.ar_errors == GFS2_ERRORS_PANIC) in gfs2_withdraw()
361 panic("GFS2: fsid=%s: panic requested\n", sdp->sd_fsname); in gfs2_withdraw()
363 return -1; in gfs2_withdraw()
367 * gfs2_assert_withdraw_i - Cause the machine to withdraw if @assertion is false
378 "fatal: assertion \"%s\" failed - " in gfs2_assert_withdraw_i()
386 if (sdp->sd_args.ar_errors == GFS2_ERRORS_PANIC) in gfs2_assert_withdraw_i()
397 * gfs2_assert_warn_i - Print a message to the console if @assertion is false
404 sdp->sd_last_warning + in gfs2_assert_warn_i()
408 if (sdp->sd_args.ar_errors == GFS2_ERRORS_WITHDRAW) in gfs2_assert_warn_i()
409 fs_warn(sdp, "warning: assertion \"%s\" failed - " in gfs2_assert_warn_i()
413 if (sdp->sd_args.ar_debug) in gfs2_assert_warn_i()
418 if (sdp->sd_args.ar_errors == GFS2_ERRORS_PANIC) in gfs2_assert_warn_i()
419 panic("GFS2: fsid=%s: warning: assertion \"%s\" failed - " in gfs2_assert_warn_i()
421 sdp->sd_fsname, assertion, in gfs2_assert_warn_i()
424 sdp->sd_last_warning = jiffies; in gfs2_assert_warn_i()
428 * gfs2_consist_i - Flag a filesystem consistency error and withdraw
435 "fatal: filesystem consistency error - " in gfs2_consist_i()
442 * gfs2_consist_inode_i - Flag an inode consistency error and withdraw
448 struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); in gfs2_consist_inode_i()
451 "fatal: filesystem consistency error - " in gfs2_consist_inode_i()
454 (unsigned long long)ip->i_no_formal_ino, in gfs2_consist_inode_i()
455 (unsigned long long)ip->i_no_addr, in gfs2_consist_inode_i()
457 gfs2_dump_glock(NULL, ip->i_gl, 1); in gfs2_consist_inode_i()
462 * gfs2_consist_rgrpd_i - Flag a RG consistency error and withdraw
468 struct gfs2_sbd *sdp = rgd->rd_sbd; in gfs2_consist_rgrpd_i()
469 char fs_id_buf[sizeof(sdp->sd_fsname) + 7]; in gfs2_consist_rgrpd_i()
471 sprintf(fs_id_buf, "fsid=%s: ", sdp->sd_fsname); in gfs2_consist_rgrpd_i()
474 "fatal: filesystem consistency error - " in gfs2_consist_rgrpd_i()
477 (unsigned long long)rgd->rd_addr, in gfs2_consist_rgrpd_i()
479 gfs2_dump_glock(NULL, rgd->rd_gl, 1); in gfs2_consist_rgrpd_i()
484 * gfs2_meta_check_ii - Flag a magic number consistency error and withdraw
485 * Returns: -1 if this call withdrew the machine,
486 * -2 if it was already withdrawn
496 "fatal: invalid metadata block - " in gfs2_meta_check_ii()
499 (unsigned long long)bh->b_blocknr, in gfs2_meta_check_ii()
502 return (me) ? -1 : -2; in gfs2_meta_check_ii()
506 * gfs2_metatype_check_ii - Flag a metadata type consistency error and withdraw
507 * Returns: -1 if this call withdrew the machine,
508 * -2 if it was already withdrawn
518 "fatal: invalid metadata block - " in gfs2_metatype_check_ii()
521 (unsigned long long)bh->b_blocknr, type, t, in gfs2_metatype_check_ii()
524 return (me) ? -1 : -2; in gfs2_metatype_check_ii()
528 * gfs2_io_error_i - Flag an I/O error and withdraw
529 * Returns: -1 if this call withdrew the machine,
537 "fatal: I/O error - " in gfs2_io_error_i()
544 * gfs2_io_error_bh_i - Flag a buffer I/O error
555 fs_err(sdp, "fatal: I/O error - " in gfs2_io_error_bh_i()
558 (unsigned long long)bh->b_blocknr, function, file, line); in gfs2_io_error_bh_i()