Whamcloud - gitweb
LU-14989 sec: keep encryption context in xattr cache
[fs/lustre-release.git] / lustre / llite / xattr_cache.c
index d572f73..c0ef7df 100644 (file)
@@ -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.