All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Darrick J. Wong" <djwong@kernel.org>
To: djwong@kernel.org
Cc: Allison Henderson <allison.henderson@oracle.com>,
	linux-xfs@vger.kernel.org, allison.henderson@oracle.com,
	catherine.hoang@oracle.com
Subject: [PATCH 12/12] xfs: log NVLOOKUP xattr nvreplace operations
Date: Thu, 25 May 2023 19:09:53 -0700	[thread overview]
Message-ID: <168506072353.3743652.15630681214608046007.stgit@frogsfrogsfrogs> (raw)
In-Reply-To: <168506072168.3743652.12378764451724622618.stgit@frogsfrogsfrogs>

From: Allison Henderson <allison.henderson@oracle.com>

(Formerly titled "xfs: Add new name to attri/d" and described as
follows:

This patch adds two new fields to the atti/d.  They are nname and
nnamelen.  This will be used for parent pointer updates since a
rename operation may cause the parent pointer to update both the
name and value.  So we need to carry both the new name as well as
the target name in the attri/d.)

If high level code wants to do a deferred xattr nvreplace operation with
the NVLOOKUP flag set, we need to push this through the log.  This log
item records the old name/value pair and the new name/value pair, and
completely replaces one with the other.  Parent pointers will need this
ability to handle rename moving a child file between parents.

Signed-off-by: Allison Henderson <allison.henderson@oracle.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
[djwong: reworked to handle new disk format]
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
---
 fs/xfs/libxfs/xfs_attr.c       |   20 ++++
 fs/xfs/libxfs/xfs_attr.h       |    4 -
 fs/xfs/libxfs/xfs_da_btree.h   |    6 +
 fs/xfs/libxfs/xfs_log_format.h |   27 ++++-
 fs/xfs/xfs_attr_item.c         |  207 +++++++++++++++++++++++++++++++++++-----
 fs/xfs/xfs_attr_item.h         |    2 
 6 files changed, 233 insertions(+), 33 deletions(-)


diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c
index 497fb4aa5a5e..e2bef6bad810 100644
--- a/fs/xfs/libxfs/xfs_attr.c
+++ b/fs/xfs/libxfs/xfs_attr.c
@@ -425,6 +425,20 @@ xfs_attr_complete_op(
 		return XFS_DAS_DONE;
 
 	args->attr_filter &= ~XFS_ATTR_INCOMPLETE;
+	if (xfs_attr_intent_op(attr) != XFS_ATTRI_OP_FLAGS_NVREPLACE)
+		return replace_state;
+
+	/*
+	 * NVREPLACE operations require the caller to set the old and new names
+	 * and values explicitly.
+	 */
+	ASSERT(args->new_namelen > 0);
+
+	args->name = args->new_name;
+	args->namelen = args->new_namelen;
+	args->hashval = xfs_da_hashname(args->name, args->namelen);
+	args->value = args->new_value;
+	args->valuelen = args->new_valuelen;
 	return replace_state;
 }
 
