diff options
-rw-r--r-- | libglusterfs/src/stack.h | 8 | ||||
-rw-r--r-- | xlators/storage/posix/src/posix-entry-ops.c | 40 | ||||
-rw-r--r-- | xlators/storage/posix/src/posix-helpers.c | 44 | ||||
-rw-r--r-- | xlators/storage/posix/src/posix-inode-fd-ops.c | 55 | ||||
-rw-r--r-- | xlators/storage/posix/src/posix-messages.h | 3 | ||||
-rw-r--r-- | xlators/storage/posix/src/posix-metadata.c | 142 | ||||
-rw-r--r-- | xlators/storage/posix/src/posix-metadata.h | 13 | ||||
-rw-r--r-- | xlators/storage/posix/src/posix.h | 8 |
8 files changed, 279 insertions, 34 deletions
diff --git a/libglusterfs/src/stack.h b/libglusterfs/src/stack.h index 87fbef9e3c9..18cbf39621a 100644 --- a/libglusterfs/src/stack.h +++ b/libglusterfs/src/stack.h @@ -134,6 +134,14 @@ struct _call_stack { }; +/* call_stack flags field users */ +#define MDATA_CTIME (1<<0) +#define MDATA_MTIME (1<<1) +#define MDATA_ATIME (1<<2) +#define MDATA_PAR_CTIME (1<<3) +#define MDATA_PAR_MTIME (1<<4) +#define MDATA_PAR_ATIME (1<<5) + #define frame_set_uid_gid(frm, u, g) \ do { \ if (frm) { \ diff --git a/xlators/storage/posix/src/posix-entry-ops.c b/xlators/storage/posix/src/posix-entry-ops.c index d42a7f76e10..377fece5610 100644 --- a/xlators/storage/posix/src/posix-entry-ops.c +++ b/xlators/storage/posix/src/posix-entry-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" @@ -492,6 +493,8 @@ ignore: goto out; } + posix_set_ctime (frame, this, real_path, -1, loc->inode, &stbuf); + op_ret = posix_pstat (this, loc->parent, loc->pargfid, par_path, &postparent, _gf_false); if (op_ret == -1) { @@ -502,6 +505,9 @@ ignore: goto out; } + posix_set_parent_ctime (frame, this, par_path, -1, loc->parent, + &postparent); + op_ret = 0; out: @@ -808,6 +814,8 @@ posix_mkdir (call_frame_t *frame, xlator_t *this, goto out; } + posix_set_ctime (frame, this, real_path, -1, loc->inode, &stbuf); + op_ret = posix_pstat (this, loc->parent, loc->pargfid, par_path, &postparent, _gf_false); if (op_ret == -1) { @@ -818,6 +826,9 @@ posix_mkdir (call_frame_t *frame, xlator_t *this, goto out; } + posix_set_parent_ctime (frame, this, par_path, -1, loc->parent, + &postparent); + op_ret = 0; out: @@ -1222,6 +1233,9 @@ posix_unlink (call_frame_t *frame, xlator_t *this, goto out; } + posix_set_parent_ctime (frame, this, par_path, -1, loc->parent, + &postparent); + unwind_dict = posix_dict_set_nlink (xdata, unwind_dict, stbuf.ia_nlink); op_ret = 0; out: @@ -1355,6 +1369,9 @@ posix_rmdir (call_frame_t *frame, xlator_t *this, goto out; } + posix_set_parent_ctime (frame, this, par_path, -1, loc->parent, + &postparent); + out: SET_TO_OLD_FS_ID (); @@ -1432,6 +1449,8 @@ posix_symlink (call_frame_t *frame, xlator_t *this, entry_created = _gf_true; + posix_set_ctime (frame, this, real_path, -1, loc->inode, &stbuf); + #ifndef HAVE_SET_FSID op_ret = sys_lchown (real_path, frame->root->uid, gid); if (op_ret == -1) { @@ -1493,6 +1512,9 @@ ignore: goto out; } + posix_set_parent_ctime (frame, this, par_path, -1, loc->parent, + &postparent); + op_ret = 0; out: @@ -1778,6 +1800,8 @@ unlock: goto out; } + posix_set_ctime (frame, this, real_newpath, -1, newloc->inode, &stbuf); + op_ret = posix_pstat (this, oldloc->parent, oldloc->pargfid, par_oldpath, &postoldparent, _gf_false); if (op_ret == -1) { @@ -1788,6 +1812,9 @@ unlock: goto out; } + posix_set_parent_ctime (frame, this, par_oldpath, -1, oldloc->parent, + &postoldparent); + op_ret = posix_pstat (this, newloc->parent, newloc->pargfid, par_newpath, &postnewparent, _gf_false); if (op_ret == -1) { @@ -1798,6 +1825,9 @@ unlock: goto out; } + posix_set_parent_ctime (frame, this, par_newpath, -1, newloc->parent, + &postnewparent); + if (was_present) unwind_dict = posix_dict_set_nlink (xdata, unwind_dict, nlink); op_ret = 0; @@ -1899,6 +1929,8 @@ posix_link (call_frame_t *frame, xlator_t *this, goto out; } + posix_set_ctime (frame, this, real_newpath, -1, newloc->inode, &stbuf); + op_ret = posix_pstat (this, newloc->parent, newloc->pargfid, par_newpath, &postparent, _gf_false); if (op_ret == -1) { @@ -1908,6 +1940,9 @@ posix_link (call_frame_t *frame, xlator_t *this, goto out; } + posix_set_parent_ctime (frame, this, par_newpath, -1, newloc->parent, + &postparent); + if (priv->update_pgfid_nlinks) { MAKE_PGFID_XATTR_KEY (pgfid_xattr_key, PGFID_XATTR_KEY_PREFIX, newloc->pargfid); @@ -2120,6 +2155,8 @@ fill_stat: goto out; } + posix_set_ctime (frame, this, real_path, -1, loc->inode, &stbuf); + op_ret = posix_pstat (this, loc->parent, loc->pargfid, par_path, &postparent, _gf_false); if (op_ret == -1) { @@ -2130,6 +2167,9 @@ fill_stat: goto out; } + posix_set_parent_ctime (frame, this, par_path, -1, loc->parent, + &postparent); + op_ret = -1; pfd = GF_CALLOC (1, sizeof (*pfd), gf_posix_mt_posix_fd); if (!pfd) { diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c index 6a34e38cbbc..75fb045590b 100644 --- a/xlators/storage/posix/src/posix-helpers.c +++ b/xlators/storage/posix/src/posix-helpers.c @@ -104,6 +104,44 @@ out: } int +posix_handle_mdata_xattr (call_frame_t *frame, const char *name, int *op_errno) +{ + int i = 0; + int ret = 0; + int pid = 1; + static const char * const internal_xattr[] = { GF_XATTR_MDATA_KEY, + NULL + }; + if (frame && frame->root) { + pid = frame->root->pid; + } + + if (!name || pid < GF_CLIENT_PID_MAX) { + /* No need to do anything here */ + ret = 0; + goto out; + } + + for (i = 0; internal_xattr[i]; i++) { + if (fnmatch (internal_xattr[i] , name, FNM_PERIOD) == 0) { + ret = -1; + if (op_errno) { + *op_errno = ENOATTR; + } + + gf_msg_debug ("posix", ENOATTR, + "Ignoring the key %s as an internal " + "xattrs.", name); + goto out; + } + } + + ret = 0; +out: + return ret; +} + +int posix_handle_georep_xattrs (call_frame_t *frame, const char *name, int *op_errno, gf_boolean_t is_getxattr) { @@ -1297,8 +1335,8 @@ out: } int -posix_fhandle_pair (xlator_t *this, int fd, - char *key, data_t *value, int flags, struct iatt *stbuf) +posix_fhandle_pair (call_frame_t *frame, xlator_t *this, int fd, char *key, + data_t *value, int flags, struct iatt *stbuf, fd_t *_fd) { int sys_ret = -1; int ret = 0; @@ -1344,6 +1382,8 @@ posix_fhandle_pair (xlator_t *this, int fd, } goto out; + } else if (_fd) { + posix_set_ctime (frame, this, NULL, fd, _fd->inode, NULL); } out: 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); diff --git a/xlators/storage/posix/src/posix-messages.h b/xlators/storage/posix/src/posix-messages.h index b83a7b18809..2c23387f7e7 100644 --- a/xlators/storage/posix/src/posix-messages.h +++ b/xlators/storage/posix/src/posix-messages.h @@ -139,7 +139,8 @@ GLFS_MSGID(POSIX, P_MSG_FALLOCATE_FAILED, P_MSG_STOREMDATA_FAILED, P_MSG_FETCHMDATA_FAILED, - P_MSG_GETMDATA_FAILED + P_MSG_GETMDATA_FAILED, + P_MSG_SETMDATA_FAILED ); #endif /* !_GLUSTERD_MESSAGES_H_ */ diff --git a/xlators/storage/posix/src/posix-metadata.c b/xlators/storage/posix/src/posix-metadata.c index 57f32f9359c..90030ff28bd 100644 --- a/xlators/storage/posix/src/posix-metadata.c +++ b/xlators/storage/posix/src/posix-metadata.c @@ -345,10 +345,10 @@ posix_compare_timespec (struct timespec *first, struct timespec *second) return first->tv_sec - second->tv_sec; } -/* posix_update_mdata_xattr updates the posix_mdata_t based on the flag +/* posix_set_mdata_xattr updates the posix_mdata_t based on the flag * in inode context and stores it on disk */ -int +static int posix_set_mdata_xattr (xlator_t *this, const char *real_path, int fd, inode_t *inode, struct timespec *time, struct iatt *stbuf, posix_mdata_flag_t *flag) @@ -474,12 +474,12 @@ out: /* posix_update_utime_in_mdata updates the posix_mdata_t when mtime/atime * is modified using syscall */ -int +void posix_update_utime_in_mdata (xlator_t *this, const char *real_path, int fd, inode_t *inode, struct iatt *stbuf, int valid) { - int32_t ret = -1; + int32_t ret = 0; #if defined(HAVE_UTIMENSAT) struct timespec tv = {0, }; #else @@ -487,26 +487,39 @@ posix_update_utime_in_mdata (xlator_t *this, const char *real_path, int fd, #endif posix_mdata_flag_t flag = {0, }; - if ((valid & GF_SET_ATTR_ATIME) == GF_SET_ATTR_ATIME) { - tv.tv_sec = stbuf->ia_atime; - SET_TIMESPEC_NSEC_OR_TIMEVAL_USEC(tv, stbuf->ia_atime_nsec); + if (inode && is_ctime_enabled()) { + if ((valid & GF_SET_ATTR_ATIME) == GF_SET_ATTR_ATIME) { + tv.tv_sec = stbuf->ia_atime; + SET_TIMESPEC_NSEC_OR_TIMEVAL_USEC(tv, stbuf->ia_atime_nsec); - flag.ctime = 0; - flag.mtime = 0; - flag.atime = 1; - } + flag.ctime = 0; + flag.mtime = 0; + flag.atime = 1; + } - if ((valid & GF_SET_ATTR_MTIME) == GF_SET_ATTR_MTIME) { - tv.tv_sec = stbuf->ia_mtime; - SET_TIMESPEC_NSEC_OR_TIMEVAL_USEC(tv, stbuf->ia_mtime_nsec); - flag.ctime = 1; - flag.mtime = 1; - flag.atime = 0; - } + if ((valid & GF_SET_ATTR_MTIME) == GF_SET_ATTR_MTIME) { + tv.tv_sec = stbuf->ia_mtime; + SET_TIMESPEC_NSEC_OR_TIMEVAL_USEC(tv, stbuf->ia_mtime_nsec); - ret = posix_set_mdata_xattr (this, real_path, -1, inode, &tv, NULL, - &flag); - return ret; + flag.ctime = 1; + flag.mtime = 1; + flag.atime = 0; + } + + ret = posix_set_mdata_xattr (this, real_path, -1, inode, &tv, NULL, + &flag); + if (ret) { + gf_msg (this->name, GF_LOG_WARNING, errno, + P_MSG_SETMDATA_FAILED, + "posix set mdata failed on file: %s gfid:%s", + real_path, uuid_utoa (inode->gfid)); + } + } else { + gf_msg (this->name, GF_LOG_WARNING, errno, + P_MSG_SETMDATA_FAILED, + "posix utime set mdata failed on file"); + } + return; } gf_boolean_t @@ -516,3 +529,90 @@ is_ctime_enabled () { * */ return _gf_false; } + +static void +posix_get_mdata_flag (uint64_t flags, posix_mdata_flag_t *flag) +{ + if (!flag) + return; + + flag->ctime = 0; + flag->atime = 0; + flag->mtime = 0; + + if (flags & MDATA_CTIME) + flag->ctime = 1; + if (flags & MDATA_MTIME) + flag->mtime = 1; + if (flags & MDATA_ATIME) + flag->atime = 1; +} + +static void +posix_get_parent_mdata_flag (uint64_t flags, posix_mdata_flag_t *flag) +{ + if (!flag) + return; + + flag->ctime = 0; + flag->atime = 0; + flag->mtime = 0; + + if (flags & MDATA_PAR_CTIME) + flag->ctime = 1; + if (flags & MDATA_PAR_MTIME) + flag->mtime = 1; + if (flags & MDATA_PAR_ATIME) + flag->atime = 1; +} + +void +posix_set_ctime (call_frame_t *frame, xlator_t *this, const char* real_path, + int fd, inode_t *inode, struct iatt *stbuf) +{ + posix_mdata_flag_t flag = {0,}; + int ret = 0; + + if (inode && is_ctime_enabled()) { + (void) posix_get_mdata_flag (frame->root->flags, &flag); + ret = posix_set_mdata_xattr (this, real_path, fd, inode, + &frame->root->ctime, stbuf, &flag); + if (ret) { + gf_msg (this->name, GF_LOG_WARNING, errno, + P_MSG_SETMDATA_FAILED, + "posix set mdata failed on file: %s gfid:%s", + real_path, uuid_utoa (inode->gfid)); + } + } else { + gf_msg (this->name, GF_LOG_WARNING, errno, + P_MSG_SETMDATA_FAILED, + "posix set mdata failed on file"); + } + return; +} + +void +posix_set_parent_ctime (call_frame_t *frame, xlator_t *this, + const char* real_path, int fd, inode_t *inode, + struct iatt *stbuf) +{ + posix_mdata_flag_t flag = {0,}; + int ret = 0; + + if (inode && is_ctime_enabled()) { + (void) posix_get_parent_mdata_flag (frame->root->flags, &flag); + ret = posix_set_mdata_xattr (this, real_path, fd, inode, + &frame->root->ctime, stbuf, &flag); + if (ret) { + gf_msg (this->name, GF_LOG_WARNING, errno, + P_MSG_SETMDATA_FAILED, + "posix set mdata failed on file: %s gfid:%s", + real_path, uuid_utoa (inode->gfid)); + } + } else { + gf_msg (this->name, GF_LOG_WARNING, errno, + P_MSG_SETMDATA_FAILED, + "posix parent set mdata failed on file"); + } + return; +} diff --git a/xlators/storage/posix/src/posix-metadata.h b/xlators/storage/posix/src/posix-metadata.h index a6bde785abe..48744fd8186 100644 --- a/xlators/storage/posix/src/posix-metadata.h +++ b/xlators/storage/posix/src/posix-metadata.h @@ -38,13 +38,16 @@ posix_get_mdata_xattr (xlator_t *this, const char *real_path, int _fd, int __posix_get_mdata_xattr (xlator_t *this, const char *real_path, int _fd, inode_t *inode, struct iatt *stbuf); -int -posix_set_mdata_xattr (xlator_t *this, const char *real_path, int fd, - inode_t *inode, struct timespec *time, - struct iatt *stbuf, posix_mdata_flag_t *flag); -int +void posix_update_utime_in_mdata (xlator_t *this, const char *real_path, int fd, inode_t *inode, struct iatt *stbuf, int valid); +void +posix_set_ctime (call_frame_t *frame, xlator_t *this, const char* real_path, + int fd, inode_t *inode, struct iatt *stbuf); +void +posix_set_parent_ctime (call_frame_t *frame, xlator_t *this, + const char* real_path, int fd, inode_t *inode, + struct iatt *stbuf); gf_boolean_t is_ctime_enabled(); diff --git a/xlators/storage/posix/src/posix.h b/xlators/storage/posix/src/posix.h index 9712b675eb1..b5172a26c24 100644 --- a/xlators/storage/posix/src/posix.h +++ b/xlators/storage/posix/src/posix.h @@ -265,6 +265,7 @@ struct posix_private { }; typedef struct { + call_frame_t *frame; xlator_t *this; const char *real_path; dict_t *xattr; @@ -337,8 +338,9 @@ dict_t *posix_xattr_fill (xlator_t *this, const char *path, loc_t *loc, fd_t *fd, int fdnum, dict_t *xattr, struct iatt *buf); int posix_handle_pair (xlator_t *this, const char *real_path, char *key, data_t *value, int flags, struct iatt *stbuf); -int posix_fhandle_pair (xlator_t *this, int fd, char *key, data_t *value, - int flags, struct iatt *stbuf); +int posix_fhandle_pair (call_frame_t *frame, xlator_t *this, int fd, char *key, + data_t *value, int flags, struct iatt *stbuf, + fd_t *_fd); void posix_spawn_janitor_thread (xlator_t *this); int posix_get_file_contents (xlator_t *this, uuid_t pargfid, const char *name, char **contents); @@ -368,6 +370,8 @@ posix_get_ancestry (xlator_t *this, inode_t *leaf_inode, gf_dirent_t *head, char **path, int type, int32_t *op_errno, dict_t *xdata); int +posix_handle_mdata_xattr (call_frame_t *frame, const char *name, int *op_errno); +int posix_handle_georep_xattrs (call_frame_t *, const char *, int *, gf_boolean_t); int32_t posix_resolve_dirgfid_to_path (const uuid_t dirgfid, const char *brick_path, |