From 14b37c763c5751faf18d00287c16bdcbe0f8d542 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 Reviewed-on: https://review.whamcloud.com/45148 Reviewed-by: Andreas Dilger Reviewed-by: Patrick Farrell Tested-by: jenkins Tested-by: Maloo Reviewed-by: Oleg Drokin --- 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 4bbe0c6..a1fd893 100644 --- a/lustre/llite/llite_internal.h +++ b/lustre/llite/llite_internal.h @@ -422,6 +422,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 e5540d3d..e3519f8 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