xref: /openbmc/linux/fs/xfs/scrub/agheader_repair.c (revision b5e2196e9c7217387bab2ab4231ad9f4585f55c5)
10b61f8a4SDave Chinner // SPDX-License-Identifier: GPL-2.0+
2d25522f1SDarrick J. Wong /*
3d25522f1SDarrick J. Wong  * Copyright (C) 2018 Oracle.  All Rights Reserved.
4d25522f1SDarrick J. Wong  * Author: Darrick J. Wong <darrick.wong@oracle.com>
5d25522f1SDarrick J. Wong  */
6d25522f1SDarrick J. Wong #include "xfs.h"
7d25522f1SDarrick J. Wong #include "xfs_fs.h"
8d25522f1SDarrick J. Wong #include "xfs_shared.h"
9d25522f1SDarrick J. Wong #include "xfs_format.h"
10d25522f1SDarrick J. Wong #include "xfs_trans_resv.h"
11d25522f1SDarrick J. Wong #include "xfs_mount.h"
12d25522f1SDarrick J. Wong #include "xfs_defer.h"
13d25522f1SDarrick J. Wong #include "xfs_btree.h"
14d25522f1SDarrick J. Wong #include "xfs_bit.h"
15d25522f1SDarrick J. Wong #include "xfs_log_format.h"
16d25522f1SDarrick J. Wong #include "xfs_trans.h"
17d25522f1SDarrick J. Wong #include "xfs_sb.h"
18d25522f1SDarrick J. Wong #include "xfs_inode.h"
19d25522f1SDarrick J. Wong #include "xfs_alloc.h"
20d25522f1SDarrick J. Wong #include "xfs_ialloc.h"
21d25522f1SDarrick J. Wong #include "xfs_rmap.h"
22d25522f1SDarrick J. Wong #include "scrub/xfs_scrub.h"
23d25522f1SDarrick J. Wong #include "scrub/scrub.h"
24d25522f1SDarrick J. Wong #include "scrub/common.h"
25d25522f1SDarrick J. Wong #include "scrub/trace.h"
26d25522f1SDarrick J. Wong 
27d25522f1SDarrick J. Wong /* Superblock */
28d25522f1SDarrick J. Wong 
29d25522f1SDarrick J. Wong /* Repair the superblock. */
30d25522f1SDarrick J. Wong int
31*b5e2196eSDarrick J. Wong xrep_superblock(
32d25522f1SDarrick J. Wong 	struct xfs_scrub_context	*sc)
33d25522f1SDarrick J. Wong {
34d25522f1SDarrick J. Wong 	struct xfs_mount		*mp = sc->mp;
35d25522f1SDarrick J. Wong 	struct xfs_buf			*bp;
36d25522f1SDarrick J. Wong 	xfs_agnumber_t			agno;
37d25522f1SDarrick J. Wong 	int				error;
38d25522f1SDarrick J. Wong 
39d25522f1SDarrick J. Wong 	/* Don't try to repair AG 0's sb; let xfs_repair deal with it. */
40d25522f1SDarrick J. Wong 	agno = sc->sm->sm_agno;
41d25522f1SDarrick J. Wong 	if (agno == 0)
42d25522f1SDarrick J. Wong 		return -EOPNOTSUPP;
43d25522f1SDarrick J. Wong 
44d25522f1SDarrick J. Wong 	error = xfs_sb_get_secondary(mp, sc->tp, agno, &bp);
45d25522f1SDarrick J. Wong 	if (error)
46d25522f1SDarrick J. Wong 		return error;
47d25522f1SDarrick J. Wong 
48d25522f1SDarrick J. Wong 	/* Copy AG 0's superblock to this one. */
49d25522f1SDarrick J. Wong 	xfs_buf_zero(bp, 0, BBTOB(bp->b_length));
50d25522f1SDarrick J. Wong 	xfs_sb_to_disk(XFS_BUF_TO_SBP(bp), &mp->m_sb);
51d25522f1SDarrick J. Wong 
52d25522f1SDarrick J. Wong 	/* Write this to disk. */
53d25522f1SDarrick J. Wong 	xfs_trans_buf_set_type(sc->tp, bp, XFS_BLFT_SB_BUF);
54d25522f1SDarrick J. Wong 	xfs_trans_log_buf(sc->tp, bp, 0, BBTOB(bp->b_length) - 1);
55d25522f1SDarrick J. Wong 	return error;
56d25522f1SDarrick J. Wong }
57