summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDarrick J. Wong <djwong@kernel.org>2022-08-04 15:16:28 -0700
committerDarrick J. Wong <djwong@kernel.org>2022-10-14 14:16:33 -0700
commit1a4c9029de4fd05525011b6728cfd5188d7a0750 (patch)
tree4c2c2ca26eb15ff2a6f3f439e75e0ce79dfd452f
parent2a38af4db6f162341e06744ba1655a0d9a3510cb (diff)
xfs: only allocate free space bitmap for xattr scrub if neededscrub-fix-xattr-memory-mgmt_2022-10-14
The free space bitmap is only required if we're going to check the bestfree space at the end of an xattr leaf block. Therefore, we can reduce the memory requirements of this scrubber if we can determine that the xattr is in short format. Signed-off-by: Darrick J. Wong <djwong@kernel.org>
-rw-r--r--fs/xfs/scrub/attr.c31
1 files changed, 28 insertions, 3 deletions
diff --git a/fs/xfs/scrub/attr.c b/fs/xfs/scrub/attr.c
index f6eb6070488b..b315a499ba32 100644
--- a/fs/xfs/scrub/attr.c
+++ b/fs/xfs/scrub/attr.c
@@ -38,6 +38,29 @@ xchk_xattr_buf_cleanup(
}
/*
+ * Allocate the free space bitmap if we're trying harder; there are leaf blocks
+ * in the attr fork; or we can't tell if there are leaf blocks.
+ */
+static inline bool
+xchk_xattr_want_freemap(
+ struct xfs_scrub *sc)
+{
+ struct xfs_ifork *ifp;
+
+ if (sc->flags & XCHK_TRY_HARDER)
+ return true;
+
+ if (!sc->ip)
+ return true;
+
+ ifp = xfs_ifork_ptr(sc->ip, XFS_ATTR_FORK);
+ if (!ifp)
+ return false;
+
+ return xfs_ifork_has_extents(ifp);
+}
+
+/*
* Allocate enough memory to hold an attr value and attr block bitmaps,
* reallocating the buffer if necessary. Buffer contents are not preserved
* across a reallocation.
@@ -66,9 +89,11 @@ xchk_setup_xattr_buf(
if (!ab->usedmap)
return -ENOMEM;
- ab->freemap = kvmalloc(bmp_sz, XCHK_GFP_FLAGS);
- if (!ab->freemap)
- return -ENOMEM;
+ if (xchk_xattr_want_freemap(sc)) {
+ ab->freemap = kvmalloc(bmp_sz, XCHK_GFP_FLAGS);
+ if (!ab->freemap)
+ return -ENOMEM;
+ }
resize_value:
if (ab->value_sz >= value_size)