Commit 8f4b980e authored by Allison Henderson's avatar Allison Henderson Committed by Darrick J. Wong
Browse files

xfs: pass the attr value to put_listent when possible



Pass the attr value to put_listent when we have local xattrs or
shortform xattrs.  This will enable the GETPARENTS ioctl to use
xfs_attr_list as its backend.

Signed-off-by: default avatarAllison Henderson <allison.henderson@oracle.com>
Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
parent daf9f884
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -47,8 +47,9 @@ struct xfs_attrlist_cursor_kern {


/* void; state communicated via *context */
typedef void (*put_listent_func_t)(struct xfs_attr_list_context *, int,
			      unsigned char *, int, int);
typedef void (*put_listent_func_t)(struct xfs_attr_list_context *context,
		int flags, unsigned char *name, int namelen, void *value,
		int valuelen);

struct xfs_attr_list_context {
	struct xfs_trans	*tp;
+1 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@ typedef struct xfs_attr_sf_sort {
	uint8_t		flags;		/* flags bits (see xfs_attr_leaf.h) */
	xfs_dahash_t	hash;		/* this entry's hash value */
	unsigned char	*name;		/* name value, pointer into buffer */
	void		*value;
} xfs_attr_sf_sort_t;

#define XFS_ATTR_SF_ENTSIZE_MAX			/* max space for name&value */ \
+7 −1
Original line number Diff line number Diff line
@@ -92,6 +92,7 @@ xfs_attr_shortform_list(
					     sfe->flags,
					     sfe->nameval,
					     (int)sfe->namelen,
					     &sfe->nameval[sfe->namelen],
					     (int)sfe->valuelen);
			/*
			 * Either search callback finished early or
@@ -138,6 +139,7 @@ xfs_attr_shortform_list(
		sbp->name = sfe->nameval;
		sbp->namelen = sfe->namelen;
		/* These are bytes, and both on-disk, don't endian-flip */
		sbp->value = &sfe->nameval[sfe->namelen],
		sbp->valuelen = sfe->valuelen;
		sbp->flags = sfe->flags;
		sbp->hash = xfs_attr_hashval(dp->i_mount, sfe->flags,
@@ -192,6 +194,7 @@ xfs_attr_shortform_list(
				     sbp->flags,
				     sbp->name,
				     sbp->namelen,
				     sbp->value,
				     sbp->valuelen);
		if (context->seen_enough)
			break;
@@ -479,6 +482,7 @@ xfs_attr3_leaf_list_int(
	 */
	for (; i < ichdr.count; entry++, i++) {
		char *name;
		void *value;
		int namelen, valuelen;

		if (be32_to_cpu(entry->hashval) != cursor->hashval) {
@@ -496,6 +500,7 @@ xfs_attr3_leaf_list_int(
			name_loc = xfs_attr3_leaf_name_local(leaf, i);
			name = name_loc->nameval;
			namelen = name_loc->namelen;
			value = &name_loc->nameval[name_loc->namelen];
			valuelen = be16_to_cpu(name_loc->valuelen);
		} else {
			xfs_attr_leaf_name_remote_t *name_rmt;
@@ -503,6 +508,7 @@ xfs_attr3_leaf_list_int(
			name_rmt = xfs_attr3_leaf_name_remote(leaf, i);
			name = name_rmt->name;
			namelen = name_rmt->namelen;
			value = NULL;
			valuelen = be32_to_cpu(name_rmt->valuelen);
		}

@@ -513,7 +519,7 @@ xfs_attr3_leaf_list_int(
			return -EFSCORRUPTED;
		}
		context->put_listent(context, entry->flags,
					      name, namelen, valuelen);
					      name, namelen, value, valuelen);
		if (context->seen_enough)
			break;
		cursor->offset++;
+1 −0
Original line number Diff line number Diff line
@@ -310,6 +310,7 @@ xfs_ioc_attr_put_listent(
	int			flags,
	unsigned char		*name,
	int			namelen,
	void			*value,
	int			valuelen)
{
	struct xfs_attrlist	*alist = context->buffer;
+1 −0
Original line number Diff line number Diff line
@@ -222,6 +222,7 @@ xfs_xattr_put_listent(
	int		flags,
	unsigned char	*name,
	int		namelen,
	void		*value,
	int		valuelen)
{
	char *prefix;