/*
* Copyright 2012 Xyratex Technology Limited
*
- * Copyright (c) 2013, 2016, Intel Corporation.
+ * Copyright (c) 2013, 2017, Intel Corporation.
*
* Author: Andrew Perepechko <Andrew_Perepechko@xyratex.com>
*
LASSERT(lli != NULL);
INIT_LIST_HEAD(&lli->lli_xattrs);
- ll_file_set_flag(lli, LLIF_XATTR_CACHE);
+ set_bit(LLIF_XATTR_CACHE, &lli->lli_flags);
}
/**
*/
static int ll_xattr_cache_valid(struct ll_inode_info *lli)
{
- return ll_file_test_flag(lli, LLIF_XATTR_CACHE);
+ return test_bit(LLIF_XATTR_CACHE, &lli->lli_flags);
}
/**
while (ll_xattr_cache_del(&lli->lli_xattrs, NULL) == 0)
/* empty loop */ ;
- ll_file_clear_flag(lli, LLIF_XATTR_CACHE);
+ clear_bit(LLIF_XATTR_CACHE, &lli->lli_flags);
RETURN(0);
}
if (unlikely(req == NULL)) {
CDEBUG(D_CACHE, "cancelled by a parallel getxattr\n");
ll_intent_drop_lock(&oit);
- GOTO(err_unlock, rc = -EIO);
+ GOTO(err_unlock, rc = -EAGAIN);
}
body = req_capsule_server_get(&req->rq_pill, &RMF_MDT_BODY);
RETURN(rc);
}
+/**
+ * Insert an xattr value into the cache.
+ *
+ * Add @name xattr with @buffer value and @size length for @inode.
+ * Init cache for @inode if necessary.
+ *
+ * \retval 0 success
+ * \retval < 0 from ll_xattr_cache_add(), except -EPROTO is ignored for
+ * LL_XATTR_NAME_ENCRYPTION_CONTEXT xattr
+ */
+int ll_xattr_cache_insert(struct inode *inode,
+ const char *name,
+ char *buffer,
+ size_t size)
+{
+ struct ll_inode_info *lli = ll_i2info(inode);
+ int rc;
+
+ ENTRY;
+
+ down_read(&lli->lli_xattrs_list_rwsem);
+ if (!ll_xattr_cache_valid(lli))
+ ll_xattr_cache_init(lli);
+ rc = ll_xattr_cache_add(&lli->lli_xattrs, name, buffer,
+ size);
+ up_read(&lli->lli_xattrs_list_rwsem);
+
+ if (rc == -EPROTO &&
+ strcmp(name, LL_XATTR_NAME_ENCRYPTION_CONTEXT) == 0)
+ /* it means enc ctx was already in cache,
+ * ignore error as it cannot be modified
+ */
+ rc = 0;
+ RETURN(rc);
+}