[PATCH RFC DRAFT v2 06/13] ceph: move fscrypt to filesystem inode

Christian Brauner
2025-07-22T12:58:04Z

Move fscrypt data pointer into the filesystem's private inode and record
the offset from the embedded struct inode.

This will allow us to drop the fscrypt data pointer from struct inode
itself and move it into the filesystem's inode.

Signed-off-by: Christian Brauner <brauner@kernel.org>
---
fs/ceph/dir.c | 8 ++++++++
fs/ceph/inode.c | 21 +++++++++++++++++++++
include/linux/netfs.h | 6 ++++++
3 files changed, 35 insertions(+)

diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c
index a321aa6d0ed2..2db146fadddb 100644
--- a/fs/ceph/dir.c
+++ b/fs/ceph/dir.c
@@ -2229,6 +2229,10 @@ const struct file_operations ceph_snapdir_fops = {
};

const struct inode_operations ceph_dir_iops = {
+#ifdef CONFIG_FS_ENCRYPTION
+ .i_fscrypt = offsetof(struct ceph_inode_info, netfs.i_fscrypt_info) -
+ offsetof(struct ceph_inode_info, netfs.inode),
+#endif
.lookup = ceph_lookup,
.permission = ceph_permission,
.getattr = ceph_getattr,
@@ -2248,6 +2252,10 @@ const struct inode_operations ceph_dir_iops = {
};

const struct inode_operations ceph_snapdir_iops = {
+#ifdef CONFIG_FS_ENCRYPTION
+ .i_fscrypt = offsetof(struct ceph_inode_info, netfs.i_fscrypt_info) -
+ offsetof(struct ceph_inode_info, netfs.inode),
+#endif
.lookup = ceph_lookup,
.permission = ceph_permission,
.getattr = ceph_getattr,
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c
index 06cd2963e41e..3f8f779f3dcd 100644
--- a/fs/ceph/inode.c
+++ b/fs/ceph/inode.c
@@ -36,6 +36,12 @@

static const struct inode_operations ceph_symlink_iops;
static const struct inode_operations ceph_encrypted_symlink_iops;
+static const struct inode_operations ceph_encrypted_nop_iops = {
+#ifdef CONFIG_FS_ENCRYPTION
+ .i_fscrypt = offsetof(struct ceph_inode_info, netfs.i_fscrypt_info) -
+ offsetof(struct ceph_inode_info, netfs.inode),
+#endif
+};

static void ceph_inode_work(struct work_struct *work);

@@ -49,6 +55,7 @@ static int ceph_set_ino_cb(struct inode *inode, void *data)

ci->i_vino = *(struct ceph_vino *)data;
inode->i_ino = ceph_vino_to_ino_t(ci->i_vino);
+ inode->i_op = &ceph_encrypted_nop_iops;
inode_set_iversion_raw(inode, 0);
percpu_counter_inc(&mdsc->metric.total_inodes);

@@ -89,6 +96,8 @@ struct inode *ceph_new_inode(struct inode *dir, struct dentry *dentry,
inode->i_state = 0;
inode->i_mode = *mode;

+ inode->i_op = &ceph_encrypted_nop_iops;
+
err = ceph_security_init_secctx(dentry, *mode, as_ctx);
if (err < 0)
goto out_err;
@@ -232,6 +241,10 @@ struct inode *ceph_get_snapdir(struct inode *parent)
}

const struct inode_operations ceph_file_iops = {
+#ifdef CONFIG_FS_ENCRYPTION
+ .i_fscrypt = offsetof(struct ceph_inode_info, netfs.i_fscrypt_info) -
+ offsetof(struct ceph_inode_info, netfs.inode),
+#endif
.permission = ceph_permission,
.setattr = ceph_setattr,
.getattr = ceph_getattr,
@@ -2314,6 +2327,10 @@ static int ceph_encrypted_symlink_getattr(struct mnt_idmap *idmap,
* symlinks
*/
static const struct inode_operations ceph_symlink_iops = {
+#ifdef CONFIG_FS_ENCRYPTION
+ .i_fscrypt = offsetof(struct ceph_inode_info, netfs.i_fscrypt_info) -
+ offsetof(struct ceph_inode_info, netfs.inode),
+#endif
.get_link = simple_get_link,
.setattr = ceph_setattr,
.getattr = ceph_getattr,
@@ -2321,6 +2338,10 @@ static const struct inode_operations ceph_symlink_iops = {
};

static const struct inode_operations ceph_encrypted_symlink_iops = {
+#ifdef CONFIG_FS_ENCRYPTION
+ .i_fscrypt = offsetof(struct ceph_inode_info, netfs.i_fscrypt_info) -
+ offsetof(struct ceph_inode_info, netfs.inode),
+#endif
.get_link = ceph_encrypted_get_link,
.setattr = ceph_setattr,
.getattr = ceph_encrypted_symlink_getattr,
diff --git a/include/linux/netfs.h b/include/linux/netfs.h
index 065c17385e53..fda1321da861 100644
--- a/include/linux/netfs.h
+++ b/include/linux/netfs.h
@@ -57,6 +57,9 @@ typedef void (*netfs_io_terminated_t)(void *priv, ssize_t transferred_or_error);
*/
struct netfs_inode {
struct inode inode; /* The VFS inode */
+#ifdef CONFIG_FS_ENCRYPTION
+ struct fscrypt_inode_info *i_fscrypt_info;
+#endif
const struct netfs_request_ops *ops;
#if IS_ENABLED(CONFIG_FSCACHE)
struct fscache_cookie *cache;
@@ -503,6 +506,9 @@ static inline void netfs_inode_init(struct netfs_inode *ctx,
ctx->zero_point = ctx->remote_i_size;
mapping_set_release_always(ctx->inode.i_mapping);
}
+#ifdef CONFIG_FS_ENCRYPTION
+ ctx->i_fscrypt_info = NULL;
+#endif
}

/**

--
2.47.2