diff options
Diffstat (limited to 'xlators/storage/posix/src/posix-helpers.c')
| -rw-r--r-- | xlators/storage/posix/src/posix-helpers.c | 30 | 
1 files changed, 27 insertions, 3 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);  } -  | 
