Commit 00816759 authored by Darrick J. Wong's avatar Darrick J. Wong

xfs: refactor attr scrub memory allocation function

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: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
parent 3addd248
...@@ -20,26 +20,41 @@ ...@@ -20,26 +20,41 @@
#include "scrub/dabtree.h" #include "scrub/dabtree.h"
#include "scrub/attr.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 int
xchk_setup_xattr( xchk_setup_xattr_buf(
struct xfs_scrub *sc, struct xfs_scrub *sc,
struct xfs_inode *ip) size_t value_size)
{ {
size_t sz; size_t sz;
/* /*
* Allocate the buffer without the inode lock held. We need enough * We need enough space to read an xattr value from the file or enough
* space to read every xattr value in the file or enough space to * space to hold three copies of the xattr free space bitmap. We don't
* hold three copies of the xattr free space bitmap. (Not both at * need the buffer space for both purposes at the same time.
* the same time.)
*/ */
sz = max_t(size_t, XATTR_SIZE_MAX, 3 * sizeof(long) * sz = 3 * sizeof(long) * BITS_TO_LONGS(sc->mp->m_attr_geo->blksize);
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); sc->buf = kmem_zalloc_large(sz, KM_SLEEP);
if (!sc->buf) if (!sc->buf)
return -ENOMEM; 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); return xchk_setup_inode_contents(sc, ip, 0);
} }
......
...@@ -62,4 +62,6 @@ xchk_xattr_dstmap( ...@@ -62,4 +62,6 @@ xchk_xattr_dstmap(
BITS_TO_LONGS(sc->mp->m_attr_geo->blksize); 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__ */ #endif /* __XFS_SCRUB_ATTR_H__ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment