diff options
| author | Pranith Kumar K <pkarampu@redhat.com> | 2017-07-06 16:39:37 +0530 | 
|---|---|---|
| committer | Pranith Kumar Karampuri <pkarampu@redhat.com> | 2017-07-13 08:09:56 +0000 | 
| commit | 73b2b7fe57069eb85485465fb92c52a97d4d411c (patch) | |
| tree | f159f2f7d051f836a4cfd076072bb6602fcda03f | |
| parent | 0d75e39834d4880dce0cb3c79bef4b70bb32874d (diff) | |
storage/posix: Handle [f]xattrop xdata
Updates #251
Change-Id: I13d89c3b5dc39aa0a232a70be8ec6b64394cfa6e
Signed-off-by: Pranith Kumar K <pkarampu@redhat.com>
Reviewed-on: https://review.gluster.org/17740
Smoke: Gluster Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
Reviewed-by: Amar Tumballi <amarts@redhat.com>
Reviewed-by: Xavier Hernandez <xhernandez@datalab.es>
Reviewed-by: Krutika Dhananjay <kdhananj@redhat.com>
| -rw-r--r-- | xlators/storage/posix/src/posix-helpers.c | 23 | ||||
| -rw-r--r-- | xlators/storage/posix/src/posix.c | 46 | 
2 files changed, 43 insertions, 26 deletions
diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c index 85005e07b14..649107d8cac 100644 --- a/xlators/storage/posix/src/posix-helpers.c +++ b/xlators/storage/posix/src/posix-helpers.c @@ -680,6 +680,7 @@ posix_pstat (xlator_t *this, uuid_t gfid, const char *path,          struct stat  lstatbuf = {0, };          struct iatt  stbuf = {0, };          int          ret = 0; +        int          op_errno = 0;          struct posix_private *priv = NULL; @@ -691,22 +692,12 @@ posix_pstat (xlator_t *this, uuid_t gfid, const char *path,                  posix_fill_gfid_path (this, path, &stbuf);          ret = sys_lstat (path, &lstatbuf); - -        if (ret != 0) { -                if (ret == -1) { -                        if (errno != ENOENT) -                                gf_msg (this->name, GF_LOG_WARNING, errno, -                                        P_MSG_LSTAT_FAILED, -                                        "lstat failed on %s", -                                        path); -                } else { -                        // may be some backend filesytem issue -                        gf_msg (this->name, GF_LOG_ERROR, 0, P_MSG_LSTAT_FAILED, -                                "lstat failed on %s and return value is %d " -                                "instead of -1. Please see dmesg output to " -                                "check whether the failure is due to backend " -                                "filesystem issue", path, ret); -                        ret = -1; +        if (ret == -1) { +                if (errno != ENOENT) { +                        op_errno = errno; +                        gf_msg (this->name, GF_LOG_WARNING, errno, +                                P_MSG_LSTAT_FAILED, "lstat failed on %s", path); +                        errno = op_errno;/*gf_msg could have changed errno*/                  }                  goto out;          } diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c index 87da16694a5..2f1ffe98da2 100644 --- a/xlators/storage/posix/src/posix.c +++ b/xlators/storage/posix/src/posix.c @@ -5905,7 +5905,7 @@ out:  int  do_xattrop (call_frame_t *frame, xlator_t *this, loc_t *loc, fd_t *fd, -            gf_xattrop_flags_t optype, dict_t *xattr) +            gf_xattrop_flags_t optype, dict_t *xattr, dict_t *xdata)  {          int                   op_ret    = 0;          int                   op_errno  = 0; @@ -5914,7 +5914,9 @@ do_xattrop (call_frame_t *frame, xlator_t *this, loc_t *loc, fd_t *fd,          struct posix_fd      *pfd       = NULL;          inode_t              *inode     = NULL;          posix_xattr_filler_t  filler    = {0,}; -        dict_t               *xdata     = NULL; +        dict_t               *xattr_rsp = NULL; +        dict_t               *xdata_rsp = NULL; +        struct iatt           stbuf = {0};          VALIDATE_OR_GOTO (frame, out);          VALIDATE_OR_GOTO (xattr, out); @@ -5947,8 +5949,8 @@ do_xattrop (call_frame_t *frame, xlator_t *this, loc_t *loc, fd_t *fd,                  inode = fd->inode;          } -        xdata = dict_new (); -        if (xdata == NULL) { +        xattr_rsp = dict_new (); +        if (xattr_rsp == NULL) {                  op_ret = -1;                  op_errno = ENOMEM;                  goto out; @@ -5959,19 +5961,43 @@ do_xattrop (call_frame_t *frame, xlator_t *this, loc_t *loc, fd_t *fd,          filler.real_path = real_path;          filler.flags = (int)optype;          filler.inode = inode; -        filler.xattr = xdata; +        filler.xattr = xattr_rsp;          op_ret = dict_foreach (xattr, _posix_handle_xattr_keyvalue_pair,                                 &filler);          op_errno = filler.op_errno; +        if (op_ret < 0) +                goto out; + +        if (!xdata) +                goto out; +        if (fd) { +                op_ret = posix_fdstat (this, _fd, &stbuf); +        } else { +                op_ret = posix_pstat (this, inode->gfid, real_path, +                                      &stbuf); +        } +        if (op_ret < 0) { +                op_errno = errno; +                goto out; +        } +        xdata_rsp = posix_xattr_fill (this, real_path, loc, fd, _fd, +                                              xdata, &stbuf); +        if (!xdata_rsp) { +                op_ret = -1; +                op_errno = ENOMEM; +        }  out: -        STACK_UNWIND_STRICT (xattrop, frame, op_ret, op_errno, xdata, NULL); +        STACK_UNWIND_STRICT (xattrop, frame, op_ret, op_errno, xattr_rsp, +                             xdata_rsp); -        if (xdata) -                dict_unref (xdata); +        if (xattr_rsp) +                dict_unref (xattr_rsp); +        if (xdata_rsp) +                dict_unref (xdata_rsp);          return 0;  } @@ -5980,7 +6006,7 @@ int  posix_xattrop (call_frame_t *frame, xlator_t *this,                 loc_t *loc, gf_xattrop_flags_t optype, dict_t *xattr, dict_t *xdata)  { -        do_xattrop (frame, this, loc, NULL, optype, xattr); +        do_xattrop (frame, this, loc, NULL, optype, xattr, xdata);          return 0;  } @@ -5989,7 +6015,7 @@ int  posix_fxattrop (call_frame_t *frame, xlator_t *this,                  fd_t *fd, gf_xattrop_flags_t optype, dict_t *xattr, dict_t *xdata)  { -        do_xattrop (frame, this, NULL, fd, optype, xattr); +        do_xattrop (frame, this, NULL, fd, optype, xattr, xdata);          return 0;  }  | 
