blob: 1cd0328cae20a4d08183adca3022d4e69d9a45d3 [file] [log] [blame]
Thomas Gleixner7336d0e2019-05-31 01:09:56 -07001// SPDX-License-Identifier: GPL-2.0-only
David Teiglandb3b94fa2006-01-16 16:50:04 +00002/*
3 * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
Steven Whitehouse3a8a9a12006-05-18 15:09:15 -04004 * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved.
David Teiglandb3b94fa2006-01-16 16:50:04 +00005 */
6
Joe Perchesd77d1b52014-03-06 12:10:45 -08007#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
8
David Teiglandb3b94fa2006-01-16 16:50:04 +00009#include <linux/spinlock.h>
10#include <linux/completion.h>
11#include <linux/buffer_head.h>
12#include <linux/crc32.h>
Steven Whitehouse5c676f62006-02-27 17:23:27 -050013#include <linux/gfs2_ondisk.h>
Bob Peterson601ef0d2020-01-28 20:23:45 +010014#include <linux/delay.h>
Linus Torvalds7c0f6ba2016-12-24 11:46:01 -080015#include <linux/uaccess.h>
David Teiglandb3b94fa2006-01-16 16:50:04 +000016
17#include "gfs2.h"
Steven Whitehouse5c676f62006-02-27 17:23:27 -050018#include "incore.h"
David Teiglandb3b94fa2006-01-16 16:50:04 +000019#include "glock.h"
Bob Peterson601ef0d2020-01-28 20:23:45 +010020#include "glops.h"
21#include "log.h"
Bob Peterson0d910612019-02-18 08:37:25 -070022#include "lops.h"
23#include "recovery.h"
Bob Peterson72244b62018-08-15 12:09:49 -050024#include "rgrp.h"
Bob Peterson0d910612019-02-18 08:37:25 -070025#include "super.h"
Steven Whitehouse5c676f62006-02-27 17:23:27 -050026#include "util.h"
David Teiglandb3b94fa2006-01-16 16:50:04 +000027
Christoph Lametere18b8902006-12-06 20:33:20 -080028struct kmem_cache *gfs2_glock_cachep __read_mostly;
Steven Whitehouse009d8512009-12-08 12:12:13 +000029struct kmem_cache *gfs2_glock_aspace_cachep __read_mostly;
Christoph Lametere18b8902006-12-06 20:33:20 -080030struct kmem_cache *gfs2_inode_cachep __read_mostly;
31struct kmem_cache *gfs2_bufdata_cachep __read_mostly;
Bob Peterson6bdd9be2008-01-28 17:20:26 -060032struct kmem_cache *gfs2_rgrpd_cachep __read_mostly;
Steven Whitehouse37b2c832008-11-17 14:25:37 +000033struct kmem_cache *gfs2_quotad_cachep __read_mostly;
Bob Petersonb54e9a02015-10-26 10:40:28 -050034struct kmem_cache *gfs2_qadata_cachep __read_mostly;
Bob Petersonb839dad2019-04-17 12:04:27 -060035struct kmem_cache *gfs2_trans_cachep __read_mostly;
Steven Whitehousee8c92ed2012-04-16 09:28:31 +010036mempool_t *gfs2_page_pool __read_mostly;
David Teiglandb3b94fa2006-01-16 16:50:04 +000037
David Teiglandb3b94fa2006-01-16 16:50:04 +000038void gfs2_assert_i(struct gfs2_sbd *sdp)
39{
Joe Perches8382e262014-03-06 12:10:46 -080040 fs_emerg(sdp, "fatal assertion failed\n");
David Teiglandb3b94fa2006-01-16 16:50:04 +000041}
42
Bob Peterson0d910612019-02-18 08:37:25 -070043/**
44 * check_journal_clean - Make sure a journal is clean for a spectator mount
45 * @sdp: The GFS2 superblock
46 * @jd: The journal descriptor
47 *
48 * Returns: 0 if the journal is clean or locked, else an error
49 */
Bob Peterson7d9f9242019-02-18 13:04:13 -070050int check_journal_clean(struct gfs2_sbd *sdp, struct gfs2_jdesc *jd,
51 bool verbose)
Bob Peterson0d910612019-02-18 08:37:25 -070052{
53 int error;
54 struct gfs2_holder j_gh;
55 struct gfs2_log_header_host head;
56 struct gfs2_inode *ip;
57
58 ip = GFS2_I(jd->jd_inode);
59 error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_NOEXP |
60 GL_EXACT | GL_NOCACHE, &j_gh);
61 if (error) {
Bob Peterson7d9f9242019-02-18 13:04:13 -070062 if (verbose)
63 fs_err(sdp, "Error %d locking journal for spectator "
64 "mount.\n", error);
Bob Peterson0d910612019-02-18 08:37:25 -070065 return -EPERM;
66 }
67 error = gfs2_jdesc_check(jd);
68 if (error) {
Bob Peterson7d9f9242019-02-18 13:04:13 -070069 if (verbose)
70 fs_err(sdp, "Error checking journal for spectator "
71 "mount.\n");
Bob Peterson0d910612019-02-18 08:37:25 -070072 goto out_unlock;
73 }
74 error = gfs2_find_jhead(jd, &head, false);
75 if (error) {
Bob Peterson7d9f9242019-02-18 13:04:13 -070076 if (verbose)
77 fs_err(sdp, "Error parsing journal for spectator "
78 "mount.\n");
Bob Peterson0d910612019-02-18 08:37:25 -070079 goto out_unlock;
80 }
81 if (!(head.lh_flags & GFS2_LOG_HEAD_UNMOUNT)) {
82 error = -EPERM;
Bob Peterson7d9f9242019-02-18 13:04:13 -070083 if (verbose)
84 fs_err(sdp, "jid=%u: Journal is dirty, so the first "
85 "mounter must not be a spectator.\n",
86 jd->jd_jid);
Bob Peterson0d910612019-02-18 08:37:25 -070087 }
88
89out_unlock:
90 gfs2_glock_dq_uninit(&j_gh);
91 return error;
92}
93
Bob Peterson601ef0d2020-01-28 20:23:45 +010094static void signal_our_withdraw(struct gfs2_sbd *sdp)
95{
96 struct gfs2_glock *gl = sdp->sd_live_gh.gh_gl;
97 struct inode *inode = sdp->sd_jdesc->jd_inode;
98 struct gfs2_inode *ip = GFS2_I(inode);
99 u64 no_formal_ino = ip->i_no_formal_ino;
100 int ret = 0;
101 int tries;
102
103 if (test_bit(SDF_NORECOVERY, &sdp->sd_flags))
104 return;
105
106 /* Prevent any glock dq until withdraw recovery is complete */
107 set_bit(SDF_WITHDRAW_RECOVERY, &sdp->sd_flags);
108 /*
109 * Don't tell dlm we're bailing until we have no more buffers in the
110 * wind. If journal had an IO error, the log code should just purge
111 * the outstanding buffers rather than submitting new IO. Making the
112 * file system read-only will flush the journal, etc.
113 *
114 * During a normal unmount, gfs2_make_fs_ro calls gfs2_log_shutdown
115 * which clears SDF_JOURNAL_LIVE. In a withdraw, we must not write
116 * any UNMOUNT log header, so we can't call gfs2_log_shutdown, and
117 * therefore we need to clear SDF_JOURNAL_LIVE manually.
118 */
119 clear_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags);
120 if (!sb_rdonly(sdp->sd_vfs))
121 ret = gfs2_make_fs_ro(sdp);
122
Bob Peterson53af80c2020-04-24 12:15:21 -0500123 if (sdp->sd_lockstruct.ls_ops->lm_lock == NULL) { /* lock_nolock */
124 if (!ret)
125 ret = -EIO;
126 clear_bit(SDF_WITHDRAW_RECOVERY, &sdp->sd_flags);
127 goto skip_recovery;
128 }
Bob Peterson601ef0d2020-01-28 20:23:45 +0100129 /*
130 * Drop the glock for our journal so another node can recover it.
131 */
132 if (gfs2_holder_initialized(&sdp->sd_journal_gh)) {
133 gfs2_glock_dq_wait(&sdp->sd_journal_gh);
134 gfs2_holder_uninit(&sdp->sd_journal_gh);
135 }
136 sdp->sd_jinode_gh.gh_flags |= GL_NOCACHE;
137 gfs2_glock_dq(&sdp->sd_jinode_gh);
138 if (test_bit(SDF_FS_FROZEN, &sdp->sd_flags)) {
139 /* Make sure gfs2_unfreeze works if partially-frozen */
140 flush_workqueue(gfs2_freeze_wq);
141 atomic_set(&sdp->sd_freeze_state, SFS_FROZEN);
142 thaw_super(sdp->sd_vfs);
143 } else {
144 wait_on_bit(&gl->gl_flags, GLF_DEMOTE, TASK_UNINTERRUPTIBLE);
145 }
146
147 /*
148 * holder_uninit to force glock_put, to force dlm to let go
149 */
150 gfs2_holder_uninit(&sdp->sd_jinode_gh);
151
152 /*
153 * Note: We need to be careful here:
154 * Our iput of jd_inode will evict it. The evict will dequeue its
155 * glock, but the glock dq will wait for the withdraw unless we have
156 * exception code in glock_dq.
157 */
158 iput(inode);
159 /*
160 * Wait until the journal inode's glock is freed. This allows try locks
161 * on other nodes to be successful, otherwise we remain the owner of
162 * the glock as far as dlm is concerned.
163 */
164 if (gl->gl_ops->go_free) {
165 set_bit(GLF_FREEING, &gl->gl_flags);
166 wait_on_bit(&gl->gl_flags, GLF_FREEING, TASK_UNINTERRUPTIBLE);
167 }
168
Bob Peterson601ef0d2020-01-28 20:23:45 +0100169 /*
170 * Dequeue the "live" glock, but keep a reference so it's never freed.
171 */
172 gfs2_glock_hold(gl);
173 gfs2_glock_dq_wait(&sdp->sd_live_gh);
174 /*
175 * We enqueue the "live" glock in EX so that all other nodes
176 * get a demote request and act on it. We don't really want the
177 * lock in EX, so we send a "try" lock with 1CB to produce a callback.
178 */
179 fs_warn(sdp, "Requesting recovery of jid %d.\n",
180 sdp->sd_lockstruct.ls_jid);
181 gfs2_holder_reinit(LM_ST_EXCLUSIVE, LM_FLAG_TRY_1CB | LM_FLAG_NOEXP,
182 &sdp->sd_live_gh);
183 msleep(GL_GLOCK_MAX_HOLD);
184 /*
185 * This will likely fail in a cluster, but succeed standalone:
186 */
187 ret = gfs2_glock_nq(&sdp->sd_live_gh);
188
189 /*
190 * If we actually got the "live" lock in EX mode, there are no other
191 * nodes available to replay our journal. So we try to replay it
192 * ourselves. We hold the "live" glock to prevent other mounters
193 * during recovery, then just dequeue it and reacquire it in our
194 * normal SH mode. Just in case the problem that caused us to
195 * withdraw prevents us from recovering our journal (e.g. io errors
196 * and such) we still check if the journal is clean before proceeding
197 * but we may wait forever until another mounter does the recovery.
198 */
199 if (ret == 0) {
200 fs_warn(sdp, "No other mounters found. Trying to recover our "
201 "own journal jid %d.\n", sdp->sd_lockstruct.ls_jid);
202 if (gfs2_recover_journal(sdp->sd_jdesc, 1))
203 fs_warn(sdp, "Unable to recover our journal jid %d.\n",
204 sdp->sd_lockstruct.ls_jid);
205 gfs2_glock_dq_wait(&sdp->sd_live_gh);
206 gfs2_holder_reinit(LM_ST_SHARED, LM_FLAG_NOEXP | GL_EXACT,
207 &sdp->sd_live_gh);
208 gfs2_glock_nq(&sdp->sd_live_gh);
209 }
210
211 gfs2_glock_queue_put(gl); /* drop the extra reference we acquired */
212 clear_bit(SDF_WITHDRAW_RECOVERY, &sdp->sd_flags);
213
214 /*
215 * At this point our journal is evicted, so we need to get a new inode
216 * for it. Once done, we need to call gfs2_find_jhead which
217 * calls gfs2_map_journal_extents to map it for us again.
218 *
219 * Note that we don't really want it to look up a FREE block. The
220 * GFS2_BLKST_FREE simply overrides a block check in gfs2_inode_lookup
221 * which would otherwise fail because it requires grabbing an rgrp
222 * glock, which would fail with -EIO because we're withdrawing.
223 */
224 inode = gfs2_inode_lookup(sdp->sd_vfs, DT_UNKNOWN,
225 sdp->sd_jdesc->jd_no_addr, no_formal_ino,
226 GFS2_BLKST_FREE);
227 if (IS_ERR(inode)) {
228 fs_warn(sdp, "Reprocessing of jid %d failed with %ld.\n",
229 sdp->sd_lockstruct.ls_jid, PTR_ERR(inode));
230 goto skip_recovery;
231 }
232 sdp->sd_jdesc->jd_inode = inode;
233
234 /*
235 * Now wait until recovery is complete.
236 */
237 for (tries = 0; tries < 10; tries++) {
Bob Peterson7d9f9242019-02-18 13:04:13 -0700238 ret = check_journal_clean(sdp, sdp->sd_jdesc, false);
Bob Peterson601ef0d2020-01-28 20:23:45 +0100239 if (!ret)
240 break;
241 msleep(HZ);
242 fs_warn(sdp, "Waiting for journal recovery jid %d.\n",
243 sdp->sd_lockstruct.ls_jid);
244 }
245skip_recovery:
246 if (!ret)
247 fs_warn(sdp, "Journal recovery complete for jid %d.\n",
248 sdp->sd_lockstruct.ls_jid);
249 else
250 fs_warn(sdp, "Journal recovery skipped for %d until next "
251 "mount.\n", sdp->sd_lockstruct.ls_jid);
252 fs_warn(sdp, "Glock dequeues delayed: %lu\n", sdp->sd_glock_dqs_held);
253 sdp->sd_glock_dqs_held = 0;
254 wake_up_bit(&sdp->sd_flags, SDF_WITHDRAW_RECOVERY);
255}
256
Andreas Gruenbacherbadb55e2020-01-23 18:41:00 +0100257void gfs2_lm(struct gfs2_sbd *sdp, const char *fmt, ...)
258{
259 struct va_format vaf;
260 va_list args;
261
262 if (sdp->sd_args.ar_errors == GFS2_ERRORS_WITHDRAW &&
263 test_bit(SDF_WITHDRAWN, &sdp->sd_flags))
264 return;
265
266 va_start(args, fmt);
267 vaf.fmt = fmt;
268 vaf.va = &args;
269 fs_err(sdp, "%pV", &vaf);
270 va_end(args);
271}
272
273int gfs2_withdraw(struct gfs2_sbd *sdp)
Steven Whitehouseda755fd2008-01-30 15:34:04 +0000274{
Steven Whitehousef057f6c2009-01-12 10:43:39 +0000275 struct lm_lockstruct *ls = &sdp->sd_lockstruct;
276 const struct lm_lockops *lm = ls->ls_ops;
Steven Whitehouseda755fd2008-01-30 15:34:04 +0000277
Bob Petersond34843d2009-08-24 10:44:18 +0100278 if (sdp->sd_args.ar_errors == GFS2_ERRORS_WITHDRAW &&
Bob Peterson601ef0d2020-01-28 20:23:45 +0100279 test_and_set_bit(SDF_WITHDRAWN, &sdp->sd_flags)) {
280 if (!test_bit(SDF_WITHDRAW_IN_PROG, &sdp->sd_flags))
281 return -1;
282
283 wait_on_bit(&sdp->sd_flags, SDF_WITHDRAW_IN_PROG,
284 TASK_UNINTERRUPTIBLE);
285 return -1;
286 }
287
288 set_bit(SDF_WITHDRAW_IN_PROG, &sdp->sd_flags);
Steven Whitehouseda755fd2008-01-30 15:34:04 +0000289
Bob Petersond34843d2009-08-24 10:44:18 +0100290 if (sdp->sd_args.ar_errors == GFS2_ERRORS_WITHDRAW) {
291 fs_err(sdp, "about to withdraw this file system\n");
292 BUG_ON(sdp->sd_args.ar_debug);
Steven Whitehouseda755fd2008-01-30 15:34:04 +0000293
Bob Peterson601ef0d2020-01-28 20:23:45 +0100294 signal_our_withdraw(sdp);
295
Bob Petersond34843d2009-08-24 10:44:18 +0100296 kobject_uevent(&sdp->sd_kobj, KOBJ_OFFLINE);
Steven Whitehousef057f6c2009-01-12 10:43:39 +0000297
Steven Whitehousefd95e812013-02-13 12:21:40 +0000298 if (!strcmp(sdp->sd_lockstruct.ls_ops->lm_proto_name, "lock_dlm"))
299 wait_for_completion(&sdp->sd_wdack);
300
Bob Petersond34843d2009-08-24 10:44:18 +0100301 if (lm->lm_unmount) {
302 fs_err(sdp, "telling LM to unmount\n");
303 lm->lm_unmount(sdp);
304 }
Benjamin Marzinski3e11e5302016-03-23 14:29:59 -0400305 set_bit(SDF_SKIP_DLM_UNLOCK, &sdp->sd_flags);
Bob Peterson601ef0d2020-01-28 20:23:45 +0100306 fs_err(sdp, "File system withdrawn\n");
Bob Petersond34843d2009-08-24 10:44:18 +0100307 dump_stack();
Bob Peterson601ef0d2020-01-28 20:23:45 +0100308 clear_bit(SDF_WITHDRAW_IN_PROG, &sdp->sd_flags);
309 smp_mb__after_atomic();
310 wake_up_bit(&sdp->sd_flags, SDF_WITHDRAW_IN_PROG);
Steven Whitehousef057f6c2009-01-12 10:43:39 +0000311 }
Bob Petersond34843d2009-08-24 10:44:18 +0100312
313 if (sdp->sd_args.ar_errors == GFS2_ERRORS_PANIC)
Joe Perchesd77d1b52014-03-06 12:10:45 -0800314 panic("GFS2: fsid=%s: panic requested\n", sdp->sd_fsname);
Steven Whitehouseda755fd2008-01-30 15:34:04 +0000315
316 return -1;
317}
318
David Teiglandb3b94fa2006-01-16 16:50:04 +0000319/**
320 * gfs2_assert_withdraw_i - Cause the machine to withdraw if @assertion is false
David Teiglandb3b94fa2006-01-16 16:50:04 +0000321 */
322
Andreas Gruenbacher8e28ef12020-01-23 19:36:21 +0100323void gfs2_assert_withdraw_i(struct gfs2_sbd *sdp, char *assertion,
Bob Petersonca399c962020-01-08 11:37:30 -0600324 const char *function, char *file, unsigned int line,
325 bool delayed)
David Teiglandb3b94fa2006-01-16 16:50:04 +0000326{
Bob Petersonca399c962020-01-08 11:37:30 -0600327 if (gfs2_withdrawn(sdp))
328 return;
329
330 fs_err(sdp,
331 "fatal: assertion \"%s\" failed\n"
332 " function = %s, file = %s, line = %u\n",
333 assertion, function, file, line);
334
335 /*
336 * If errors=panic was specified on mount, it won't help to delay the
337 * withdraw.
338 */
339 if (sdp->sd_args.ar_errors == GFS2_ERRORS_PANIC)
340 delayed = false;
341
342 if (delayed)
343 gfs2_withdraw_delayed(sdp);
344 else
345 gfs2_withdraw(sdp);
Steven Whitehouse18ec7d52006-02-08 11:50:51 +0000346 dump_stack();
David Teiglandb3b94fa2006-01-16 16:50:04 +0000347}
348
349/**
350 * gfs2_assert_warn_i - Print a message to the console if @assertion is false
David Teiglandb3b94fa2006-01-16 16:50:04 +0000351 */
352
Andreas Gruenbacher8e28ef12020-01-23 19:36:21 +0100353void gfs2_assert_warn_i(struct gfs2_sbd *sdp, char *assertion,
354 const char *function, char *file, unsigned int line)
David Teiglandb3b94fa2006-01-16 16:50:04 +0000355{
356 if (time_before(jiffies,
357 sdp->sd_last_warning +
358 gfs2_tune_get(sdp, gt_complain_secs) * HZ))
Andreas Gruenbacher8e28ef12020-01-23 19:36:21 +0100359 return;
David Teiglandb3b94fa2006-01-16 16:50:04 +0000360
Bob Petersond34843d2009-08-24 10:44:18 +0100361 if (sdp->sd_args.ar_errors == GFS2_ERRORS_WITHDRAW)
Joe Perches8382e262014-03-06 12:10:46 -0800362 fs_warn(sdp, "warning: assertion \"%s\" failed at function = %s, file = %s, line = %u\n",
363 assertion, function, file, line);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000364
365 if (sdp->sd_args.ar_debug)
366 BUG();
Steven Whitehouse18ec7d52006-02-08 11:50:51 +0000367 else
368 dump_stack();
David Teiglandb3b94fa2006-01-16 16:50:04 +0000369
Bob Petersond34843d2009-08-24 10:44:18 +0100370 if (sdp->sd_args.ar_errors == GFS2_ERRORS_PANIC)
371 panic("GFS2: fsid=%s: warning: assertion \"%s\" failed\n"
372 "GFS2: fsid=%s: function = %s, file = %s, line = %u\n",
373 sdp->sd_fsname, assertion,
374 sdp->sd_fsname, function, file, line);
375
David Teiglandb3b94fa2006-01-16 16:50:04 +0000376 sdp->sd_last_warning = jiffies;
David Teiglandb3b94fa2006-01-16 16:50:04 +0000377}
378
379/**
380 * gfs2_consist_i - Flag a filesystem consistency error and withdraw
David Teiglandb3b94fa2006-01-16 16:50:04 +0000381 */
382
Andreas Gruenbachera5ca2f12020-01-23 19:31:06 +0100383void gfs2_consist_i(struct gfs2_sbd *sdp, const char *function,
384 char *file, unsigned int line)
David Teiglandb3b94fa2006-01-16 16:50:04 +0000385{
Andreas Gruenbacherbadb55e2020-01-23 18:41:00 +0100386 gfs2_lm(sdp,
387 "fatal: filesystem consistency error - function = %s, file = %s, line = %u\n",
388 function, file, line);
Andreas Gruenbachera5ca2f12020-01-23 19:31:06 +0100389 gfs2_withdraw(sdp);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000390}
391
392/**
393 * gfs2_consist_inode_i - Flag an inode consistency error and withdraw
David Teiglandb3b94fa2006-01-16 16:50:04 +0000394 */
395
Andreas Gruenbachera5ca2f12020-01-23 19:31:06 +0100396void gfs2_consist_inode_i(struct gfs2_inode *ip,
397 const char *function, char *file, unsigned int line)
David Teiglandb3b94fa2006-01-16 16:50:04 +0000398{
Steven Whitehousefeaa7bb2006-06-14 15:32:57 -0400399 struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
Andreas Gruenbacherbadb55e2020-01-23 18:41:00 +0100400
401 gfs2_lm(sdp,
402 "fatal: filesystem consistency error\n"
403 " inode = %llu %llu\n"
404 " function = %s, file = %s, line = %u\n",
405 (unsigned long long)ip->i_no_formal_ino,
406 (unsigned long long)ip->i_no_addr,
407 function, file, line);
Andreas Gruenbachera5ca2f12020-01-23 19:31:06 +0100408 gfs2_withdraw(sdp);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000409}
410
411/**
412 * gfs2_consist_rgrpd_i - Flag a RG consistency error and withdraw
David Teiglandb3b94fa2006-01-16 16:50:04 +0000413 */
414
Andreas Gruenbachera5ca2f12020-01-23 19:31:06 +0100415void gfs2_consist_rgrpd_i(struct gfs2_rgrpd *rgd,
416 const char *function, char *file, unsigned int line)
David Teiglandb3b94fa2006-01-16 16:50:04 +0000417{
418 struct gfs2_sbd *sdp = rgd->rd_sbd;
Bob Peterson98fb0572019-08-13 09:25:15 -0400419 char fs_id_buf[sizeof(sdp->sd_fsname) + 7];
Bob Peterson72244b62018-08-15 12:09:49 -0500420
Bob Peterson3792ce92019-05-09 09:21:48 -0500421 sprintf(fs_id_buf, "fsid=%s: ", sdp->sd_fsname);
422 gfs2_rgrp_dump(NULL, rgd->rd_gl, fs_id_buf);
Andreas Gruenbacherbadb55e2020-01-23 18:41:00 +0100423 gfs2_lm(sdp,
424 "fatal: filesystem consistency error\n"
425 " RG = %llu\n"
426 " function = %s, file = %s, line = %u\n",
427 (unsigned long long)rgd->rd_addr,
428 function, file, line);
Andreas Gruenbachera5ca2f12020-01-23 19:31:06 +0100429 gfs2_withdraw(sdp);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000430}
431
432/**
433 * gfs2_meta_check_ii - Flag a magic number consistency error and withdraw
434 * Returns: -1 if this call withdrew the machine,
435 * -2 if it was already withdrawn
436 */
437
438int gfs2_meta_check_ii(struct gfs2_sbd *sdp, struct buffer_head *bh,
439 const char *type, const char *function, char *file,
440 unsigned int line)
441{
442 int me;
Andreas Gruenbacherbadb55e2020-01-23 18:41:00 +0100443
444 gfs2_lm(sdp,
445 "fatal: invalid metadata block\n"
446 " bh = %llu (%s)\n"
447 " function = %s, file = %s, line = %u\n",
448 (unsigned long long)bh->b_blocknr, type,
449 function, file, line);
450 me = gfs2_withdraw(sdp);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000451 return (me) ? -1 : -2;
452}
453
454/**
455 * gfs2_metatype_check_ii - Flag a metadata type consistency error and withdraw
456 * Returns: -1 if this call withdrew the machine,
457 * -2 if it was already withdrawn
458 */
459
460int gfs2_metatype_check_ii(struct gfs2_sbd *sdp, struct buffer_head *bh,
Steven Whitehousecd915492006-09-04 12:49:07 -0400461 u16 type, u16 t, const char *function,
David Teiglandb3b94fa2006-01-16 16:50:04 +0000462 char *file, unsigned int line)
463{
464 int me;
Andreas Gruenbacherbadb55e2020-01-23 18:41:00 +0100465
466 gfs2_lm(sdp,
467 "fatal: invalid metadata block\n"
468 " bh = %llu (type: exp=%u, found=%u)\n"
469 " function = %s, file = %s, line = %u\n",
470 (unsigned long long)bh->b_blocknr, type, t,
471 function, file, line);
472 me = gfs2_withdraw(sdp);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000473 return (me) ? -1 : -2;
474}
475
476/**
477 * gfs2_io_error_i - Flag an I/O error and withdraw
478 * Returns: -1 if this call withdrew the machine,
479 * 0 if it was already withdrawn
480 */
481
482int gfs2_io_error_i(struct gfs2_sbd *sdp, const char *function, char *file,
483 unsigned int line)
484{
Andreas Gruenbacherbadb55e2020-01-23 18:41:00 +0100485 gfs2_lm(sdp,
486 "fatal: I/O error\n"
487 " function = %s, file = %s, line = %u\n",
488 function, file, line);
489 return gfs2_withdraw(sdp);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000490}
491
492/**
Andreas Gruenbacher9e1a9ec2018-06-07 11:56:46 +0100493 * gfs2_io_error_bh_i - Flag a buffer I/O error
494 * @withdraw: withdraw the filesystem
David Teiglandb3b94fa2006-01-16 16:50:04 +0000495 */
496
Andreas Gruenbacher9e1a9ec2018-06-07 11:56:46 +0100497void gfs2_io_error_bh_i(struct gfs2_sbd *sdp, struct buffer_head *bh,
498 const char *function, char *file, unsigned int line,
499 bool withdraw)
David Teiglandb3b94fa2006-01-16 16:50:04 +0000500{
Bob Peterson69511082019-02-12 13:43:55 -0700501 if (gfs2_withdrawn(sdp))
502 return;
503
504 fs_err(sdp, "fatal: I/O error\n"
505 " block = %llu\n"
506 " function = %s, file = %s, line = %u\n",
507 (unsigned long long)bh->b_blocknr, function, file, line);
Andreas Gruenbacher9e1a9ec2018-06-07 11:56:46 +0100508 if (withdraw)
Andreas Gruenbacherbadb55e2020-01-23 18:41:00 +0100509 gfs2_withdraw(sdp);
David Teiglandb3b94fa2006-01-16 16:50:04 +0000510}
511