[PATCH 09/23] Add parent inode number/generation for directories

Valerie Aurora val at versity.com
Fri Apr 4 11:45:25 PDT 2025


Add a parent inode number/generation field to the inode to give us back
references for directories. For non-directories, this field is empty
and back references will go in a per-inode btree (TODO).

Signed-off-by: Valerie Aurora <val at versity.com>
---
 cli/debugfs.c         | 4 ++++
 shared/dir.c          | 3 ++-
 shared/dir.h          | 1 +
 shared/format-block.h | 3 ++-
 shared/inode.c        | 9 ++++++++-
 shared/inode.h        | 2 +-
 shared/mkfs.c         | 2 +-
 7 files changed, 19 insertions(+), 5 deletions(-)

diff --git a/cli/debugfs.c b/cli/debugfs.c
index 0b8fb99..84b3150 100644
--- a/cli/debugfs.c
+++ b/cli/debugfs.c
@@ -130,6 +130,8 @@ static void cmd_stat(struct debugfs_context *ctx, int argc, char **argv)
 		       "size: %llu\n"
 		       "nlink: %u\n"
 		       "mode: %o\n"
+		       "parent ino: %llu\n"
+		       "parent gen: %llu\n"
 		       "atime: %llu\n"
 		       "ctime: %llu\n"
 		       "mtime: %llu\n"
@@ -139,6 +141,8 @@ static void cmd_stat(struct debugfs_context *ctx, int argc, char **argv)
 		       le64_to_cpu(ninode.size),
 		       le32_to_cpu(ninode.nlink),
 		       le32_to_cpu(ninode.mode),
+		       le64_to_cpu(ninode.parent_ig.ino),
+		       le64_to_cpu(ninode.parent_ig.gen),
 		       le64_to_cpu(ninode.atime_nsec),
 		       le64_to_cpu(ninode.ctime_nsec),
 		       le64_to_cpu(ninode.mtime_nsec),
diff --git a/shared/dir.c b/shared/dir.c
index fe2441a..f335e04 100644
--- a/shared/dir.c
+++ b/shared/dir.c
@@ -264,7 +264,8 @@ int ngnfs_dir_create(struct ngnfs_fs_info *nfi, struct ngnfs_inode_ino_gen *dir,
 		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->da.ig, &op->inode)			?:
-		      ngnfs_inode_init(&op->inode, &op->da.ig, 1, mode | S_IFREG, op->nsec)	?:
+		      ngnfs_inode_init(&op->inode, &op->da.ig, 1, mode | S_IFREG, op->nsec,
+				       NULL)							?:
 		      update_dirent_args_dent(&op->da)						?:
 		      insert_dirent(nfi, &op->txn, &op->dir, &op->da)				?:
 		      update_dir(op->dir.tblk, op->dir.ninode, &op->da, 1);
diff --git a/shared/dir.h b/shared/dir.h
index 8ca28b8..d56641f 100644
--- a/shared/dir.h
+++ b/shared/dir.h
@@ -4,6 +4,7 @@
 
 #include "shared/inode.h"
 #include "shared/fs_info.h"
+#include "shared/inode.h"
 
 int ngnfs_dir_create(struct ngnfs_fs_info *nfi, struct ngnfs_inode_ino_gen *dir, umode_t mode,
 		     char *name, size_t name_len);
diff --git a/shared/format-block.h b/shared/format-block.h
index 787de90..9c5221e 100644
--- a/shared/format-block.h
+++ b/shared/format-block.h
@@ -104,7 +104,8 @@ struct ngnfs_ino_gen {
 struct ngnfs_inode {
 	struct ngnfs_ino_gen ig;
 	__le64 size;
-	__le64 version;
+	__le64 version;			/* changed on file content/metadata changes */
+	struct ngnfs_ino_gen parent_ig;	/* only valid for directories */
 	__le32 nlink;
 	__le32 uid;
 	__le32 gid;
diff --git a/shared/inode.c b/shared/inode.c
index 92a74fe..982f8af 100644
--- a/shared/inode.c
+++ b/shared/inode.c
@@ -20,7 +20,7 @@
  */
 
 int ngnfs_inode_init(struct ngnfs_inode_txn_ref *itref, struct ngnfs_inode_ino_gen *ig, u32 nlink,
-		     umode_t mode, u64 nsec)
+		     umode_t mode, u64 nsec, struct ngnfs_inode_ino_gen *parent_ig)
 {
 	struct ngnfs_txn_block *tblk = itref->tblk;
 	struct ngnfs_inode *ninode = itref->ninode;
@@ -29,6 +29,13 @@ int ngnfs_inode_init(struct ngnfs_inode_txn_ref *itref, struct ngnfs_inode_ino_g
 	ngnfs_tblk_assign(tblk, ninode->ig.gen, cpu_to_le64(ig->gen));
 	ngnfs_tblk_assign(tblk, ninode->size, 0);
 	ngnfs_tblk_assign(tblk, ninode->version, cpu_to_le64(1));
+	if (parent_ig != NULL) {
+		ngnfs_tblk_assign(tblk, ninode->parent_ig.ino, cpu_to_le64(parent_ig->ino));
+		ngnfs_tblk_assign(tblk, ninode->parent_ig.gen, cpu_to_le64(parent_ig->gen));
+	} else {
+		ngnfs_tblk_assign(tblk, ninode->parent_ig.ino, cpu_to_le64(0));
+		ngnfs_tblk_assign(tblk, ninode->parent_ig.gen, cpu_to_le64(0));
+	}
 	ngnfs_tblk_assign(tblk, ninode->nlink, cpu_to_le32(nlink));
 	ngnfs_tblk_assign(tblk, ninode->uid, 0);
 	ngnfs_tblk_assign(tblk, ninode->gid, 0);
diff --git a/shared/inode.h b/shared/inode.h
index d9dbb77..92b5114 100644
--- a/shared/inode.h
+++ b/shared/inode.h
@@ -20,7 +20,7 @@ struct ngnfs_inode_ino_gen {
 };
 
 int ngnfs_inode_init(struct ngnfs_inode_txn_ref *itref, struct ngnfs_inode_ino_gen *ig, u32 nlink,
-		     umode_t mode, u64 nsec);
+		     umode_t mode, u64 nsec, struct ngnfs_inode_ino_gen *parent_ig);
 int ngnfs_inode_get(struct ngnfs_fs_info *nfi, struct ngnfs_transaction *txn, nbf_t nbf,
 		    struct ngnfs_inode_ino_gen *ig, struct ngnfs_inode_txn_ref *itref);
 int ngnfs_inode_alloc(struct ngnfs_fs_info *nfi, struct ngnfs_transaction *txn,
diff --git a/shared/mkfs.c b/shared/mkfs.c
index 3e84393..84613e6 100644
--- a/shared/mkfs.c
+++ b/shared/mkfs.c
@@ -27,7 +27,7 @@ int ngnfs_mkfs(struct ngnfs_fs_info *nfi)
 
 	do {
 		ret = ngnfs_inode_get(nfi, &txn, NBF_WRITE, &ig, &itref)			?:
-		      ngnfs_inode_init(&itref, &ig, 2, S_IFDIR | 0755, nsec);
+		      ngnfs_inode_init(&itref, &ig, 2, S_IFDIR | 0755, nsec, &ig);
 
 	} while (ngnfs_txn_retry(nfi, &txn, &ret));
 
-- 
2.48.1




More information about the ngnfs-devel mailing list