@@ -18,6 +18,7 @@
#include "super.h"
#include "mds_client.h"
#include "cache.h"
+#include "crypto.h"
#include <linux/ceph/decode.h>
/*
@@ -908,6 +909,10 @@ int ceph_fill_inode(struct inode *inode, struct page *locked_page,
ceph_forget_all_cached_acls(inode);
ceph_security_invalidate_secctx(inode);
xattr_blob = NULL;
+ if ((inode->i_state & I_NEW) &&
+ (DUMMY_ENCRYPTION_ENABLED(mdsc->fsc) ||
+ ceph_inode_has_xattr(ci, CEPH_XATTR_NAME_ENCRYPTION_CONTEXT)))
+ inode_set_flags(inode, S_ENCRYPTED, S_ENCRYPTED);
}
/* finally update i_version */
@@ -983,6 +983,7 @@ extern ssize_t ceph_listxattr(struct dentry *, char *, size_t);
extern struct ceph_buffer *__ceph_build_xattrs_blob(struct ceph_inode_info *ci);
extern void __ceph_destroy_xattrs(struct ceph_inode_info *ci);
extern const struct xattr_handler *ceph_xattr_handlers[];
+bool ceph_inode_has_xattr(struct ceph_inode_info *ci, char *name);
struct ceph_acl_sec_ctx {
#ifdef CONFIG_CEPH_FS_POSIX_ACL
@@ -1283,6 +1283,38 @@ void ceph_release_acl_sec_ctx(struct ceph_acl_sec_ctx *as_ctx)
ceph_pagelist_release(as_ctx->pagelist);
}
+/* Return true if inode's xattr blob has an xattr named "name" */
+bool ceph_inode_has_xattr(struct ceph_inode_info *ci, char *name)
+{
+ void *p, *end;
+ u32 numattr;
+ size_t namelen;
+
+ lockdep_assert_held(&ci->i_ceph_lock);
+
+ if (!ci->i_xattrs.blob || ci->i_xattrs.blob->vec.iov_len <= 4)
+ return false;
+
+ namelen = strlen(name);
+ p = ci->i_xattrs.blob->vec.iov_base;
+ end = p + ci->i_xattrs.blob->vec.iov_len;
+ ceph_decode_32_safe(&p, end, numattr, bad);
+
+ while (numattr--) {
+ u32 len;
+
+ ceph_decode_32_safe(&p, end, len, bad);
+ ceph_decode_need(&p, end, len, bad);
+ if (len == namelen && !memcmp(p, name, len))
+ return true;
+ p += len;
+ ceph_decode_32_safe(&p, end, len, bad);
+ ceph_decode_skip_n(&p, end, len, bad);
+ }
+bad:
+ return false;
+}
+
/*
* List of handlers for synthetic system.* attributes. Other
* attributes are handled directly.
This hack fixes a chicken-and-egg problem when fetching inodes from the server. Once we move to a dedicated field in the inode, then this should be able to go away. Signed-off-by: Jeff Layton <jlayton@kernel.org> --- fs/ceph/inode.c | 5 +++++ fs/ceph/super.h | 1 + fs/ceph/xattr.c | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+)