summaryrefslogtreecommitdiffstats
path: root/xlators/storage/posix/src/posix-inode-fd-ops.c
diff options
context:
space:
mode:
authorKotresh HR <khiremat@redhat.com>2018-04-02 08:31:25 -0400
committerAmar Tumballi <amarts@redhat.com>2018-05-06 07:09:08 +0530
commitf8fe0771f0b450713595a7d298ed5a758cf2ce3e (patch)
tree8066610f5d3343c5f71b52c9159a701e7450c7a3 /xlators/storage/posix/src/posix-inode-fd-ops.c
parent9a854a98af69c1b7e06aa01dff7ea3271ebd574c (diff)
posix/ctime: posix hook to set ctime xattr in relevant fops
This patch uses the ctime posix APIs to set consistent time across replica on disk. It also stores the time attributes in the inode context. Credits: Rafi KC <rkavunga@redhat.com> Updates: #208 Change-Id: I1a8d74d1e251f1d6d142f066fc99258025c0bcdd Signed-off-by: Kotresh HR <khiremat@redhat.com>
Diffstat (limited to 'xlators/storage/posix/src/posix-inode-fd-ops.c')
-rw-r--r--xlators/storage/posix/src/posix-inode-fd-ops.c55
1 files changed, 52 insertions, 3 deletions
diff --git a/xlators/storage/posix/src/posix-inode-fd-ops.c b/xlators/storage/posix/src/posix-inode-fd-ops.c
index c6145e880f4..2e5b7c5772a 100644
--- a/xlators/storage/posix/src/posix-inode-fd-ops.c
+++ b/xlators/storage/posix/src/posix-inode-fd-ops.c
@@ -57,6 +57,7 @@
#include "posix-aio.h"
#include "glusterfs-acl.h"
#include "posix-messages.h"
+#include "posix-metadata.h"
#include "events.h"
#include "posix-gfid-path.h"
#include "compat-uuid.h"
@@ -355,6 +356,8 @@ posix_setattr (call_frame_t *frame, xlator_t *this,
"failed", real_path);
goto out;
}
+ posix_update_utime_in_mdata (this, real_path, -1, loc->inode,
+ stbuf, valid);
}
if (valid & GF_SET_ATTR_CTIME) {
@@ -395,6 +398,8 @@ posix_setattr (call_frame_t *frame, xlator_t *this,
goto out;
}
+ posix_set_ctime (frame, this, real_path, -1, loc->inode, &statpost);
+
if (xdata)
xattr_rsp = posix_xattr_fill (this, real_path, loc, NULL, -1,
xdata, &statpost);
@@ -560,6 +565,8 @@ posix_fsetattr (call_frame_t *frame, xlator_t *this,
"failed fd=%p", fd);
goto out;
}
+ posix_update_utime_in_mdata (this, NULL, pfd->fd, fd->inode,
+ stbuf, valid);
}
if (!valid) {
@@ -583,6 +590,8 @@ posix_fsetattr (call_frame_t *frame, xlator_t *this,
goto out;
}
+ posix_set_ctime (frame, this, NULL, pfd->fd, fd->inode, &statpost);
+
if (xdata)
xattr_rsp = posix_xattr_fill (this, NULL, NULL, fd, pfd->fd,
xdata, &statpost);
@@ -686,6 +695,8 @@ posix_do_fallocate (call_frame_t *frame, xlator_t *this, fd_t *fd,
goto out;
}
+ posix_set_ctime (frame, this, NULL, pfd->fd, fd->inode, statpost);
+
out:
if (locked) {
pthread_mutex_unlock (&ctx->write_atomic_lock);
@@ -887,6 +898,8 @@ fsync:
goto out;
}
+ posix_set_ctime (frame, this, NULL, pfd->fd, fd->inode, statpost);
+
out:
if (locked) {
pthread_mutex_unlock (&ctx->write_atomic_lock);
@@ -1139,6 +1152,8 @@ posix_opendir (call_frame_t *frame, xlator_t *this,
P_MSG_FD_PATH_SETTING_FAILED, "failed to set the fd"
"context path=%s fd=%p", real_path, fd);
+ posix_set_ctime (frame, this, NULL, pfd->fd, fd->inode, NULL);
+
op_ret = 0;
out:
@@ -1236,6 +1251,8 @@ posix_readlink (call_frame_t *frame, xlator_t *this,
goto out;
}
+ posix_set_ctime (frame, this, real_path, -1, loc->inode, &stbuf);
+
dest[op_ret] = 0;
out:
SET_TO_OLD_FS_ID ();
@@ -1306,6 +1323,8 @@ posix_truncate (call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset,
goto out;
}
+ posix_set_ctime (frame, this, real_path, -1, loc->inode, &postbuf);
+
op_ret = 0;
out:
SET_TO_OLD_FS_ID ();
@@ -1370,6 +1389,8 @@ posix_open (call_frame_t *frame, xlator_t *this,
goto out;
}
+ posix_set_ctime (frame, this, real_path, -1, loc->inode, &stbuf);
+
pfd = GF_CALLOC (1, sizeof (*pfd), gf_posix_mt_posix_fd);
if (!pfd) {
op_errno = errno;
@@ -1511,6 +1532,8 @@ posix_readv (call_frame_t *frame, xlator_t *this,
goto out;
}
+ posix_set_ctime (frame, this, NULL, pfd->fd, fd->inode, &stbuf);
+
/* Hack to notify higher layers of EOF. */
if (!stbuf.ia_size || (offset + vec.iov_len) >= stbuf.ia_size)
op_errno = ENOENT;
@@ -1808,6 +1831,8 @@ posix_writev (call_frame_t *frame, xlator_t *this, fd_t *fd,
goto out;
}
+ posix_set_ctime (frame, this, NULL, pfd->fd, fd->inode, &postop);
+
if (locked) {
pthread_mutex_unlock (&ctx->write_atomic_lock);
locked = _gf_false;
@@ -2893,6 +2918,13 @@ posix_getxattr (call_frame_t *frame, xlator_t *this,
goto out;
}
+ ret = posix_handle_mdata_xattr (frame, name, &op_errno);
+ if (ret == -1) {
+ op_ret = -1;
+ /* errno should be set from the above function*/
+ goto out;
+ }
+
if (name && posix_is_gfid2path_xattr (name)) {
op_ret = -1;
op_errno = ENOATTR;
@@ -3280,6 +3312,11 @@ posix_getxattr (call_frame_t *frame, xlator_t *this,
if (ret == -1)
goto ignore;
+ ret = posix_handle_mdata_xattr (frame, keybuffer, &op_errno);
+ if (ret == -1) {
+ goto ignore;
+ }
+
if (posix_is_gfid2path_xattr (keybuffer)) {
goto ignore;
}
@@ -3663,14 +3700,15 @@ out:
static int
_handle_fsetxattr_keyvalue_pair (dict_t *d, char *k, data_t *v,
- void *tmp)
+ void *tmp)
{
posix_xattr_filler_t *filler = NULL;
filler = tmp;
- return posix_fhandle_pair (filler->this, filler->fdnum, k, v,
- filler->flags, filler->stbuf);
+ return posix_fhandle_pair (filler->frame, filler->this, filler->fdnum,
+ k, v, filler->flags, filler->stbuf,
+ filler->fd);
}
int32_t
@@ -3720,7 +3758,9 @@ posix_fsetxattr (call_frame_t *frame, xlator_t *this,
filler.fdnum = _fd;
filler.this = this;
+ filler.frame = frame;
filler.stbuf = &stbuf;
+ filler.fd = fd;
#ifdef GF_DARWIN_HOST_OS
filler.flags = map_xattr_flags(flags);
#else
@@ -3926,6 +3966,12 @@ 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);
+ } else {
+ posix_set_ctime (frame, this, NULL, _fd, inode, NULL);
+ }
+
if (xdata && dict_get (xdata, DHT_IATT_IN_XDATA_KEY)) {
if (loc)
ret = posix_pstat(this, inode, loc->gfid,
@@ -5287,6 +5333,9 @@ posix_rchecksum (call_frame_t *frame, xlator_t *this,
(unsigned char *)checksum);
}
op_ret = 0;
+
+ posix_set_ctime (frame, this, NULL, _fd, fd->inode, NULL);
+
out:
STACK_UNWIND_STRICT (rchecksum, frame, op_ret, op_errno,
weak_checksum, checksum, rsp_xdata);