[PATCH 06/14] Add parent inode number for directories

Valerie Aurora val at versity.com
Thu Feb 27 06:16:15 PST 2025


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

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

diff --git a/shared/dir.c b/shared/dir.c
index a0c698f..d969e10 100644
--- a/shared/dir.c
+++ b/shared/dir.c
@@ -260,7 +260,7 @@ int ngnfs_dir_create(struct ngnfs_fs_info *nfi, u64 dir_ino, umode_t mode, char
 		ret = ngnfs_inode_get(nfi, &op->txn, NBF_WRITE, dir_ino, &op->dir)		?:
 		      check_ifmt(op->dir.ninode, S_IFDIR, -ENOTDIR)				?:
 		      ngnfs_inode_alloc(nfi, &op->txn, &op->ino, &op->inode)			?:
-		      ngnfs_inode_init(&op->inode, op->ino, 1, 1, mode | S_IFREG, op->nsec)	?:
+		      ngnfs_inode_init(&op->inode, op->ino, 1, 1, mode | S_IFREG, op->nsec, 0)	?:
 		      update_dirent_args_ino(&op->da, op->ino)					?:
 		      insert_dirent(nfi, &op->txn, &op->dir, &op->da)				?:
 		      update_dir(op->dir.tblk, op->dir.ninode, &op->da, 1);
diff --git a/shared/format-block.h b/shared/format-block.h
index 65274e1..b0bc995 100644
--- a/shared/format-block.h
+++ b/shared/format-block.h
@@ -91,6 +91,7 @@ struct ngnfs_inode {
 	__le64 gen;
 	__le64 size;
 	__le64 version;
+	__le64 parent_ino; /* only valid for directories */
 	__le32 nlink;
 	__le32 uid;
 	__le32 gid;
diff --git a/shared/inode.c b/shared/inode.c
index 131e195..03aadc7 100644
--- a/shared/inode.c
+++ b/shared/inode.c
@@ -20,7 +20,7 @@
  */
 
 int ngnfs_inode_init(struct ngnfs_inode_txn_ref *itref, u64 ino, u64 gen, u32 nlink, umode_t mode,
-		     u64 nsec)
+		     u64 nsec, u64 parent_ino)
 {
 	struct ngnfs_txn_block *tblk = itref->tblk;
 	struct ngnfs_inode *ninode = itref->ninode;
@@ -29,6 +29,7 @@ int ngnfs_inode_init(struct ngnfs_inode_txn_ref *itref, u64 ino, u64 gen, u32 nl
 	ngnfs_tblk_assign(tblk, ninode->gen, cpu_to_le64(gen));
 	ngnfs_tblk_assign(tblk, ninode->size, 0);
 	ngnfs_tblk_assign(tblk, ninode->version, cpu_to_le64(1));
+	ngnfs_tblk_assign(tblk, ninode->parent_ino, cpu_to_le64(parent_ino));
 	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 3f6328b..cafbdfb 100644
--- a/shared/inode.h
+++ b/shared/inode.h
@@ -15,7 +15,7 @@ struct ngnfs_inode_txn_ref {
 };
 
 int ngnfs_inode_init(struct ngnfs_inode_txn_ref *itref, u64 ino, u64 gen, u32 nlink, umode_t mode,
-		     u64 nsec);
+		     u64 nsec, u64 parent_ino);
 int ngnfs_inode_get(struct ngnfs_fs_info *nfi, struct ngnfs_transaction *txn, nbf_t nbf, u64 ino,
 		    struct ngnfs_inode_txn_ref *itref);
 int ngnfs_inode_alloc(struct ngnfs_fs_info *nfi, struct ngnfs_transaction *txn, u64 *ino,
diff --git a/shared/mkfs.c b/shared/mkfs.c
index dee8cbe..a9a6a8c 100644
--- a/shared/mkfs.c
+++ b/shared/mkfs.c
@@ -26,7 +26,8 @@ int ngnfs_mkfs(struct ngnfs_fs_info *nfi)
 
 	do {
 		ret = ngnfs_inode_get(nfi, &txn, NBF_WRITE, NGNFS_ROOT_INO, &itref)		?:
-		      ngnfs_inode_init(&itref, NGNFS_ROOT_INO, 1, 2, S_IFDIR | 0755, nsec);
+		      ngnfs_inode_init(&itref, NGNFS_ROOT_INO, 1, 2, S_IFDIR | 0755, nsec,
+				       NGNFS_ROOT_INO);
 
 	} while (ngnfs_txn_retry(nfi, &txn, &ret));
 
-- 
2.48.1




More information about the ngnfs-devel mailing list