@@ -926,9 +940,13 @@ xfs_attr_defer_replace(
 	struct xfs_da_args	*args)
 {
 	struct xfs_attr_intent	*new;
+	int			op_flag = XFS_ATTRI_OP_FLAGS_REPLACE;
 	int			error = 0;
 
-	error = xfs_attr_intent_init(args, XFS_ATTRI_OP_FLAGS_REPLACE, &new);
+	if (args->op_flags & XFS_DA_OP_NVLOOKUP)
+		op_flag = XFS_ATTRI_OP_FLAGS_NVREPLACE;
+
+	error = xfs_attr_intent_init(args, op_flag, &new);
 	if (error)
 		return error;
 
diff --git a/fs/xfs/libxfs/xfs_attr.h b/fs/xfs/libxfs/xfs_attr.h
index 4bacafa59a4a..bb1776b8a6ce 100644
--- a/fs/xfs/libxfs/xfs_attr.h
+++ b/fs/xfs/libxfs/xfs_attr.h
@@ -510,8 +510,8 @@ struct xfs_attr_intent {
 	struct xfs_da_args		*xattri_da_args;
 
 	/*
-	 * Shared buffer containing the attr name and value so that the logging
-	 * code can share large memory buffers between log items.
+	 * Shared buffer containing the attr name, new name, and value so that
+	 * the logging code can share large memory buffers between log items.
 	 */
 	struct xfs_attri_log_nameval	*xattri_nameval;
 
diff --git a/fs/xfs/libxfs/xfs_da_btree.h b/fs/xfs/libxfs/xfs_da_btree.h
index 091750b2d42a..c2255250c589 100644
--- a/fs/xfs/libxfs/xfs_da_btree.h
+++ b/fs/xfs/libxfs/xfs_da_btree.h
@@ -54,11 +54,15 @@ enum xfs_dacmp {
  */
 typedef struct xfs_da_args {
 	struct xfs_da_geometry *geo;	/* da block geometry */
-	const uint8_t		*name;		/* string (maybe not NULL terminated) */
+	const uint8_t	*name;		/* string (maybe not NULL terminated) */
+	const uint8_t	*new_name;	/* new attr name */
 	int		namelen;	/* length of string (maybe no NULL) */
+	int		new_namelen;	/* new attr name len */
 	uint8_t		filetype;	/* filetype of inode for directories */
 	void		*value;		/* set of bytes (maybe contain NULLs) */
+	void		*new_value;	/* new xattr value (may contain NULLs) */
 	int		valuelen;	/* length of value */
+	int		new_valuelen;	/* length of new attr value */
 	unsigned int	attr_filter;	/* XFS_ATTR_{ROOT,SECURE,INCOMPLETE} */
 	unsigned int	attr_flags;	/* XATTR_{CREATE,REPLACE} */
 	xfs_dahash_t	hashval;	/* hash value of name */
diff --git a/fs/xfs/libxfs/xfs_log_format.h b/fs/xfs/libxfs/xfs_log_format.h
index 7b848b1d8aa4..21fbe1f49b6e 100644
--- a/fs/xfs/libxfs/xfs_log_format.h
+++ b/fs/xfs/libxfs/xfs_log_format.h
@@ -115,11 +115,13 @@ struct xfs_unmount_log_format {
 #define XLOG_REG_TYPE_BUD_FORMAT	26
 #define XLOG_REG_TYPE_ATTRI_FORMAT	27
 #define XLOG_REG_TYPE_ATTRD_FORMAT	28
-#define XLOG_REG_TYPE_ATTR_NAME	29
+#define XLOG_REG_TYPE_ATTR_NAME		29
 #define XLOG_REG_TYPE_ATTR_VALUE	30
 #define XLOG_REG_TYPE_SXI_FORMAT	31
 #define XLOG_REG_TYPE_SXD_FORMAT	32
-#define XLOG_REG_TYPE_MAX		32
+#define XLOG_REG_TYPE_ATTR_NEWNAME	33
+#define XLOG_REG_TYPE_ATTR_NEWVALUE	34
+#define XLOG_REG_TYPE_MAX		34
 
 /*
  * Flags to log operation header
@@ -1038,6 +1040,7 @@ struct xfs_icreate_log {
 #define XFS_ATTRI_OP_FLAGS_REPLACE	3	/* Replace the attribute */
 #define XFS_ATTRI_OP_FLAGS_NVREMOVE	4	/* Remove attr w/ vlookup */
 #define XFS_ATTRI_OP_FLAGS_NVSET	5	/* Set attr with w/ vlookup */
+#define XFS_ATTRI_OP_FLAGS_NVREPLACE	6	/* Replace attr name and val */
 #define XFS_ATTRI_OP_FLAGS_TYPE_MASK	0xFF	/* Flags type mask */
 
 /*
@@ -1055,11 +1058,27 @@ struct xfs_icreate_log {
 struct xfs_attri_log_format {
 	uint16_t	alfi_type;	/* attri log item type */
 	uint16_t	alfi_size;	/* size of this item */
-	uint32_t	__pad;		/* pad to 64 bit aligned */
+
+	/*
+	 * For NVREPLACE, this is the length of the new xattr value.
+	 * alfi_value_len contains the length of the old xattr value.
+	 */
+	uint32_t	alfi_new_value_len;
+
 	uint64_t	alfi_id;	/* attri identifier */
 	uint64_t	alfi_ino;	/* the inode for this attr operation */
 	uint32_t	alfi_op_flags;	/* marks the op as a set or remove */
-	uint32_t	alfi_name_len;	/* attr name length */
+	union {
+		uint32_t	alfi_name_len;	/* attr name length */
+		struct {
+			/*
+			 * For NVREPLACE, these are the lengths of the old and
+			 * new attr name.
+			 */
+			uint16_t	alfi_old_name_len;
+			uint16_t	alfi_new_name_len;
+		};
+	};
 	uint32_t	alfi_value_len;	/* attr value length */
 	uint32_t	alfi_attr_filter;/* attr filter flags */
 };
diff --git a/fs/xfs/xfs_attr_item.c b/fs/xfs/xfs_attr_item.c
index a0ef1ed14652..e255b60ffe57 100644
--- a/fs/xfs/xfs_attr_item.c
+++ b/fs/xfs/xfs_attr_item.c
@@ -75,8 +75,12 @@ static inline struct xfs_attri_log_nameval *
 xfs_attri_log_nameval_alloc(
 	const void			*name,
 	unsigned int			name_len,
+	const void			*new_name,
+	unsigned int			new_name_len,
 	const void			*value,
-	unsigned int			value_len)
+	unsigned int			value_len,
+	const void			*new_value,
+	unsigned int			new_value_len)
 {
 	struct xfs_attri_log_nameval	*nv;
 
@@ -85,15 +89,26 @@ xfs_attri_log_nameval_alloc(
 	 * this. But kvmalloc() utterly sucks, so we use our own version.
 	 */
 	nv = xlog_kvmalloc(sizeof(struct xfs_attri_log_nameval) +
-					name_len + value_len);
+					name_len + new_name_len + value_len +
+					new_value_len);
 
 	nv->name.i_addr = nv + 1;
 	nv->name.i_len = name_len;
 	nv->name.i_type = XLOG_REG_TYPE_ATTR_NAME;
 	memcpy(nv->name.i_addr, name, name_len);
 
+	if (new_name_len) {
+		nv->new_name.i_addr = nv->name.i_addr + name_len;
+		nv->new_name.i_len = new_name_len;
+		memcpy(nv->new_name.i_addr, new_name, new_name_len);
+	} else {
+		nv->new_name.i_addr = NULL;
+		nv->new_name.i_len = 0;
+	}
+	nv->new_name.i_type = XLOG_REG_TYPE_ATTR_NEWNAME;
+
 	if (value_len) {
-		nv->value.i_addr = nv->name.i_addr + name_len;
+		nv->value.i_addr = nv->name.i_addr + name_len + new_name_len;
 		nv->value.i_len = value_len;
 		memcpy(nv->value.i_addr, value, value_len);
 	} else {
@@ -102,6 +117,17 @@ xfs_attri_log_nameval_alloc(
 	}
 	nv->value.i_type = XLOG_REG_TYPE_ATTR_VALUE;
 
+	if (new_value_len) {
+		nv->new_value.i_addr = nv->name.i_addr + name_len +
+						new_name_len + value_len;
+		nv->new_value.i_len = new_value_len;
+		memcpy(nv->new_value.i_addr, new_value, new_value_len);
+	} else {
+		nv->new_value.i_addr = NULL;
+		nv->new_value.i_len = 0;
+	}
+	nv->new_value.i_type = XLOG_REG_TYPE_ATTR_NEWVALUE;
+
 	refcount_set(&nv->refcount, 1);
 	return nv;
 }
@@ -147,11 +173,20 @@ xfs_attri_item_size(
 	*nbytes += sizeof(struct xfs_attri_log_format) +
 			xlog_calc_iovec_len(nv->name.i_len);
 
-	if (!nv->value.i_len)
-		return;
+	if (nv->new_name.i_len) {
+		*nvecs += 1;
+		*nbytes += xlog_calc_iovec_len(nv->new_name.i_len);
+	}
 
-	*nvecs += 1;
-	*nbytes += xlog_calc_iovec_len(nv->value.i_len);
+	if (nv->value.i_len) {
+		*nvecs += 1;
+		*nbytes += xlog_calc_iovec_len(nv->value.i_len);
+	}
+
+	if (nv->new_value.i_len) {
+		*nvecs += 1;
+		*nbytes += xlog_calc_iovec_len(nv->new_value.i_len);
+	}
 }
 
 /*
@@ -181,15 +216,28 @@ xfs_attri_item_format(
 	ASSERT(nv->name.i_len > 0);
 	attrip->attri_format.alfi_size++;
 
+	if (nv->new_name.i_len > 0)
+		attrip->attri_format.alfi_size++;
+
 	if (nv->value.i_len > 0)
 		attrip->attri_format.alfi_size++;
 
+	if (nv->new_value.i_len > 0)
+		attrip->attri_format.alfi_size++;
+
 	xlog_copy_iovec(lv, &vecp, XLOG_REG_TYPE_ATTRI_FORMAT,
 			&attrip->attri_format,
 			sizeof(struct xfs_attri_log_format));
 	xlog_copy_from_iovec(lv, &vecp, &nv->name);
+
+	if (nv->new_name.i_len > 0)
+		xlog_copy_from_iovec(lv, &vecp, &nv->new_name);
+
 	if (nv->value.i_len > 0)
 		xlog_copy_from_iovec(lv, &vecp, &nv->value);
+
+	if (nv->new_value.i_len > 0)
+		xlog_copy_from_iovec(lv, &vecp, &nv->new_value);
 }
 
 /*
@@ -379,7 +427,15 @@ xfs_attr_log_item(
 	ASSERT(!(attr->xattri_op_flags & ~XFS_ATTRI_OP_FLAGS_TYPE_MASK));
 	attrp->alfi_op_flags = attr->xattri_op_flags;
 	attrp->alfi_value_len = attr->xattri_nameval->value.i_len;
-	attrp->alfi_name_len = attr->xattri_nameval->name.i_len;
+
+	if (xfs_attr_log_item_op(attrp) == XFS_ATTRI_OP_FLAGS_NVREPLACE) {
+		attrp->alfi_old_name_len = attr->xattri_nameval->name.i_len;
+		attrp->alfi_new_name_len = attr->xattri_nameval->new_name.i_len;
+		attrp->alfi_new_value_len = attr->xattri_nameval->new_value.i_len;
+	} else {
+		attrp->alfi_name_len = attr->xattri_nameval->name.i_len;
+	}
+
 	ASSERT(!(attr->xattri_da_args->attr_filter & ~XFS_ATTRI_FILTER_MASK));
 	attrp->alfi_attr_filter = attr->xattri_da_args->attr_filter;
 }
@@ -420,8 +476,11 @@ xfs_attr_create_intent(
 		 * Transfer our reference to the name/value buffer to the
 		 * deferred work state structure.
 		 */
-		attr->xattri_nameval = xfs_attri_log_nameval_alloc(args->name,
-				args->namelen, args->value, args->valuelen);
+		attr->xattri_nameval = xfs_attri_log_nameval_alloc(
+				args->name, args->namelen,
+				args->new_name, args->new_namelen,
+				args->value, args->valuelen,
+				args->new_value, args->new_valuelen);
 	}
 
 	attrip = xfs_attri_init(mp, attr->xattri_nameval);
@@ -508,9 +567,6 @@ xfs_attri_validate(
 {
 	unsigned int			op = xfs_attr_log_item_op(attrp);
 
-	if (attrp->__pad != 0)
-		return false;
-
 	if (attrp->alfi_op_flags & ~XFS_ATTRI_OP_FLAGS_TYPE_MASK)
 		return false;
 
@@ -519,23 +575,43 @@ xfs_attri_validate(
 
 	/* alfi_op_flags should be either a set or remove */
 	switch (op) {
+	case XFS_ATTRI_OP_FLAGS_REMOVE:
+		if (attrp->alfi_value_len != 0)
+			return false;
+		if (attrp->alfi_name_len == 0 ||
+		    attrp->alfi_name_len > XATTR_NAME_MAX)
+			return false;
+		if (attrp->alfi_new_value_len != 0)
+			return false;
+		break;
 	case XFS_ATTRI_OP_FLAGS_SET:
 	case XFS_ATTRI_OP_FLAGS_REPLACE:
-	case XFS_ATTRI_OP_FLAGS_REMOVE:
 	case XFS_ATTRI_OP_FLAGS_NVREMOVE:
 	case XFS_ATTRI_OP_FLAGS_NVSET:
+		if (attrp->alfi_name_len == 0 ||
+		    attrp->alfi_name_len > XATTR_NAME_MAX)
+			return false;
+		if (attrp->alfi_value_len > XATTR_SIZE_MAX)
+			return false;
+		if (attrp->alfi_new_value_len != 0)
+			return false;
+		break;
+	case XFS_ATTRI_OP_FLAGS_NVREPLACE:
+		if (attrp->alfi_old_name_len == 0 ||
+		    attrp->alfi_old_name_len > XATTR_NAME_MAX)
+			return false;
+		if (attrp->alfi_new_name_len == 0 ||
+		    attrp->alfi_new_name_len > XATTR_NAME_MAX)
+			return false;
+		if (attrp->alfi_value_len > XATTR_SIZE_MAX)
+			return false;
+		if (attrp->alfi_new_value_len > XATTR_SIZE_MAX)
+			return false;
 		break;
 	default:
 		return false;
 	}
 
-	if (attrp->alfi_value_len > XATTR_SIZE_MAX)
-		return false;
-
-	if ((attrp->alfi_name_len > XATTR_NAME_MAX) ||
-	    (attrp->alfi_name_len == 0))
-		return false;
-
 	return xfs_verify_ino(mp, attrp->alfi_ino);
 }
 
@@ -595,9 +671,13 @@ xfs_attri_item_recover(
 	args->whichfork = XFS_ATTR_FORK;
 	args->name = nv->name.i_addr;
 	args->namelen = nv->name.i_len;
+	args->new_name = nv->new_name.i_addr;
+	args->new_namelen = nv->new_name.i_len;
 	args->hashval = xfs_da_hashname(args->name, args->namelen);
 	args->value = nv->value.i_addr;
 	args->valuelen = nv->value.i_len;
+	args->new_value = nv->new_value.i_addr;
+	args->new_valuelen = nv->new_value.i_len;
 	args->attr_filter = attrp->alfi_attr_filter & XFS_ATTRI_FILTER_MASK;
 	args->op_flags = XFS_DA_OP_RECOVERY | XFS_DA_OP_OKNOENT |
 			 XFS_DA_OP_LOGGED;
@@ -606,6 +686,7 @@ xfs_attri_item_recover(
 	ASSERT(xfs_sb_version_haslogxattrs(&mp->m_sb));
 
 	switch (xfs_attr_intent_op(attr)) {
+	case XFS_ATTRI_OP_FLAGS_NVREPLACE:
 	case XFS_ATTRI_OP_FLAGS_NVSET:
 		args->op_flags |= XFS_DA_OP_NVLOOKUP;
 		fallthrough;
@@ -700,7 +781,15 @@ xfs_attri_item_relog(
 	new_attrp->alfi_ino = old_attrp->alfi_ino;
 	new_attrp->alfi_op_flags = old_attrp->alfi_op_flags;
 	new_attrp->alfi_value_len = old_attrp->alfi_value_len;
-	new_attrp->alfi_name_len = old_attrp->alfi_name_len;
+
+	if (xfs_attr_log_item_op(old_attrp) == XFS_ATTRI_OP_FLAGS_NVREPLACE) {
+		new_attrp->alfi_new_name_len = old_attrp->alfi_new_name_len;
+		new_attrp->alfi_old_name_len = old_attrp->alfi_old_name_len;
+		new_attrp->alfi_new_value_len = old_attrp->alfi_new_value_len;
+	} else {
+		new_attrp->alfi_name_len = old_attrp->alfi_name_len;
+	}
+
 	new_attrp->alfi_attr_filter = old_attrp->alfi_attr_filter;
 
 	xfs_trans_add_item(tp, &new_attrip->attri_item);
@@ -722,9 +811,13 @@ xlog_recover_attri_commit_pass2(
 	struct xfs_attri_log_nameval	*nv;
 	const void			*attr_name;
 	const void			*attr_value = NULL;
+	const void			*attr_new_name = NULL;
+	const void			*attr_new_value = NULL;
 	size_t				len;
 	unsigned int			name_len = 0;
 	unsigned int			value_len = 0;
+	unsigned int			new_name_len = 0;
+	unsigned int			new_value_len = 0;
 	unsigned int			op, i = 0;
 
 	/* Validate xfs_attri_log_format before the large memory allocation */
@@ -776,6 +869,21 @@ xlog_recover_attri_commit_pass2(
 		}
 		name_len = attri_formatp->alfi_name_len;
 		break;
+	case XFS_ATTRI_OP_FLAGS_NVREPLACE:
+		/*
+		 * Log item, attr name, new attr name, optional attr value,
+		 * optional new attr value
+		 */
+		if (item->ri_total < 3 || item->ri_total > 5) {
+			XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
+					     attri_formatp, len);
+			return -EFSCORRUPTED;
+		}
+		name_len = attri_formatp->alfi_old_name_len;
+		new_name_len = attri_formatp->alfi_new_name_len;
+		value_len = attri_formatp->alfi_value_len;
+		new_value_len = attri_formatp->alfi_new_value_len;
+		break;
 	default:
 		XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
 				     attri_formatp, len);
@@ -798,12 +906,30 @@ xlog_recover_attri_commit_pass2(
 	}
 	i++;
 
+	/* Validate the new attr name */
+	if (new_name_len > 0) {
+		if (item->ri_buf[i].i_len != xlog_calc_iovec_len(new_name_len)) {
+			XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
+					item->ri_buf[i].i_addr,
+					item->ri_buf[i].i_len);
+			return -EFSCORRUPTED;
+		}
+
+		attr_new_name = item->ri_buf[i].i_addr;
+		if (!xfs_attr_namecheck(attr_new_name, new_name_len)) {
+			XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
+					item->ri_buf[i].i_addr,
+					item->ri_buf[i].i_len);
+			return -EFSCORRUPTED;
+		}
+		i++;
+	}
+
 	/* Validate the attr value, if present */
 	if (value_len != 0) {
 		if (item->ri_buf[i].i_len != xlog_calc_iovec_len(value_len)) {
 			XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
-					item->ri_buf[0].i_addr,
-					item->ri_buf[0].i_len);
+					attri_formatp, len);
 			return -EFSCORRUPTED;
 		}
 
@@ -811,6 +937,18 @@ xlog_recover_attri_commit_pass2(
 		i++;
 	}
 
+	/* Validate the new attr value, if present */
+	if (new_value_len != 0) {
+		if (item->ri_buf[i].i_len != xlog_calc_iovec_len(new_value_len)) {
+			XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
+					attri_formatp, len);
+			return -EFSCORRUPTED;
+		}
+
+		attr_new_value = item->ri_buf[i].i_addr;
+		i++;
+	}
+
 	/*
 	 * Make sure we got the correct number of buffers for the operation
 	 * that we just loaded.
@@ -848,6 +986,23 @@ xlog_recover_attri_commit_pass2(
 			return -EFSCORRUPTED;
 		}
 		break;
+	case XFS_ATTRI_OP_FLAGS_NVREPLACE:
+		/*
+		 * Name-value replace operations require the caller to
+		 * specify the old and new names and values explicitly.
+		 * Values are optional.
+		 */
+		if (attr_name == NULL || name_len == 0) {
+			XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
+					     attri_formatp, len);
+			return -EFSCORRUPTED;
+		}
+		if (attr_new_name == NULL || new_name_len == 0) {
+			XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
+					     attri_formatp, len);
+			return -EFSCORRUPTED;
+		}
+		break;
 	}
 
 	/*
@@ -856,7 +1011,9 @@ xlog_recover_attri_commit_pass2(
 	 * reference.
 	 */
 	nv = xfs_attri_log_nameval_alloc(attr_name, name_len,
-			attr_value, value_len);
+			attr_new_name, new_name_len,
+			attr_value, value_len,
+			attr_new_value, new_value_len);
 
 	attrip = xfs_attri_init(mp, nv);
 	memcpy(&attrip->attri_format, attri_formatp, len);
