d1681e
From 0499970747a7897bd9190484b5ab6868b19f393f Mon Sep 17 00:00:00 2001
d1681e
From: Poornima G <pgurusid@redhat.com>
d1681e
Date: Thu, 4 Jan 2018 19:38:05 +0530
d1681e
Subject: [PATCH 132/139] posix: In getxattr, honor the wildcard '*'
d1681e
d1681e
Currently, the posix_xattr_fill performas a sys_getxattr
d1681e
on all the keys requested, there are requirements where
d1681e
the keys could contain a wildcard, in which case sys_getxattr
d1681e
would return ENODATA, eg: if the xattr requested is user.*
d1681e
all the xattrs with prefix user. should be returned, with their
d1681e
values.
d1681e
d1681e
This patch, changes posix_xattr_fill, to honor wildcard in the keys
d1681e
requested.
d1681e
d1681e
Updates #297
d1681e
d1681e
> Signed-off-by: Poornima G <pgurusid@redhat.com>
d1681e
> Change-Id: I3d52da2957ac386fca3c156e26ff4cdf0b2c79a9
d1681e
> Reviewed-on: https://review.gluster.org/19170
d1681e
> Smoke: Gluster Build System <jenkins@build.gluster.org>
d1681e
> Reviewed-by: Amar Tumballi
d1681e
> Tested-by: Poornima G <pgurusid@redhat.com>
d1681e
> CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
d1681e
> (cherry picked from commit 8fc9c6a8fc7c73b2b4c65a8ddbe988bca10e89b6)
d1681e
d1681e
BUG: 1446125
d1681e
Change-Id: I3d52da2957ac386fca3c156e26ff4cdf0b2c79a9
d1681e
Signed-off-by: Poornima G <pgurusid@redhat.com>
d1681e
Reviewed-on: https://code.engineering.redhat.com/gerrit/128480
d1681e
Tested-by: RHGS Build Bot <nigelb@redhat.com>
d1681e
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
d1681e
---
d1681e
 xlators/storage/posix/src/posix-helpers.c | 64 ++++++++++++++++++++-----------
d1681e
 xlators/storage/posix/src/posix.h         |  2 +
d1681e
 2 files changed, 43 insertions(+), 23 deletions(-)
d1681e
d1681e
diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c
d1681e
index 77affc4..f8d8fed 100644
d1681e
--- a/xlators/storage/posix/src/posix-helpers.c
d1681e
+++ b/xlators/storage/posix/src/posix-helpers.c
d1681e
@@ -387,7 +387,9 @@ _posix_xattr_get_set (dict_t *xattr_req, char *key, data_t *data,
d1681e
         int       _fd      = -1;
d1681e
         loc_t    *loc      = NULL;
d1681e
         ssize_t  req_size  = 0;
d1681e
-
d1681e
+        int32_t  list_offset = 0;
d1681e
+        ssize_t  remaining_size = 0;
d1681e
+        char     *xattr    = NULL;
d1681e
 
d1681e
         if (posix_xattr_ignorable (key))
d1681e
                 goto out;
d1681e
@@ -507,13 +509,20 @@ _posix_xattr_get_set (dict_t *xattr_req, char *key, data_t *data,
d1681e
                                                filler->stbuf->ia_size);
d1681e
                 }
d1681e
         } else {
d1681e
-                ret = _posix_xattr_get_set_from_backend (filler, key);
d1681e
+                remaining_size = filler->list_size;
d1681e
+                while (remaining_size > 0) {
d1681e
+                        xattr = filler->list + list_offset;
d1681e
+                        if (fnmatch (key, xattr, 0) == 0)
d1681e
+                                ret = _posix_xattr_get_set_from_backend (filler,
d1681e
+                                                                         xattr);
d1681e
+                        remaining_size -= strlen (xattr) + 1;
d1681e
+                        list_offset += strlen (xattr) + 1;
d1681e
+                }
d1681e
         }
d1681e
 out:
d1681e
         return 0;
d1681e
 }
d1681e
 
d1681e
-
d1681e
 int
d1681e
 posix_fill_gfid_path (xlator_t *this, const char *path, struct iatt *iatt)
d1681e
 {
d1681e
@@ -712,42 +721,50 @@ out:
d1681e
         return ret;
d1681e
 }
d1681e
 
d1681e
+
d1681e
 static void
