|
|
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 |
|