diff --git a/fs/xfs/xfs_attr_item.h b/fs/xfs/xfs_attr_item.h
index 3280a7930287..9ae0b3696847 100644
--- a/fs/xfs/xfs_attr_item.h
+++ b/fs/xfs/xfs_attr_item.h
@@ -13,7 +13,9 @@ struct kmem_zone;
 
 struct xfs_attri_log_nameval {
 	struct xfs_log_iovec	name;
+	struct xfs_log_iovec	new_name;	/* NVREPLACE only */
 	struct xfs_log_iovec	value;
+	struct xfs_log_iovec	new_value;	/* NVREPLACE only */
 	refcount_t		refcount;
 
 	/* name and value follow the end of this struct */


  parent reply	other threads:[~2023-05-26  2:09 UTC|newest]

Thread overview: 135+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-05-26  0:07 [RFC MEGAPATCHSET v12 1/2] xfs: parent pointers and online repair part 2 Darrick J. Wong
2023-05-26  2:00 ` [PATCHSET RFC v12.0 00/11] fstests: adjust tests for xfs parent pointers Darrick J. Wong
2023-05-26  2:02   ` [PATCH 01/11] xfs/206: filter out the parent= status from mkfs Darrick J. Wong
2023-05-26  2:02   ` [PATCH 02/11] xfs/122: update for parent pointers Darrick J. Wong
2023-05-26  2:02   ` [PATCH 03/11] populate: create hardlinks " Darrick J. Wong
2023-05-26  2:03   ` [PATCH 04/11] xfs/021: adapt golden output files " Darrick J. Wong
2023-05-26  2:03   ` [PATCH 05/11] generic/050: adapt " Darrick J. Wong
2023-05-26  2:03   ` [PATCH 06/11] xfs/018: disable parent pointers for this test Darrick J. Wong
2023-05-26 20:01     ` Zorro Lang
2023-06-02  1:06       ` Darrick J. Wong
2023-06-02 10:27         ` Zorro Lang
2023-06-02 14:29           ` Darrick J. Wong
2023-05-26  2:03   ` [PATCH 07/11] xfs/306: fix formatting failures with parent pointers Darrick J. Wong
2023-05-26  2:04   ` [PATCH 08/11] common: add helpers for parent pointer tests Darrick J. Wong
2023-05-26  2:04   ` [PATCH 09/11] xfs: add parent pointer test Darrick J. Wong
2023-05-26  2:04   ` [PATCH 10/11] xfs: add multi link " Darrick J. Wong
2023-05-26  2:04   ` [PATCH 11/11] xfs: add parent pointer inject test Darrick J. Wong
2023-05-26  2:00 ` [PATCHSET v12.0 0/7] xfs: retain ILOCK during directory updates Darrick J. Wong
2023-05-26  2:05   ` [PATCH 1/7] xfs: Increase XFS_DEFER_OPS_NR_INODES to 5 Darrick J. Wong
2023-05-26  2:05   ` [PATCH 2/7] xfs: Increase XFS_QM_TRANS_MAXDQS " Darrick J. Wong
2023-05-26  2:05   ` [PATCH 3/7] xfs: Hold inode locks in xfs_ialloc Darrick J. Wong
2023-05-26  2:06   ` [PATCH 4/7] xfs: Hold inode locks in xfs_trans_alloc_dir Darrick J. Wong
2023-05-26  2:06   ` [PATCH 5/7] xfs: Hold inode locks in xfs_rename Darrick J. Wong
2023-05-26  2:06   ` [PATCH 6/7] xfs: don't pick up IOLOCK during rmapbt repair scan Darrick J. Wong
2023-05-26  2:06   ` [PATCH 7/7] xfs: unlock new repair tempfiles after creation Darrick J. Wong
2023-05-26  2:00 ` [PATCHSET v12.0 00/12] xfs: name-value xattr lookups Darrick J. Wong
2023-05-26  2:07   ` [PATCH 01/12] xfs: check opcode and iovec count match in xlog_recover_attri_commit_pass2 Darrick J. Wong
2023-05-26  2:07   ` [PATCH 02/12] xfs: make xfs_attr_set require XFS_DA_OP_REMOVE Darrick J. Wong
2023-05-26  2:07   ` [PATCH 03/12] xfs: allow xattr matching on name and value for local/sf attrs Darrick J. Wong
2023-05-26  2:07   ` [PATCH 04/12] xfs: preserve NVLOOKUP in xfs_attr_set Darrick J. Wong
2023-05-26  2:08   ` [PATCH 05/12] xfs: restructure xfs_attr_complete_op a bit Darrick J. Wong
2023-05-26  2:08   ` [PATCH 06/12] xfs: use helpers to extract xattr op from opflags Darrick J. Wong
2023-05-26  2:08   ` [PATCH 07/12] xfs: validate recovered name buffers when recovering xattr items Darrick J. Wong
2023-05-26  2:08   ` [PATCH 08/12] xfs: always set args->value in xfs_attri_item_recover Darrick J. Wong
2023-05-26  2:09   ` [PATCH 09/12] xfs: use local variables for name and value length in _attri_commit_pass2 Darrick J. Wong
2023-05-26  2:09   ` [PATCH 10/12] xfs: log NVLOOKUP xattr removal operations Darrick J. Wong
2023-05-26  2:09   ` [PATCH 11/12] xfs: log NVLOOKUP xattr setting operations Darrick J. Wong
2023-05-26  2:09   ` Darrick J. Wong [this message]
2023-05-26  2:00 ` [PATCHSET v12.0 00/18] xfs: Parent Pointers Darrick J. Wong
2023-05-26  2:10   ` [PATCH 01/18] xfs: add parent pointer support to attribute code Darrick J. Wong
2023-05-26  2:10   ` [PATCH 02/18] xfs: define parent pointer ondisk extended attribute format Darrick J. Wong
2023-05-26  2:10   ` [PATCH 03/18] xfs: add parent pointer validator functions Darrick J. Wong
2023-05-26  2:10   ` [PATCH 04/18] xfs: extend transaction reservations for parent attributes Darrick J. Wong
2023-05-26  2:11   ` [PATCH 05/18] xfs: parent pointer attribute creation Darrick J. Wong
2023-05-26  2:11   ` [PATCH 06/18] xfs: add parent attributes to link Darrick J. Wong
2023-05-26  2:11   ` [PATCH 07/18] xfs: add parent attributes to symlink Darrick J. Wong
2023-05-26  2:11   ` [PATCH 08/18] xfs: remove parent pointers in unlink Darrick J. Wong
2023-05-26  2:12   ` [PATCH 09/18] xfs: Indent xfs_rename Darrick J. Wong
2023-05-26  2:12   ` [PATCH 10/18] xfs: Add parent pointers to rename Darrick J. Wong
2023-05-26  2:12   ` [PATCH 11/18] xfs: Add parent pointers to xfs_cross_rename Darrick J. Wong
2023-05-26  2:13   ` [PATCH 12/18] xfs: Filter XFS_ATTR_PARENT for getfattr Darrick J. Wong
2023-05-26  2:13   ` [PATCH 13/18] xfs: pass the attr value to put_listent when possible Darrick J. Wong
2023-05-26  2:13   ` [PATCH 14/18] xfs: Add parent pointer ioctl Darrick J. Wong
2023-05-26  2:13   ` [PATCH 15/18] xfs: fix unit conversion error in xfs_log_calc_max_attrsetm_res Darrick J. Wong
2023-05-26  2:14   ` [PATCH 16/18] xfs: drop compatibility minimum log size computations for reflink Darrick J. Wong
2023-05-26  2:14   ` [PATCH 17/18] xfs: don't remove the attr fork when parent pointers are enabled Darrick J. Wong
2023-05-26  2:14   ` [PATCH 18/18] xfs: Add the parent pointer support to the superblock version 5 Darrick J. Wong
2023-05-26  2:01 ` [PATCHSET v12.0 00/17] xfs: fsck for parent pointers Darrick J. Wong
2023-05-26  2:14   ` [PATCH 01/17] xfs: check dirents have " Darrick J. Wong
2023-05-26  2:15   ` [PATCH 02/17] xfs: deferred scrub of dirents Darrick J. Wong
2023-05-26  2:15   ` [PATCH 03/17] xfs: scrub parent pointers Darrick J. Wong
2023-05-26  2:15   ` [PATCH 04/17] xfs: deferred scrub of " Darrick J. Wong
2023-05-26  2:15   ` [PATCH 05/17] xfs: add raw parent pointer apis to support repair Darrick J. Wong
2023-05-26  2:16   ` [PATCH 06/17] xfs: set child file owner in xfs_da_args when changing parent pointers Darrick J. Wong
2023-05-26  2:16   ` [PATCH 07/17] xfs: salvage parent pointers when rebuilding xattr structures Darrick J. Wong
2023-05-26  2:16   ` [PATCH 08/17] xfs: teach the adoption code about parent pointers Darrick J. Wong
2023-05-26  2:16   ` [PATCH 09/17] xfs: replace namebuf with parent pointer in directory repair Darrick J. Wong
2023-05-26  2:17   ` [PATCH 10/17] xfs: repair directories by scanning directory parent pointers Darrick J. Wong
2023-05-26  2:17   ` [PATCH 11/17] xfs: implement live updates for directory repairs Darrick J. Wong
2023-05-26  2:17   ` [PATCH 12/17] xfs: replay unlocked parent pointer updates that accrue during xattr repair Darrick J. Wong
2023-05-26  2:17   ` [PATCH 13/17] xfs: replace namebuf with parent pointer in parent pointer repair Darrick J. Wong
2023-05-26  2:18   ` [PATCH 14/17] xfs: repair directory parent pointers by scanning for dirents Darrick J. Wong
2023-05-26  2:18   ` [PATCH 15/17] xfs: implement live updates for parent pointer repairs Darrick J. Wong
2023-05-26  2:18   ` [PATCH 16/17] xfs: remove pointless unlocked assertion Darrick J. Wong
2023-05-26  2:18   ` [PATCH 17/17] xfs: actually rebuild the parent pointer xattrs Darrick J. Wong
2023-05-26  2:01 ` [PATCHSET v12.0 0/1] xfsprogs: retain ILOCK during directory updates Darrick J. Wong
2023-05-26  2:19   ` [PATCH 1/1] xfs: Increase XFS_DEFER_OPS_NR_INODES to 5 Darrick J. Wong
2023-05-26  2:01 ` [PATCHSET v12.0 00/10] xfsprogs: name-value xattr lookups Darrick J. Wong
2023-05-26  2:19   ` [PATCH 01/10] xfs: make xfs_attr_set require XFS_DA_OP_REMOVE Darrick J. Wong
2023-05-26  2:19   ` [PATCH 02/10] xfs: allow xattr matching on name and value for local/sf attrs Darrick J. Wong
2023-05-26  2:20   ` [PATCH 03/10] xfs: preserve NVLOOKUP in xfs_attr_set Darrick J. Wong
2023-05-26  2:20   ` [PATCH 04/10] xfs: restructure xfs_attr_complete_op a bit Darrick J. Wong
2023-05-26  2:20   ` [PATCH 05/10] xfs: use helpers to extract xattr op from opflags Darrick J. Wong
2023-05-26  2:20   ` [PATCH 06/10] xfs: log NVLOOKUP xattr removal operations Darrick J. Wong
2023-05-26  2:21   ` [PATCH 07/10] xfs: log NVLOOKUP xattr setting operations Darrick J. Wong
2023-05-26  2:21   ` [PATCH 08/10] xfs: log NVLOOKUP xattr nvreplace operations Darrick J. Wong
2023-05-26  2:21   ` [PATCH 09/10] xfs_logprint: dump new attr log item fields Darrick J. Wong
2023-05-26  2:21   ` [PATCH 10/10] xfs_logprint: print missing attri header fields Darrick J. Wong
2023-05-26  2:01 ` [PATCHSET v12.0 00/30] xfsprogs: Parent Pointers Darrick J. Wong
2023-05-26  2:22   ` [PATCH 01/30] xfs: add parent pointer support to attribute code Darrick J. Wong
2023-05-26  2:22   ` [PATCH 02/30] xfs: define parent pointer ondisk extended attribute format Darrick J. Wong
2023-05-26  2:22   ` [PATCH 03/30] xfs: add parent pointer validator functions Darrick J. Wong
2023-05-26  2:22   ` [PATCH 04/30] xfs: extend transaction reservations for parent attributes Darrick J. Wong
2023-05-26  2:23   ` [PATCH 05/30] xfs: parent pointer attribute creation Darrick J. Wong
2023-05-26  2:23   ` [PATCH 06/30] xfs: add parent attributes to link Darrick J. Wong
2023-05-26  2:23   ` [PATCH 07/30] xfs: add parent attributes to symlink Darrick J. Wong
2023-05-26  2:23   ` [PATCH 08/30] xfs: remove parent pointers in unlink Darrick J. Wong
2023-05-26  2:24   ` [PATCH 09/30] xfs: Add parent pointers to rename Darrick J. Wong
2023-05-26  2:24   ` [PATCH 10/30] xfs: pass the attr value to put_listent when possible Darrick J. Wong
2023-05-26  2:24   ` [PATCH 11/30] xfs: Add parent pointer ioctl Darrick J. Wong
2023-05-26  2:24   ` [PATCH 12/30] xfs: fix unit conversion error in xfs_log_calc_max_attrsetm_res Darrick J. Wong
2023-05-26  2:25   ` [PATCH 13/30] xfs: drop compatibility minimum log size computations for reflink Darrick J. Wong
2023-05-26  2:25   ` [PATCH 14/30] xfs: don't remove the attr fork when parent pointers are enabled Darrick J. Wong
2023-05-26  2:25   ` [PATCH 15/30] xfs: Add the parent pointer support to the superblock version 5 Darrick J. Wong
2023-05-26  2:26   ` [PATCH 16/30] libfrog: add parent pointer support code Darrick J. Wong
2023-05-26  2:26   ` [PATCH 17/30] xfs_io: adapt parent command to new parent pointer ioctls Darrick J. Wong
2023-05-26  2:26   ` [PATCH 18/30] xfs_io: Add i, n and f flags to parent command Darrick J. Wong
2023-05-26  2:26   ` [PATCH 19/30] xfs_logprint: decode parent pointers in ATTRI items fully Darrick J. Wong
2023-05-26  2:27   ` [PATCH 20/30] xfs_spaceman: report file paths Darrick J. Wong
2023-05-26  2:27   ` [PATCH 21/30] xfs_scrub: use parent pointers when possible to report file operations Darrick J. Wong
2023-05-26  2:27   ` [PATCH 22/30] xfs_db: report parent bit on xattrs Darrick J. Wong
2023-05-26  2:27   ` [PATCH 23/30] xfs_db: report parent pointers embedded in xattrs Darrick J. Wong
2023-05-26  2:28   ` [PATCH 24/30] xfs_db: obfuscate dirent and parent pointer names consistently Darrick J. Wong
2023-05-26  2:28   ` [PATCH 25/30] libxfs: export attr3_leaf_hdr_from_disk via libxfs_api_defs.h Darrick J. Wong
2023-05-26  2:28   ` [PATCH 26/30] xfs_db: add a parents command to list the parents of a file Darrick J. Wong
2023-05-26  2:28   ` [PATCH 27/30] libxfs: create new files with attr forks if necessary Darrick J. Wong
2023-05-26  2:29   ` [PATCH 28/30] xfsprogs: Fix default superblock attr bits Darrick J. Wong
2023-05-26  2:29   ` [PATCH 29/30] mkfs: Add parent pointers during protofile creation Darrick J. Wong
2023-05-26  2:29   ` [PATCH 30/30] mkfs: enable formatting with parent pointers Darrick J. Wong
2023-05-26  2:02 ` [PATCHSET v12.0 00/14] xfsprogs: fsck for " Darrick J. Wong
2023-05-26  2:29   ` [PATCH 01/14] xfs: create a blob array data structure Darrick J. Wong
2023-05-26  2:30   ` [PATCH 02/14] xfs: check dirents have parent pointers Darrick J. Wong
2023-05-26  2:30   ` [PATCH 03/14] xfs: add raw parent pointer apis to support repair Darrick J. Wong
2023-05-26  2:30   ` [PATCH 04/14] xfs: set child file owner in xfs_da_args when changing parent pointers Darrick J. Wong
2023-05-26  2:30   ` [PATCH 05/14] xfs: remove pointless unlocked assertion Darrick J. Wong
2023-05-26  2:31   ` [PATCH 06/14] xfs_repair: add parent pointers when messing with /lost+found Darrick J. Wong
2023-05-26  2:31   ` [PATCH 07/14] xfs_repair: build a parent pointer index Darrick J. Wong
2023-05-26  2:31   ` [PATCH 08/14] xfs_repair: move the global dirent name store to a separate object Darrick J. Wong
2023-05-26  2:31   ` [PATCH 09/14] xfs_repair: deduplicate strings stored in string blob Darrick J. Wong
2023-05-26  2:32   ` [PATCH 10/14] xfs_repair: check parent pointers Darrick J. Wong
2023-05-26  2:32   ` [PATCH 11/14] xfs_repair: dump garbage parent pointer attributes Darrick J. Wong
2023-05-26  2:32   ` [PATCH 12/14] xfs_repair: update ondisk parent pointer records Darrick J. Wong
2023-05-26  2:33   ` [PATCH 13/14] xfs_repair: wipe ondisk parent pointers when there are none Darrick J. Wong
2023-05-26  2:33   ` [PATCH 14/14] xfs_scrub: use parent pointers to report lost file data Darrick J. Wong
  -- strict thread matches above, loose matches on Subject: below --
2023-04-06 19:13 [PATCHSET v11 00/12] xfs: name-value xattr lookups Darrick J. Wong
2023-04-06 19:19 ` [PATCH 12/12] xfs: log NVLOOKUP xattr nvreplace operations Darrick J. Wong

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=168506072353.3743652.15630681214608046007.stgit@frogsfrogsfrogs \
    --to=djwong@kernel.org \
    --cc=allison.henderson@oracle.com \
    --cc=catherine.hoang@oracle.com \
    --cc=linux-xfs@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.