[PATCH 05/20] Add parent inode number/generation for directories
Valerie Aurora
val at versity.com
Thu Jun 12 13:10:57 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 | 6 +++++-
shared/format-block.h | 3 ++-
shared/inode.c | 4 +++-
shared/inode.h | 2 +-
shared/mkfs.c | 2 +-
6 files changed, 16 insertions(+), 5 deletions(-)
diff --git a/cli/debugfs.c b/cli/debugfs.c
index 8711d81..acb2a73 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 eaf808e..570fbaf 100644
--- a/shared/dir.c
+++ b/shared/dir.c
@@ -241,6 +241,7 @@ int ngnfs_dir_create(struct ngnfs_fs_info *nfi, struct ngnfs_inode_ino_gen *dir,
struct ngnfs_transaction txn;
struct ngnfs_inode_txn_ref dir;
struct ngnfs_inode_txn_ref inode;
+ struct ngnfs_inode_ino_gen parent_ig;
struct ngnfs_inode_ino_gen ig;
u64 nsec;
struct dirent_args da;
@@ -255,13 +256,16 @@ 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 {
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) ?:
- ngnfs_inode_init(&op->inode, &op->ig, 1, mode | S_IFREG, op->nsec) ?:
+ ngnfs_inode_init(&op->inode, &op->ig, 1, mode | S_IFREG, op->nsec,
+ &op->parent_ig) ?:
update_dirent_args(&op->da, &op->ig) ?:
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 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..f4a66f2 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,8 @@ 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));
+ 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));
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 23aa0bf..a2f91ba 100644
--- a/shared/inode.h
+++ b/shared/inode.h
@@ -34,7 +34,7 @@ struct ngnfs_inode_ino_gen {
(_ig_ino(a) == _ig_ino(b) && _ig_gen(a) == _ig_gen(b))
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 5bafc83..81dcd15 100644
--- a/shared/mkfs.c
+++ b/shared/mkfs.c
@@ -28,7 +28,7 @@ int ngnfs_mkfs(struct ngnfs_fs_info *nfi)
nsec = ktime_to_ns(ktime_get_real());
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.49.0
More information about the ngnfs-devel
mailing list