d1681e
-_handle_list_xattr (dict_t *xattr_req, const char *real_path, int fdnum,
d1681e
-                    posix_xattr_filler_t *filler)
d1681e
+_get_list_xattr (posix_xattr_filler_t *filler)
d1681e
 {
d1681e
         ssize_t               size                  = 0;
d1681e
-        char                 *list                  = NULL;
d1681e
-        int32_t               list_offset           = 0;
d1681e
-        ssize_t               remaining_size        = 0;
d1681e
-        char                  *key                  = NULL;
d1681e
 
d1681e
-        if ((!real_path) && (fdnum < 0))
d1681e
+        if ((!filler) && (!filler->real_path) && (filler->fdnum < 0))
d1681e
                 goto out;
d1681e
 
d1681e
-        if (real_path)
d1681e
-                size = sys_llistxattr (real_path, NULL, 0);
d1681e
+        if (filler->real_path)
d1681e
+                size = sys_llistxattr (filler->real_path, NULL, 0);
d1681e
         else
d1681e
-                size = sys_flistxattr (fdnum, NULL, 0);
d1681e
+                size = sys_flistxattr (filler->fdnum, NULL, 0);
d1681e
 
d1681e
         if (size <= 0)
d1681e
                 goto out;
d1681e
 
d1681e
-        list = alloca (size);
d1681e
-        if (!list)
d1681e
+        filler->list = GF_CALLOC (1, size, gf_posix_mt_char);
d1681e
+        if (!filler->list)
d1681e
                 goto out;
d1681e
 
d1681e
-        if (real_path)
d1681e
-                remaining_size = sys_llistxattr (real_path, list, size);
d1681e
+        if (filler->real_path)
d1681e
+                size = sys_llistxattr (filler->real_path, filler->list, size);
d1681e
         else
d1681e
-                remaining_size = sys_flistxattr (fdnum, list, size);
d1681e
+                size = sys_flistxattr (filler->fdnum, filler->list, size);
d1681e
 
d1681e
-        if (remaining_size <= 0)
d1681e
-                goto out;
d1681e
+        filler->list_size = size;
d1681e
+out:
d1681e
+        return;
d1681e
+}
d1681e
+
d1681e
+
d1681e
+static void
d1681e
+_handle_list_xattr (dict_t *xattr_req, const char *real_path, int fdnum,
d1681e
+                    posix_xattr_filler_t *filler)
d1681e
+{
d1681e
+        int32_t               list_offset           = 0;
d1681e
+        ssize_t               remaining_size        = 0;
d1681e
+        char                  *key                  = NULL;
d1681e
 
d1681e
         list_offset = 0;
d1681e
+        remaining_size = filler->list_size;
d1681e
         while (remaining_size > 0) {
d1681e
-                key = list + list_offset;
d1681e
+                key = filler->list + list_offset;
d1681e
 
d1681e
                 if (gf_get_index_by_elem (list_xattr_ignore_xattrs, key) >= 0)
d1681e
                         goto next;
d1681e
@@ -770,7 +787,6 @@ next:
d1681e
                 list_offset += strlen (key) + 1;
d1681e
 
d1681e
         } /* while (remaining_size > 0) */
d1681e
-out:
d1681e
         return;
d1681e
 }
d1681e
 
d1681e
@@ -798,12 +814,14 @@ posix_xattr_fill (xlator_t *this, const char *real_path, loc_t *loc, fd_t *fd,
d1681e
         filler.stbuf     = buf;
d1681e
         filler.loc       = loc;
d1681e
         filler.fd        = fd;
d1681e
-        filler.fdnum    = fdnum;
d1681e
+        filler.fdnum     = fdnum;
d1681e
 
d1681e
+        _get_list_xattr (&filler);
d1681e
         dict_foreach (xattr_req, _posix_xattr_get_set, &filler);
d1681e
         if (list)
d1681e
                 _handle_list_xattr (xattr_req, real_path, fdnum, &filler);
d1681e
 
d1681e
+        GF_FREE (filler.list);
d1681e
 out:
d1681e
         return xattr;
d1681e
 }
d1681e
diff --git a/xlators/storage/posix/src/posix.h b/xlators/storage/posix/src/posix.h
d1681e
index 777adac..ae9fb08 100644
d1681e
--- a/xlators/storage/posix/src/posix.h
d1681e
+++ b/xlators/storage/posix/src/posix.h
d1681e
@@ -240,6 +240,8 @@ typedef struct {
d1681e
         int          fdnum;
d1681e
         int          flags;
d1681e
         int32_t     op_errno;
d1681e
+        char        *list;
d1681e
+        size_t       list_size;
d1681e
 } posix_xattr_filler_t;
d1681e
 
d1681e
 typedef struct {
d1681e
-- 
d1681e
1.8.3.1
d1681e