xref: /openbmc/linux/fs/xfs/scrub/agheader_repair.c (revision d25522f10cfa342a20867086a516c45c87b0877c)
1*d25522f1SDarrick J. Wong /*
2*d25522f1SDarrick J. Wong  * Copyright (C) 2018 Oracle.  All Rights Reserved.
3*d25522f1SDarrick J. Wong  *
4*d25522f1SDarrick J. Wong  * Author: Darrick J. Wong <darrick.wong@oracle.com>
5*d25522f1SDarrick J. Wong  *
6*d25522f1SDarrick J. Wong  * This program is free software; you can redistribute it and/or
7*d25522f1SDarrick J. Wong  * modify it under the terms of the GNU General Public License
8*d25522f1SDarrick J. Wong  * as published by the Free Software Foundation; either version 2
9*d25522f1SDarrick J. Wong  * of the License, or (at your option) any later version.
10*d25522f1SDarrick J. Wong  *
11*d25522f1SDarrick J. Wong  * This program is distributed in the hope that it would be useful,
12*d25522f1SDarrick J. Wong  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13*d25522f1SDarrick J. Wong  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*d25522f1SDarrick J. Wong  * GNU General Public License for more details.
15*d25522f1SDarrick J. Wong  *
16*d25522f1SDarrick J. Wong  * You should have received a copy of the GNU General Public License
17*d25522f1SDarrick J. Wong  * along with this program; if not, write the Free Software Foundation,
18*d25522f1SDarrick J. Wong  * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.
19*d25522f1SDarrick J. Wong  */
20*d25522f1SDarrick J. Wong #include "xfs.h"
21*d25522f1SDarrick J. Wong #include "xfs_fs.h"
22*d25522f1SDarrick J. Wong #include "xfs_shared.h"
23*d25522f1SDarrick J. Wong #include "xfs_format.h"
24*d25522f1SDarrick J. Wong #include "xfs_trans_resv.h"
25*d25522f1SDarrick J. Wong #include "xfs_mount.h"
26*d25522f1SDarrick J. Wong #include "xfs_defer.h"
27*d25522f1SDarrick J. Wong #include "xfs_btree.h"
28*d25522f1SDarrick J. Wong #include "xfs_bit.h"
29*d25522f1SDarrick J. Wong #include "xfs_log_format.h"
30*d25522f1SDarrick J. Wong #include "xfs_trans.h"
31*d25522f1SDarrick J. Wong #include "xfs_sb.h"
32*d25522f1SDarrick J. Wong #include "xfs_inode.h"
33*d25522f1SDarrick J. Wong #include "xfs_alloc.h"
34*d25522f1SDarrick J. Wong #include "xfs_ialloc.h"
35*d25522f1SDarrick J. Wong #include "xfs_rmap.h"
36*d25522f1SDarrick J. Wong #include "scrub/xfs_scrub.h"
37*d25522f1SDarrick J. Wong #include "scrub/scrub.h"
38*d25522f1SDarrick J. Wong #include "scrub/common.h"
39*d25522f1SDarrick J. Wong #include "scrub/trace.h"
40*d25522f1SDarrick J. Wong 
41*d25522f1SDarrick J. Wong /* Superblock */
42*d25522f1SDarrick J. Wong 
43*d25522f1SDarrick J. Wong /* Repair the superblock. */
44*d25522f1SDarrick J. Wong int
45*d25522f1SDarrick J. Wong xfs_repair_superblock(
46*d25522f1SDarrick J. Wong 	struct xfs_scrub_context	*sc)
47*d25522f1SDarrick J. Wong {
48*d25522f1SDarrick J. Wong 	struct xfs_mount		*mp = sc->mp;
49*d25522f1SDarrick J. Wong 	struct xfs_buf			*bp;
50*d25522f1SDarrick J. Wong 	xfs_agnumber_t			agno;
51*d25522f1SDarrick J. Wong 	int				error;
52*d25522f1SDarrick J. Wong 
53*d25522f1SDarrick J. Wong 	/* Don't try to repair AG 0's sb; let xfs_repair deal with it. */
54*d25522f1SDarrick J. Wong 	agno = sc->sm->sm_agno;
55*d25522f1SDarrick J. Wong 	if (agno == 0)
56*d25522f1SDarrick J. Wong 		return -EOPNOTSUPP;
57*d25522f1SDarrick J. Wong 
58*d25522f1SDarrick J. Wong 	error = xfs_sb_get_secondary(mp, sc->tp, agno, &bp);
59*d25522f1SDarrick J. Wong 	if (error)
60*d25522f1SDarrick J. Wong 		return error;
61*d25522f1SDarrick J. Wong 
62*d25522f1SDarrick J. Wong 	/* Copy AG 0's superblock to this one. */
63*d25522f1SDarrick J. Wong 	xfs_buf_zero(bp, 0, BBTOB(bp->b_length));
64*d25522f1SDarrick J. Wong 	xfs_sb_to_disk(XFS_BUF_TO_SBP(bp), &mp->m_sb);
65*d25522f1SDarrick J. Wong 
66*d25522f1SDarrick J. Wong 	/* Write this to disk. */
67*d25522f1SDarrick J. Wong 	xfs_trans_buf_set_type(sc->tp, bp, XFS_BLFT_SB_BUF);
68*d25522f1SDarrick J. Wong 	xfs_trans_log_buf(sc->tp, bp, 0, BBTOB(bp->b_length) - 1);
69*d25522f1SDarrick J. Wong 	return error;
70*d25522f1SDarrick J. Wong }
71