From bc79d1bc90f9d094598985127f8386894d0b7355 Mon Sep 17 00:00:00 2001 From: Sebastien Buisson Date: Thu, 7 Oct 2021 16:04:34 +0200 Subject: [PATCH] LU-14989 sec: keep encryption context in xattr cache When an inode is being cleared, its xattr cache must be completely wiped. But in case of lock cancel, we want to keep the encryption context, as further processing might need to check it. Fixes: 1faf54e8bf ("LU-14989 sec: access to enc file's xattrs") Signed-off-by: Sebastien Buisson Change-Id: I8a2f4497129353a7fbf86cdaaa13fae6e0988790 --- lustre/llite/llite_internal.h | 1 + lustre/llite/namei.c | 2 +- lustre/llite/xattr_cache.c | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/lustre/llite/llite_internal.h b/lustre/llite/llite_internal.h index 1097608..60fa58b 100644 --- a/lustre/llite/llite_internal.h +++ b/lustre/llite/llite_internal.h @@ -421,6 +421,7 @@ enum ll_file_flags { }; int ll_xattr_cache_destroy(struct inode *inode); +int ll_xattr_cache_empty(struct inode *inode); int ll_xattr_cache_get(struct inode *inode, const char *name, diff --git a/lustre/llite/namei.c b/lustre/llite/namei.c index cdac373..2d5d38e 100644 --- a/lustre/llite/namei.c +++ b/lustre/llite/namei.c @@ -257,7 +257,7 @@ static void ll_lock_cancel_bits(struct ldlm_lock *lock, __u64 to_cancel) } if (bits & MDS_INODELOCK_XATTR) { - ll_xattr_cache_destroy(inode); + ll_xattr_cache_empty(inode); bits &= ~MDS_INODELOCK_XATTR; } diff --git a/lustre/llite/xattr_cache.c b/lustre/llite/xattr_cache.c index d572f73..c0ef7df 100644 --- a/lustre/llite/xattr_cache.c +++ b/lustre/llite/xattr_cache.c @@ -315,6 +315,42 @@ int ll_xattr_cache_destroy(struct inode *inode) } /** + * ll_xattr_cache_empty - empty xattr cache for @ino + * + * Similar to ll_xattr_cache_destroy(), but preserves encryption context. + * So only LLIF_XATTR_CACHE_FILLED flag is cleared, but not LLIF_XATTR_CACHE. + */ +int ll_xattr_cache_empty(struct inode *inode) +{ + struct ll_inode_info *lli = ll_i2info(inode); + struct ll_xattr_entry *entry, *n; + + ENTRY; + + down_write(&lli->lli_xattrs_list_rwsem); + if (!ll_xattr_cache_valid(lli) || + !ll_xattr_cache_filled(lli)) + GOTO(out_empty, 0); + + list_for_each_entry_safe(entry, n, &lli->lli_xattrs, xe_list) { + if (strcmp(entry->xe_name, + LL_XATTR_NAME_ENCRYPTION_CONTEXT) == 0) + continue; + + CDEBUG(D_CACHE, "delete: %s\n", entry->xe_name); + list_del(&entry->xe_list); + OBD_FREE(entry->xe_name, entry->xe_namelen); + OBD_FREE(entry->xe_value, entry->xe_vallen); + OBD_SLAB_FREE_PTR(entry, xattr_kmem); + } + clear_bit(LLIF_XATTR_CACHE_FILLED, &lli->lli_flags); + +out_empty: + up_write(&lli->lli_xattrs_list_rwsem); + RETURN(0); +} + +/** * Match or enqueue a PR lock. * * Find or request an LDLM lock with xattr data. -- 1.8.3.1