[PATCH 08/20] Reset dirent args on transaction retry

Valerie Aurora val at versity.com
Thu Jun 12 13:11:00 PDT 2025


When transactions fail and need to retry, we need to reset any
variables that were altered by the failed transaction. Add
reset_dirent_args() to do this reset.

Signed-off-by: Valerie Aurora <val at versity.com>
---
 shared/dir.c | 24 +++++++++++++++++++++---
 1 file changed, 21 insertions(+), 3 deletions(-)

diff --git a/shared/dir.c b/shared/dir.c
index 3828d1b..4c9aaf3 100644
--- a/shared/dir.c
+++ b/shared/dir.c
@@ -136,13 +136,14 @@ static unsigned int pers_dtype_to_abi_dtype(enum ngnfs_dentry_type type)
 	return DT_UNKNOWN;
 }
 
+/*
+ * Initialize the members that stay the same during transaction retries.
+ */
 static void init_dirent_args(struct dirent_args *da, char *name, size_t name_len, mode_t mode)
 {
 	da->hash = name_hash(name, name_len);
 	da->dent_size = offsetof(struct ngnfs_dirent, name) + name_len;
 
-	da->dent.ig.ino = cpu_to_le64(0);
-	da->dent.ig.gen = cpu_to_le64(0);
 	da->dent.pers_dtype = mode_to_pers_type(mode);
 	da->dent.name_len = name_len;
 	memcpy(da->dent.name, name, name_len);
@@ -154,6 +155,21 @@ static void init_dirent_args(struct dirent_args *da, char *name, size_t name_len
 		      sizeof_field(struct dirent_args, __max_name_storage)) != NGNFS_NAME_MAX);
 }
 
+/*
+ * Reset the members that may be altered during a transaction and need
+ * to be reset before retrying a transaction.
+ */
+static void reset_dirent_args(struct dirent_args *da)
+{
+	da->dent.ig.ino = cpu_to_le64(0);
+	da->dent.ig.gen = cpu_to_le64(0);
+}
+
+/*
+ * Update members with results gathered during a transaction. Everything
+ * altered in this function should be reset by the corresponding rest
+ * function.
+ */
 static int update_dirent_args(struct dirent_args *da, struct ngnfs_inode_ino_gen *ig)
 {
 	da->dent.ig.ino = cpu_to_le64(ig->ino);
@@ -283,12 +299,14 @@ int ngnfs_dir_create(struct ngnfs_fs_info *nfi, struct ngnfs_inode_ino_gen *dir,
 	}
 
 	ngnfs_txn_init(&op->txn);
-	op->nsec = ktime_to_ns(ktime_get_real());
 	op->parent_ig.ino = 0;
 	op->parent_ig.gen = 0;
 	init_dirent_args(&op->da, name, name_len, mode | S_IFREG);
 
 	do {
+		op->nsec = ktime_to_ns(ktime_get_real());
+		reset_dirent_args(&op->da);
+
 		ret = ngnfs_inode_get(nfi, &op->txn, NBF_WRITE, dir, &op->dir)			?:
 		      check_ifmt(op->dir.ninode, S_IFDIR, -ENOTDIR)				?:
 		      ngnfs_inode_alloc(nfi, &op->txn, &op->ig, &op->inode)			?:
-- 
2.49.0




More information about the ngnfs-devel mailing list