]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
xfs: refactor attr scrub memory allocation function
authorDarrick J. Wong <darrick.wong@oracle.com>
Fri, 5 Jul 2019 17:29:55 +0000 (10:29 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Fri, 5 Jul 2019 17:29:55 +0000 (10:29 -0700)
Move the code that allocates memory buffers for the extended attribute
scrub code into a separate function so we can reduce memory allocations
in the next patch.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
fs/xfs/scrub/attr.c
fs/xfs/scrub/attr.h

index 13314cf87db83733b26cddac01097087bdeda34c..7cb412ca473c2b57fb89b83f0ae1b9f9d69993c8 100644 (file)
 #include "scrub/dabtree.h"
 #include "scrub/attr.h"
 
-/* Set us up to scrub an inode's extended attributes. */
+/* Allocate enough memory to hold an attr value and attr block bitmaps. */
 int
-xchk_setup_xattr(
+xchk_setup_xattr_buf(
        struct xfs_scrub        *sc,
-       struct xfs_inode        *ip)
+       size_t                  value_size)
 {
        size_t                  sz;
 
        /*
-        * Allocate the buffer without the inode lock held.  We need enough
-        * space to read every xattr value in the file or enough space to
-        * hold three copies of the xattr free space bitmap.  (Not both at
-        * the same time.)
+        * We need enough space to read an xattr value from the file or enough
+        * space to hold three copies of the xattr free space bitmap.  We don't
+        * need the buffer space for both purposes at the same time.
         */
-       sz = max_t(size_t, XATTR_SIZE_MAX, 3 * sizeof(long) *
-                       BITS_TO_LONGS(sc->mp->m_attr_geo->blksize));
+       sz = 3 * sizeof(long) * BITS_TO_LONGS(sc->mp->m_attr_geo->blksize);
+       sz = max_t(size_t, sz, value_size);
+
        sc->buf = kmem_zalloc_large(sz, KM_SLEEP);
        if (!sc->buf)
                return -ENOMEM;
 
+       return 0;
+}
+
+/* Set us up to scrub an inode's extended attributes. */
+int
+xchk_setup_xattr(
+       struct xfs_scrub        *sc,
+       struct xfs_inode        *ip)
+{
+       int                     error;
+
+       error = xchk_setup_xattr_buf(sc, XATTR_SIZE_MAX);
+       if (error)
+               return error;
+
        return xchk_setup_inode_contents(sc, ip, 0);
 }
 
index 88bb5e29c60c4453f1351fdc11ff9a05e445f888..27e879aeaafccb3b91e3dd76d708789a9b673760 100644 (file)
@@ -62,4 +62,6 @@ xchk_xattr_dstmap(
                        BITS_TO_LONGS(sc->mp->m_attr_geo->blksize);
 }
 
+int xchk_setup_xattr_buf(struct xfs_scrub *sc, size_t value_size);
+
 #endif /* __XFS_SCRUB_ATTR_H__ */