Whamcloud - gitweb
LU-13543 lustre: update *pos in seq_file .next functions
[fs/lustre-release.git] / lustre / llite / xattr_cache.c
index cd9e2a5..3489f0b 100644 (file)
@@ -24,7 +24,7 @@
 /*
  * Copyright 2012 Xyratex Technology Limited
  *
- * Copyright (c) 2013, 2015, Intel Corporation.
+ * Copyright (c) 2013, 2017, Intel Corporation.
  *
  * Author: Andrew Perepechko <Andrew_Perepechko@xyratex.com>
  *
@@ -37,7 +37,6 @@
 #include <linux/mm.h>
 #include <obd_support.h>
 #include <lustre_dlm.h>
-#include <lustre_ver.h>
 #include "llite_internal.h"
 
 /* If we ever have hundreds of extended attributes, we might want to consider
@@ -402,7 +401,7 @@ static int ll_xattr_cache_refill(struct inode *inode)
        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);
@@ -483,7 +482,7 @@ err_req:
                rc = -EAGAIN;
 
        ptlrpc_req_finished(req);
-       return rc;
+       RETURN(rc);
 }
 
 /**
@@ -548,6 +547,41 @@ int ll_xattr_cache_get(struct inode *inode,
 out:
        up_read(&lli->lli_xattrs_list_rwsem);
 
-       return rc;
+       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);
+}