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>
This commit is contained in:
Pranith Kumar K 2017-07-06 16:39:37 +05:30 committed by Pranith Kumar Karampuri
parent 0d75e39834
commit 73b2b7fe57
2 changed files with 43 additions and 26 deletions

View File

@ -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;
}

View File

@ -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;
}