|
@@ -2233,44 +2233,41 @@ xfs_alloc_put_freelist(
|
|
|
* Read in the allocation group header (free/alloc section).
|
|
|
*/
|
|
|
int /* error */
|
|
|
-xfs_alloc_read_agf(
|
|
|
- xfs_mount_t *mp, /* mount point structure */
|
|
|
- xfs_trans_t *tp, /* transaction pointer */
|
|
|
- xfs_agnumber_t agno, /* allocation group number */
|
|
|
- int flags, /* XFS_ALLOC_FLAG_... */
|
|
|
- xfs_buf_t **bpp) /* buffer for the ag freelist header */
|
|
|
+xfs_read_agf(
|
|
|
+ struct xfs_mount *mp, /* mount point structure */
|
|
|
+ struct xfs_trans *tp, /* transaction pointer */
|
|
|
+ xfs_agnumber_t agno, /* allocation group number */
|
|
|
+ int flags, /* XFS_BUF_ */
|
|
|
+ struct xfs_buf **bpp) /* buffer for the ag freelist header */
|
|
|
{
|
|
|
- xfs_agf_t *agf; /* ag freelist header */
|
|
|
+ struct xfs_agf *agf; /* ag freelist header */
|
|
|
int agf_ok; /* set if agf is consistent */
|
|
|
- xfs_buf_t *bp; /* return value */
|
|
|
- xfs_perag_t *pag; /* per allocation group data */
|
|
|
int error;
|
|
|
|
|
|
ASSERT(agno != NULLAGNUMBER);
|
|
|
error = xfs_trans_read_buf(
|
|
|
mp, tp, mp->m_ddev_targp,
|
|
|
XFS_AG_DADDR(mp, agno, XFS_AGF_DADDR(mp)),
|
|
|
- XFS_FSS_TO_BB(mp, 1),
|
|
|
- (flags & XFS_ALLOC_FLAG_TRYLOCK) ? XFS_BUF_TRYLOCK : 0U,
|
|
|
- &bp);
|
|
|
+ XFS_FSS_TO_BB(mp, 1), flags, bpp);
|
|
|
if (error)
|
|
|
return error;
|
|
|
- ASSERT(!bp || !XFS_BUF_GETERROR(bp));
|
|
|
- if (!bp) {
|
|
|
- *bpp = NULL;
|
|
|
+ if (!*bpp)
|
|
|
return 0;
|
|
|
- }
|
|
|
+
|
|
|
+ ASSERT(!XFS_BUF_GETERROR(*bpp));
|
|
|
+ agf = XFS_BUF_TO_AGF(*bpp);
|
|
|
+
|
|
|
/*
|
|
|
* Validate the magic number of the agf block.
|
|
|
*/
|
|
|
- agf = XFS_BUF_TO_AGF(bp);
|
|
|
agf_ok =
|
|
|
be32_to_cpu(agf->agf_magicnum) == XFS_AGF_MAGIC &&
|
|
|
XFS_AGF_GOOD_VERSION(be32_to_cpu(agf->agf_versionnum)) &&
|
|
|
be32_to_cpu(agf->agf_freeblks) <= be32_to_cpu(agf->agf_length) &&
|
|
|
be32_to_cpu(agf->agf_flfirst) < XFS_AGFL_SIZE(mp) &&
|
|
|
be32_to_cpu(agf->agf_fllast) < XFS_AGFL_SIZE(mp) &&
|
|
|
- be32_to_cpu(agf->agf_flcount) <= XFS_AGFL_SIZE(mp);
|
|
|
+ be32_to_cpu(agf->agf_flcount) <= XFS_AGFL_SIZE(mp) &&
|
|
|
+ be32_to_cpu(agf->agf_seqno) == agno;
|
|
|
if (xfs_sb_version_haslazysbcount(&mp->m_sb))
|
|
|
agf_ok = agf_ok && be32_to_cpu(agf->agf_btreeblks) <=
|
|
|
be32_to_cpu(agf->agf_length);
|
|
@@ -2278,9 +2275,41 @@ xfs_alloc_read_agf(
|
|
|
XFS_RANDOM_ALLOC_READ_AGF))) {
|
|
|
XFS_CORRUPTION_ERROR("xfs_alloc_read_agf",
|
|
|
XFS_ERRLEVEL_LOW, mp, agf);
|
|
|
- xfs_trans_brelse(tp, bp);
|
|
|
+ xfs_trans_brelse(tp, *bpp);
|
|
|
return XFS_ERROR(EFSCORRUPTED);
|
|
|
}
|
|
|
+
|
|
|
+ XFS_BUF_SET_VTYPE_REF(*bpp, B_FS_AGF, XFS_AGF_REF);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Read in the allocation group header (free/alloc section).
|
|
|
+ */
|
|
|
+int /* error */
|
|
|
+xfs_alloc_read_agf(
|
|
|
+ struct xfs_mount *mp, /* mount point structure */
|
|
|
+ struct xfs_trans *tp, /* transaction pointer */
|
|
|
+ xfs_agnumber_t agno, /* allocation group number */
|
|
|
+ int flags, /* XFS_ALLOC_FLAG_... */
|
|
|
+ struct xfs_buf **bpp) /* buffer for the ag freelist header */
|
|
|
+{
|
|
|
+ struct xfs_agf *agf; /* ag freelist header */
|
|
|
+ struct xfs_perag *pag; /* per allocation group data */
|
|
|
+ int error;
|
|
|
+
|
|
|
+ ASSERT(agno != NULLAGNUMBER);
|
|
|
+
|
|
|
+ error = xfs_read_agf(mp, tp, agno,
|
|
|
+ (flags & XFS_ALLOC_FLAG_TRYLOCK) ? XFS_BUF_TRYLOCK : 0,
|
|
|
+ bpp);
|
|
|
+ if (error)
|
|
|
+ return error;
|
|
|
+ if (!*bpp)
|
|
|
+ return 0;
|
|
|
+ ASSERT(!XFS_BUF_GETERROR(*bpp));
|
|
|
+
|
|
|
+ agf = XFS_BUF_TO_AGF(*bpp);
|
|
|
pag = &mp->m_perag[agno];
|
|
|
if (!pag->pagf_init) {
|
|
|
pag->pagf_freeblks = be32_to_cpu(agf->agf_freeblks);
|
|
@@ -2308,8 +2337,6 @@ xfs_alloc_read_agf(
|
|
|
be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNTi]));
|
|
|
}
|
|
|
#endif
|
|
|
- XFS_BUF_SET_VTYPE_REF(bp, B_FS_AGF, XFS_AGF_REF);
|
|
|
- *bpp = bp;
|
|
|
return 0;
|
|
|
}
|
|
|
|