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:
parent
0d75e39834
commit
73b2b7fe57
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user