summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xlators/storage/posix/src/posix-helpers.c30
-rw-r--r--xlators/storage/posix/src/posix.c5
-rw-r--r--xlators/storage/posix/src/posix.h2
3 files changed, 32 insertions, 5 deletions
diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c
index 04c166c54f7..f4334302f27 100644
--- a/xlators/storage/posix/src/posix-helpers.c
+++ b/xlators/storage/posix/src/posix-helpers.c
@@ -54,7 +54,7 @@
#include "timer.h"
#include "glusterfs3-xdr.h"
#include "hashfn.h"
-
+#include <fnmatch.h>
typedef struct {
xlator_t *this;
@@ -64,6 +64,10 @@ typedef struct {
loc_t *loc;
} posix_xattr_filler_t;
+char *marker_xattrs[] = {"trusted.glusterfs.quota.*",
+ "trusted.glusterfs.*.xtime",
+ NULL};
+
static char* posix_ignore_xattrs[] = {
"gfid-req",
GLUSTERFS_ENTRYLK_COUNT,
@@ -72,6 +76,25 @@ static char* posix_ignore_xattrs[] = {
NULL
};
+gf_boolean_t
+posix_special_xattr (char **pattern, char *key)
+{
+ int i = 0;
+ gf_boolean_t flag = _gf_false;
+
+ GF_VALIDATE_OR_GOTO ("posix", pattern, out);
+ GF_VALIDATE_OR_GOTO ("posix", key, out);
+
+ for (i = 0; pattern[i]; i++) {
+ if (!fnmatch (pattern[i], key, 0)) {
+ flag = _gf_true;
+ break;
+ }
+ }
+out:
+ return flag;
+}
+
static gf_boolean_t
posix_xattr_ignorable (char *key, posix_xattr_filler_t *filler)
{
@@ -638,7 +661,9 @@ posix_handle_pair (xlator_t *this, const char *real_path,
this->name,GF_LOG_WARNING,
"Extended attributes not "
"supported");
- } else if (errno == ENOENT) {
+ } else if (errno == ENOENT &&
+ !posix_special_xattr (marker_xattrs,
+ trav->key)) {
gf_log (this->name, GF_LOG_ERROR,
"setxattr on %s failed: %s", real_path,
strerror (errno));
@@ -1023,4 +1048,3 @@ posix_fd_ctx_get_off (fd_t *fd, xlator_t *this, struct posix_fd **pfd,
{
return posix_fd_ctx_get (fd, this, pfd);
}
-
diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c
index 2452ddc4d88..0987075e1f5 100644
--- a/xlators/storage/posix/src/posix.c
+++ b/xlators/storage/posix/src/posix.c
@@ -60,6 +60,7 @@
#include "glusterfs3-xdr.h"
#include "hashfn.h"
+extern char *marker_xattrs[];
#undef HAVE_SET_FSID
#ifdef HAVE_SET_FSID
@@ -3101,7 +3102,9 @@ do_xattrop (call_frame_t *frame, xlator_t *this, loc_t *loc, fd_t *fd,
this->name,GF_LOG_WARNING,
"Extended attributes not "
"supported by filesystem");
- } else {
+ } else if (op_errno != ENOENT ||
+ !posix_special_xattr (marker_xattrs,
+ trav->key)) {
if (loc)
gf_log (this->name, GF_LOG_ERROR,
"getxattr failed on %s while doing "
diff --git a/xlators/storage/posix/src/posix.h b/xlators/storage/posix/src/posix.h
index c551ffc1abd..7c2b47bb02b 100644
--- a/xlators/storage/posix/src/posix.h
+++ b/xlators/storage/posix/src/posix.h
@@ -54,7 +54,6 @@
#include "posix-mem-types.h"
#include "posix-handle.h"
-
/**
* posix_fd - internal structure common to file and directory fd's
*/
@@ -159,4 +158,5 @@ int posix_fd_ctx_get_off (fd_t *fd, xlator_t *this, struct posix_fd **pfd,
off_t off);
void posix_fill_ino_from_gfid (xlator_t *this, struct iatt *buf);
+gf_boolean_t posix_special_xattr (char **pattern, char *key);
#endif /* _POSIX_H */