summaryrefslogtreecommitdiffstats
path: root/libglusterfs
diff options
context:
space:
mode:
Diffstat (limited to 'libglusterfs')
-rw-r--r--libglusterfs/src/common-utils.c34
-rw-r--r--libglusterfs/src/common-utils.h3
-rw-r--r--libglusterfs/src/upcall-utils.h1
3 files changed, 38 insertions, 0 deletions
diff --git a/libglusterfs/src/common-utils.c b/libglusterfs/src/common-utils.c
index 45886dae3ee..a225c957f2e 100644
--- a/libglusterfs/src/common-utils.c
+++ b/libglusterfs/src/common-utils.c
@@ -36,6 +36,7 @@
#endif
#include <libgen.h>
+#include "glusterfs-acl.h"
#include "compat-errno.h"
#include "logging.h"
#include "common-utils.h"
@@ -4449,3 +4450,36 @@ gf_zero_fill_stat (struct iatt *buf)
buf->ia_nlink = 0;
buf->ia_ctime = 0;
}
+
+/* This function checks if the input key is a virtual or on disk xattr.
+ * Its not simple to identify a virtual xattr as there is no common
+ * format used to identify virtual xattrs. One way is to list each of the
+ * xattrs in different categories and compare the input against every xattr
+ * in the list, this is very inefficient as there are 100s of xattrs.
+ *
+ * Currently the only consumer of this function is upcall and md-cache,
+ * hence tailoring this function to their needs; in their case its allowed
+ * to consider disk xattrs as virtual xattrs, but not vice versa, i.e.
+ * virtual xattrs should not be considered as on disk xattr. Hence, being
+ * conservative, we consider anything that starts from user.*, security.*,
+ * system.* as on disk xattrs. trusted.* and glusterfs.* cannot be considered
+ * as virtual xattrs as there are some on disk xattrs which start from
+ * glusterfs.* and trusted.*
+ *
+ * Hence, this function could return an on disk xattr as virtual xattr but
+ * never a virtual xattr as on disk xattr.
+ */
+gf_boolean_t
+is_virtual_xattr (const char *k)
+{
+ gf_boolean_t ret = _gf_true;
+
+ if ((strncmp (k, "user.", strlen ("user.")) == 0) ||
+ (strncmp (k, "security.", strlen ("security.")) == 0) ||
+ (strncmp (k, "system.", strlen ("system.")) == 0) ||
+ (GF_POSIX_ACL_REQUEST (k))) {
+ ret = _gf_false;
+ }
+
+ return ret;
+}
diff --git a/libglusterfs/src/common-utils.h b/libglusterfs/src/common-utils.h
index 620468e8b09..09d585ad9c3 100644
--- a/libglusterfs/src/common-utils.h
+++ b/libglusterfs/src/common-utils.h
@@ -826,4 +826,7 @@ gf_is_zero_filled_stat (struct iatt *buf);
void
gf_zero_fill_stat (struct iatt *buf);
+gf_boolean_t
+is_virtual_xattr (const char *k);
+
#endif /* _COMMON_UTILS_H */
diff --git a/libglusterfs/src/upcall-utils.h b/libglusterfs/src/upcall-utils.h
index a4eaabf2032..33db4b273a1 100644
--- a/libglusterfs/src/upcall-utils.h
+++ b/libglusterfs/src/upcall-utils.h
@@ -74,6 +74,7 @@ struct gf_upcall_cache_invalidation {
struct iatt stat;
struct iatt p_stat; /* parent dir stat */
struct iatt oldp_stat; /* oldparent dir stat */
+ dict_t *dict; /* For xattrs */
};
struct gf_upcall_recall_lease {