Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+24 −9
Original line number Diff line number Diff line
@@ -20,26 +20,41 @@
#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);
}

+2 −0
Original line number Diff line number Diff line
@@ -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__ */