diff mbox series

[RFC,v3,04/16] fscrypt: add fscrypt_context_for_new_inode

Message ID 20200914191707.380444-5-jlayton@kernel.org
State New
Headers show
Series ceph+fscrypt: context, filename and symlink support | expand

Commit Message

Jeff Layton Sept. 14, 2020, 7:16 p.m. UTC
CephFS will need to be able to generate a context for a new "prepared"
inode. Add a new routine for getting the context out of an in-core
inode.

Signed-off-by: Jeff Layton <jlayton@kernel.org>
---
 fs/crypto/policy.c      | 35 ++++++++++++++++++++++++++++-------
 include/linux/fscrypt.h |  1 +
 2 files changed, 29 insertions(+), 7 deletions(-)

Comments

Eric Biggers Sept. 15, 2020, 12:15 a.m. UTC | #1
On Mon, Sep 14, 2020 at 03:16:55PM -0400, Jeff Layton wrote:
>  	/*
>  	 * This may be the first time the inode number is available, so do any
> @@ -689,7 +711,6 @@ int fscrypt_set_context(struct inode *inode, void *fs_data)
>  
>  		fscrypt_hash_inode_number(ci, mk);
>  	}
> -
>  	return inode->i_sb->s_cop->set_context(inode, &ctx, ctxsize, fs_data);

Unnecessary whitespace change.

> diff --git a/include/linux/fscrypt.h b/include/linux/fscrypt.h
> index b547e1aabb00..a57d2a9869eb 100644
> --- a/include/linux/fscrypt.h
> +++ b/include/linux/fscrypt.h
> @@ -148,6 +148,7 @@ int fscrypt_ioctl_get_policy_ex(struct file *filp, void __user *arg);
>  int fscrypt_ioctl_get_nonce(struct file *filp, void __user *arg);
>  int fscrypt_has_permitted_context(struct inode *parent, struct inode *child);
>  int fscrypt_set_context(struct inode *inode, void *fs_data);
> +int fscrypt_context_for_new_inode(void *ctx, struct inode *inode);

Please keep declarations in the same order as the definitions.
So, fscrypt_context_for_new_inode() before fscrypt_set_context().

- Eric
diff mbox series

Patch

diff --git a/fs/crypto/policy.c b/fs/crypto/policy.c
index 97cf07543651..0888f950367b 100644
--- a/fs/crypto/policy.c
+++ b/fs/crypto/policy.c
@@ -655,6 +655,31 @@  const union fscrypt_policy *fscrypt_policy_to_inherit(struct inode *dir)
 	return fscrypt_get_dummy_policy(dir->i_sb);
 }
 
+/**
+ * fscrypt_context_for_new_inode() - create an encryption context for a new inode
+ * @ctx: where context should be written
+ * @inode: inode from which to fetch policy and nonce
+ *
+ * Given an in-core "prepared" (via fscrypt_prepare_new_inode) inode,
+ * generate a new context and write it to ctx. ctx _must_ be at least
+ * FSCRYPT_SET_CONTEXT_MAX_SIZE bytes.
+ *
+ * Returns size of the resulting context or a negative error code.
+ */
+int fscrypt_context_for_new_inode(void *ctx, struct inode *inode)
+{
+	struct fscrypt_info *ci = inode->i_crypt_info;
+
+	BUILD_BUG_ON(sizeof(union fscrypt_context) != FSCRYPT_SET_CONTEXT_MAX_SIZE);
+
+	/* fscrypt_prepare_new_inode() should have set up the key already. */
+	if (WARN_ON_ONCE(!ci))
+		return -ENOKEY;
+
+	return fscrypt_new_context(ctx, &ci->ci_policy, ci->ci_nonce);
+}
+EXPORT_SYMBOL_GPL(fscrypt_context_for_new_inode);
+
 /**
  * fscrypt_set_context() - Set the fscrypt context of a new inode
  * @inode: a new inode
@@ -671,12 +696,9 @@  int fscrypt_set_context(struct inode *inode, void *fs_data)
 	union fscrypt_context ctx;
 	int ctxsize;
 
-	/* fscrypt_prepare_new_inode() should have set up the key already. */
-	if (WARN_ON_ONCE(!ci))
-		return -ENOKEY;
-
-	BUILD_BUG_ON(sizeof(ctx) != FSCRYPT_SET_CONTEXT_MAX_SIZE);
-	ctxsize = fscrypt_new_context(&ctx, &ci->ci_policy, ci->ci_nonce);
+	ctxsize = fscrypt_context_for_new_inode(&ctx, inode);
+	if (ctxsize < 0)
+		return ctxsize;
 
 	/*
 	 * This may be the first time the inode number is available, so do any
@@ -689,7 +711,6 @@  int fscrypt_set_context(struct inode *inode, void *fs_data)
 
 		fscrypt_hash_inode_number(ci, mk);
 	}
-
 	return inode->i_sb->s_cop->set_context(inode, &ctx, ctxsize, fs_data);
 }
 EXPORT_SYMBOL_GPL(fscrypt_set_context);
diff --git a/include/linux/fscrypt.h b/include/linux/fscrypt.h
index b547e1aabb00..a57d2a9869eb 100644
--- a/include/linux/fscrypt.h
+++ b/include/linux/fscrypt.h
@@ -148,6 +148,7 @@  int fscrypt_ioctl_get_policy_ex(struct file *filp, void __user *arg);
 int fscrypt_ioctl_get_nonce(struct file *filp, void __user *arg);
 int fscrypt_has_permitted_context(struct inode *parent, struct inode *child);
 int fscrypt_set_context(struct inode *inode, void *fs_data);
+int fscrypt_context_for_new_inode(void *ctx, struct inode *inode);
 
 struct fscrypt_dummy_policy {
 	const union fscrypt_policy *policy;