summaryrefslogtreecommitdiffstats
path: root/xlators/storage/posix/src/posix-inode-fd-ops.c
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/storage/posix/src/posix-inode-fd-ops.c')
-rw-r--r--xlators/storage/posix/src/posix-inode-fd-ops.c85
1 files changed, 43 insertions, 42 deletions
diff --git a/xlators/storage/posix/src/posix-inode-fd-ops.c b/xlators/storage/posix/src/posix-inode-fd-ops.c
index af13a622feb..0e7d3762ac8 100644
--- a/xlators/storage/posix/src/posix-inode-fd-ops.c
+++ b/xlators/storage/posix/src/posix-inode-fd-ops.c
@@ -2212,7 +2212,8 @@ posix_setxattr (call_frame_t *frame, xlator_t *this,
int32_t op_errno = 0;
char * real_path = NULL;
char *acl_xattr = NULL;
- struct iatt stbuf = {0};
+ struct iatt preop = {0};
+ struct iatt postop = {0};
int32_t ret = 0;
ssize_t acl_size = 0;
dict_t *xattr = NULL;
@@ -2245,7 +2246,7 @@ posix_setxattr (call_frame_t *frame, xlator_t *this,
goto out;
}
- posix_pstat(this, loc->inode, loc->gfid, real_path, &stbuf, _gf_false);
+ posix_pstat(this, loc->inode, loc->gfid, real_path, &preop, _gf_false);
op_ret = -1;
@@ -2259,7 +2260,7 @@ posix_setxattr (call_frame_t *frame, xlator_t *this,
/*TODO: move the following to a different function */
LOCK (&loc->inode->lock);
{
- state = posix_cs_check_status (this, real_path, NULL, &stbuf);
+ state = posix_cs_check_status (this, real_path, NULL, &preop);
if (state != GF_CS_LOCAL) {
op_errno = EINVAL;
ret = posix_cs_set_state (this, &xattr, state, real_path,
@@ -2350,7 +2351,7 @@ unlock:
filler.real_path = real_path;
filler.this = this;
- filler.stbuf = &stbuf;
+ filler.stbuf = &preop;
#ifdef GF_DARWIN_HOST_OS
filler.flags = map_xattr_flags(flags);
@@ -2374,14 +2375,12 @@ unlock:
* This is used by DHT to redirect FOPs if the file is being migrated
* Ignore errors for now
*/
- if (xdata && dict_get (xdata, DHT_IATT_IN_XDATA_KEY)) {
- ret = posix_pstat(this, loc->inode, loc->gfid, real_path,
- &stbuf, _gf_false);
- if (ret)
- goto out;
+ ret = posix_pstat(this, loc->inode, loc->gfid, real_path, &postop,
+ _gf_false);
+ if (ret)
+ goto out;
- ret = posix_set_iatt_in_dict (xattr, &stbuf);
- }
+ ret = posix_set_iatt_in_dict (xattr, &preop, &postop);
/*
* ACL can be set on a file/folder using GF_POSIX_ACL_*_KEY xattrs which
@@ -3720,7 +3719,8 @@ posix_fsetxattr (call_frame_t *frame, xlator_t *this,
struct posix_fd *pfd = NULL;
int _fd = -1;
int ret = -1;
- struct iatt stbuf = {0,};
+ struct iatt preop = {0,};
+ struct iatt postop = {0,};
dict_t *xattr = NULL;
posix_xattr_filler_t filler = {0,};
struct posix_private *priv = NULL;
@@ -3744,7 +3744,7 @@ posix_fsetxattr (call_frame_t *frame, xlator_t *this,
}
_fd = pfd->fd;
- ret = posix_fdstat (this, fd->inode, pfd->fd, &stbuf);
+ ret = posix_fdstat (this, fd->inode, pfd->fd, &preop);
if (ret == -1) {
op_errno = errno;
gf_msg (this->name, GF_LOG_ERROR, op_errno,
@@ -3759,7 +3759,7 @@ posix_fsetxattr (call_frame_t *frame, xlator_t *this,
filler.fdnum = _fd;
filler.this = this;
filler.frame = frame;
- filler.stbuf = &stbuf;
+ filler.stbuf = &preop;
filler.fd = fd;
#ifdef GF_DARWIN_HOST_OS
filler.flags = map_xattr_flags(flags);
@@ -3785,21 +3785,19 @@ posix_fsetxattr (call_frame_t *frame, xlator_t *this,
}
}
- if (xdata && dict_get (xdata, DHT_IATT_IN_XDATA_KEY)) {
- ret = posix_fdstat (this, fd->inode, pfd->fd, &stbuf);
- if (ret == -1) {
- op_errno = errno;
- gf_msg (this->name, GF_LOG_ERROR, op_errno,
- P_MSG_XATTR_FAILED, "fsetxattr (fstat)"
- "failed on fd=%p", fd);
- goto out;
- }
-
- xattr = dict_new ();
- if (!xattr)
- goto out;
- ret = posix_set_iatt_in_dict (xattr, &stbuf);
+ ret = posix_fdstat (this, fd->inode, pfd->fd, &postop);
+ if (ret == -1) {
+ op_errno = errno;
+ gf_msg (this->name, GF_LOG_ERROR, op_errno,
+ P_MSG_XATTR_FAILED, "fsetxattr (fstat)"
+ "failed on fd=%p", fd);
+ goto out;
}
+ xattr = dict_new ();
+ if (!xattr)
+ goto out;
+
+ ret = posix_set_iatt_in_dict (xattr, &preop, &postop);
out:
SET_TO_OLD_FS_ID ();
@@ -3877,7 +3875,8 @@ posix_common_removexattr (call_frame_t *frame, loc_t *loc, fd_t *fd,
char *real_path = NULL;
struct posix_fd *pfd = NULL;
int op_ret = 0;
- struct iatt stbuf = {0};
+ struct iatt preop = {0,};
+ struct iatt postop = {0,};
int ret = 0;
int _fd = -1;
xlator_t *this = frame->this;
@@ -3913,6 +3912,12 @@ posix_common_removexattr (call_frame_t *frame, loc_t *loc, fd_t *fd,
goto out;
}
+ if (loc)
+ ret = posix_pstat(this, inode, loc->gfid, real_path,
+ &preop, _gf_false);
+ else
+ ret = posix_fdstat (this, inode, _fd, &preop);
+
if (gf_get_index_by_elem (disallow_removexattrs, (char *)name) >= 0) {
gf_msg (this->name, GF_LOG_WARNING, 0, P_MSG_XATTR_NOT_REMOVED,
"Remove xattr called on %s for file/dir %s with gfid: "
@@ -3968,24 +3973,20 @@ posix_common_removexattr (call_frame_t *frame, loc_t *loc, fd_t *fd,
if (loc) {
posix_set_ctime (frame, this, real_path, -1, inode, NULL);
+ ret = posix_pstat(this, inode, loc->gfid, real_path, &postop,
+ _gf_false);
} else {
posix_set_ctime (frame, this, NULL, _fd, inode, NULL);
+ ret = posix_fdstat (this, inode, _fd, &postop);
}
+ if (ret)
+ goto out;
+ *xdata_rsp = dict_new();
+ if (!*xdata_rsp)
+ goto out;
- if (xdata && dict_get (xdata, DHT_IATT_IN_XDATA_KEY)) {
- if (loc)
- ret = posix_pstat(this, inode, loc->gfid,
- real_path, &stbuf, _gf_false);
- else
- ret = posix_fdstat (this, inode, _fd, &stbuf);
- if (ret)
- goto out;
- *xdata_rsp = dict_new();
- if (!*xdata_rsp)
- goto out;
+ ret = posix_set_iatt_in_dict (*xdata_rsp, &preop, &postop);
- ret = posix_set_iatt_in_dict (*xdata_rsp, &stbuf);
- }
op_ret = 0;
out:
SET_TO_OLD_FS_ID ();