You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
403 lines
15 KiB
403 lines
15 KiB
From 10e9f850017d58fcd813ccce253784280326f1d0 Mon Sep 17 00:00:00 2001 |
|
From: Anuradha Talur <atalur@commvault.com> |
|
Date: Tue, 20 Nov 2018 13:15:26 -0800 |
|
Subject: [PATCH 152/169] storage/posix: changes with respect to cloudsync |
|
|
|
Main changes include logic to update iatt buf |
|
with file size from extended attributes in posix |
|
rather than having this logic in cloudsync xlator. |
|
|
|
backport of:https://review.gluster.org/#/c/glusterfs/+/21694/ |
|
|
|
> Change-Id: I44f5f8df7a01e496372557fe2f4eff368dbdaa33 |
|
> fixes: bz#1642168 |
|
> Signed-off-by: Anuradha Talur <atalur@commvault.com> |
|
|
|
Change-Id: I34880d856fb3add4ce88d64021d08d95405fc1c1 |
|
Signed-off-by: Susant Palai <spalai@redhat.com> |
|
Reviewed-on: https://code.engineering.redhat.com/gerrit/172191 |
|
Tested-by: RHGS Build Bot <nigelb@redhat.com> |
|
Reviewed-by: Atin Mukherjee <amukherj@redhat.com> |
|
--- |
|
xlators/storage/posix/src/posix-entry-ops.c | 1 + |
|
xlators/storage/posix/src/posix-helpers.c | 50 +++++++++ |
|
xlators/storage/posix/src/posix-inode-fd-ops.c | 139 ++++++++++++++++++++++--- |
|
xlators/storage/posix/src/posix.h | 2 + |
|
4 files changed, 177 insertions(+), 15 deletions(-) |
|
|
|
diff --git a/xlators/storage/posix/src/posix-entry-ops.c b/xlators/storage/posix/src/posix-entry-ops.c |
|
index fbd83c4..b24a052 100644 |
|
--- a/xlators/storage/posix/src/posix-entry-ops.c |
|
+++ b/xlators/storage/posix/src/posix-entry-ops.c |
|
@@ -272,6 +272,7 @@ posix_lookup(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata) |
|
} |
|
} |
|
|
|
+ posix_update_iatt_buf(&buf, -1, real_path, xdata); |
|
if (priv->update_pgfid_nlinks) { |
|
if (!gf_uuid_is_null(loc->pargfid) && !IA_ISDIR(buf.ia_type)) { |
|
MAKE_PGFID_XATTR_KEY(pgfid_xattr_key, PGFID_XATTR_KEY_PREFIX, |
|
diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c |
|
index 37e33a9..d0fd45a 100644 |
|
--- a/xlators/storage/posix/src/posix-helpers.c |
|
+++ b/xlators/storage/posix/src/posix-helpers.c |
|
@@ -3453,3 +3453,53 @@ posix_check_dev_file(xlator_t *this, inode_t *inode, char *fop, int *op_errno) |
|
out: |
|
return ret; |
|
} |
|
+ |
|
+void |
|
+posix_update_iatt_buf(struct iatt *buf, int fd, char *loc, dict_t *xattr_req) |
|
+{ |
|
+ int ret = 0; |
|
+ char val[4096] = { |
|
+ 0, |
|
+ }; |
|
+ |
|
+ if (!xattr_req) |
|
+ return; |
|
+ |
|
+ if (!(dict_getn(xattr_req, GF_CS_OBJECT_STATUS, |
|
+ strlen(GF_CS_OBJECT_STATUS)))) |
|
+ return; |
|
+ |
|
+ if (fd != -1) { |
|
+ ret = sys_fgetxattr(fd, GF_CS_OBJECT_SIZE, &val, sizeof(val)); |
|
+ if (ret > 0) { |
|
+ buf->ia_size = atoll(val); |
|
+ } else { |
|
+ /* Safe to assume that the other 2 xattrs are also not set*/ |
|
+ return; |
|
+ } |
|
+ ret = sys_fgetxattr(fd, GF_CS_BLOCK_SIZE, &val, sizeof(val)); |
|
+ if (ret > 0) { |
|
+ buf->ia_blksize = atoll(val); |
|
+ } |
|
+ ret = sys_fgetxattr(fd, GF_CS_NUM_BLOCKS, &val, sizeof(val)); |
|
+ if (ret > 0) { |
|
+ buf->ia_blocks = atoll(val); |
|
+ } |
|
+ } else { |
|
+ ret = sys_lgetxattr(loc, GF_CS_OBJECT_SIZE, &val, sizeof(val)); |
|
+ if (ret > 0) { |
|
+ buf->ia_size = atoll(val); |
|
+ } else { |
|
+ /* Safe to assume that the other 2 xattrs are also not set*/ |
|
+ return; |
|
+ } |
|
+ ret = sys_lgetxattr(loc, GF_CS_BLOCK_SIZE, &val, sizeof(val)); |
|
+ if (ret > 0) { |
|
+ buf->ia_blksize = atoll(val); |
|
+ } |
|
+ ret = sys_lgetxattr(loc, GF_CS_NUM_BLOCKS, &val, sizeof(val)); |
|
+ if (ret > 0) { |
|
+ buf->ia_blocks = atoll(val); |
|
+ } |
|
+ } |
|
+} |
|
diff --git a/xlators/storage/posix/src/posix-inode-fd-ops.c b/xlators/storage/posix/src/posix-inode-fd-ops.c |
|
index 7dbbd3d..065fced 100644 |
|
--- a/xlators/storage/posix/src/posix-inode-fd-ops.c |
|
+++ b/xlators/storage/posix/src/posix-inode-fd-ops.c |
|
@@ -108,6 +108,63 @@ extern char *marker_xattrs[]; |
|
static char *disallow_removexattrs[] = {GF_XATTR_VOL_ID_KEY, GFID_XATTR_KEY, |
|
NULL}; |
|
|
|
+void |
|
+posix_cs_build_xattr_rsp(xlator_t *this, dict_t **rsp, dict_t *req, int fd, |
|
+ char *loc) |
|
+{ |
|
+ int ret = 0; |
|
+ uuid_t uuid; |
|
+ |
|
+ if (!(dict_getn(req, GF_CS_OBJECT_STATUS, strlen(GF_CS_OBJECT_STATUS)))) |
|
+ return; |
|
+ |
|
+ if (!(*rsp)) { |
|
+ *rsp = dict_new(); |
|
+ if (!(*rsp)) { |
|
+ return; |
|
+ } |
|
+ } |
|
+ |
|
+ if (fd != -1) { |
|
+ if (dict_getn(req, GF_CS_XATTR_ARCHIVE_UUID, |
|
+ strlen(GF_CS_XATTR_ARCHIVE_UUID))) { |
|
+ ret = sys_fgetxattr(fd, GF_CS_XATTR_ARCHIVE_UUID, uuid, 16); |
|
+ if (ret > 0) { |
|
+ ret = dict_set_gfuuid(*rsp, GF_CS_XATTR_ARCHIVE_UUID, uuid, |
|
+ true); |
|
+ if (ret) { |
|
+ gf_msg(this->name, GF_LOG_WARNING, 0, P_MSG_DICT_SET_FAILED, |
|
+ "%s: Failed to set " |
|
+ "dictionary value for %s for fd %d", |
|
+ uuid_utoa(uuid), GF_CS_XATTR_ARCHIVE_UUID, fd); |
|
+ } |
|
+ } else { |
|
+ gf_msg_debug(this->name, 0, "getxattr failed on %s for fd %d", |
|
+ GF_CS_XATTR_ARCHIVE_UUID, fd); |
|
+ } |
|
+ } |
|
+ } else { |
|
+ if (dict_getn(req, GF_CS_XATTR_ARCHIVE_UUID, |
|
+ strlen(GF_CS_XATTR_ARCHIVE_UUID))) { |
|
+ ret = sys_lgetxattr(loc, GF_CS_XATTR_ARCHIVE_UUID, uuid, 16); |
|
+ if (ret > 0) { |
|
+ ret = dict_set_gfuuid(*rsp, GF_CS_XATTR_ARCHIVE_UUID, uuid, |
|
+ true); |
|
+ if (ret) { |
|
+ gf_msg(this->name, GF_LOG_WARNING, 0, P_MSG_DICT_SET_FAILED, |
|
+ "%s: Failed to set " |
|
+ "dictionary value for %s for loc %s", |
|
+ uuid_utoa(uuid), GF_CS_XATTR_ARCHIVE_UUID, loc); |
|
+ } |
|
+ } else { |
|
+ gf_msg_debug(this->name, 0, "getxattr failed on %s for %s", |
|
+ GF_CS_XATTR_ARCHIVE_UUID, loc); |
|
+ } |
|
+ } |
|
+ } |
|
+ return; |
|
+} |
|
+ |
|
int32_t |
|
posix_stat(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata) |
|
{ |
|
@@ -150,8 +207,11 @@ posix_stat(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *xdata) |
|
|
|
posix_cs_maintenance(this, NULL, loc, NULL, &buf, real_path, xdata, |
|
&xattr_rsp, _gf_true); |
|
+ |
|
+ posix_cs_build_xattr_rsp(this, &xattr_rsp, xdata, -1, real_path); |
|
} |
|
|
|
+ posix_update_iatt_buf(&buf, -1, real_path, xdata); |
|
op_ret = 0; |
|
|
|
out: |
|
@@ -422,6 +482,8 @@ posix_setattr(call_frame_t *frame, xlator_t *this, loc_t *loc, |
|
if (xdata) |
|
xattr_rsp = posix_xattr_fill(this, real_path, loc, NULL, -1, xdata, |
|
&statpost); |
|
+ posix_update_iatt_buf(&statpre, -1, real_path, xdata); |
|
+ posix_update_iatt_buf(&statpost, -1, real_path, xdata); |
|
op_ret = 0; |
|
|
|
out: |
|
@@ -898,6 +960,7 @@ posix_do_zerofill(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset, |
|
} |
|
} |
|
|
|
+ posix_update_iatt_buf(statpre, pfd->fd, NULL, xdata); |
|
/* See if we can use FALLOC_FL_ZERO_RANGE to perform the zero fill. |
|
* If it fails, fall back to _posix_do_zerofill() and an optional fsync. |
|
*/ |
|
@@ -1366,6 +1429,7 @@ posix_truncate(call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset, |
|
} |
|
} |
|
|
|
+ posix_update_iatt_buf(&prebuf, -1, real_path, xdata); |
|
op_ret = sys_truncate(real_path, offset); |
|
if (op_ret == -1) { |
|
op_errno = errno; |
|
@@ -1405,6 +1469,10 @@ posix_open(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags, |
|
int32_t _fd = -1; |
|
struct posix_fd *pfd = NULL; |
|
struct posix_private *priv = NULL; |
|
+ struct iatt preop = { |
|
+ 0, |
|
+ }; |
|
+ dict_t *rsp_xdata = NULL; |
|
struct iatt stbuf = { |
|
0, |
|
}; |
|
@@ -1471,6 +1539,18 @@ posix_open(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags, |
|
pfd->flags = flags; |
|
pfd->fd = _fd; |
|
|
|
+ if (xdata) { |
|
+ op_ret = posix_fdstat(this, fd->inode, pfd->fd, &preop); |
|
+ if (op_ret == -1) { |
|
+ gf_msg(this->name, GF_LOG_ERROR, errno, P_MSG_FSTAT_FAILED, |
|
+ "pre-operation fstat failed on fd=%p", fd); |
|
+ goto out; |
|
+ } |
|
+ |
|
+ posix_cs_maintenance(this, fd, NULL, &pfd->fd, &preop, NULL, xdata, |
|
+ &rsp_xdata, _gf_true); |
|
+ } |
|
+ |
|
op_ret = fd_ctx_set(fd, this, (uint64_t)(long)pfd); |
|
if (op_ret) |
|
gf_msg(this->name, GF_LOG_WARNING, 0, P_MSG_FD_PATH_SETTING_FAILED, |
|
@@ -1488,7 +1568,7 @@ out: |
|
|
|
SET_TO_OLD_FS_ID(); |
|
|
|
- STACK_UNWIND_STRICT(open, frame, op_ret, op_errno, fd, NULL); |
|
+ STACK_UNWIND_STRICT(open, frame, op_ret, op_errno, fd, rsp_xdata); |
|
|
|
return 0; |
|
} |
|
@@ -1573,6 +1653,7 @@ posix_readv(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size, |
|
} |
|
} |
|
|
|
+ posix_update_iatt_buf(&preop, _fd, NULL, xdata); |
|
op_ret = sys_pread(_fd, iobuf->ptr, size, offset); |
|
if (op_ret == -1) { |
|
op_errno = errno; |
|
@@ -1878,6 +1959,7 @@ posix_writev(call_frame_t *frame, xlator_t *this, fd_t *fd, |
|
} |
|
} |
|
|
|
+ posix_update_iatt_buf(&preop, _fd, NULL, xdata); |
|
if (locked && write_append) { |
|
if (preop.ia_size == offset || (fd->flags & O_APPEND)) |
|
is_append = 1; |
|
@@ -2531,10 +2613,8 @@ posix_setxattr(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict, |
|
0, |
|
}; |
|
data_t *tdata = NULL; |
|
- char stime[4096]; |
|
- char sxattr[4096]; |
|
+ char *cs_var = NULL; |
|
gf_cs_obj_state state = -1; |
|
- char remotepath[4096] = {0}; |
|
int i = 0; |
|
int len; |
|
|
|
@@ -2588,10 +2668,11 @@ posix_setxattr(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict, |
|
goto unlock; |
|
} |
|
|
|
- sprintf(stime, "%" PRId64, tmp_stbuf.ia_mtime); |
|
+ cs_var = alloca(4096); |
|
+ sprintf(cs_var, "%" PRId64, tmp_stbuf.ia_mtime); |
|
|
|
/*TODO: may be should consider nano-second also */ |
|
- if (strncmp(stime, tdata->data, tdata->len) != 0) { |
|
+ if (strncmp(cs_var, tdata->data, tdata->len) > 0) { |
|
gf_msg(this->name, GF_LOG_ERROR, 0, 0, |
|
"mtime " |
|
"passed is different from seen by file now." |
|
@@ -2601,31 +2682,54 @@ posix_setxattr(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict, |
|
goto unlock; |
|
} |
|
|
|
- len = sprintf(sxattr, "%" PRIu64, tmp_stbuf.ia_size); |
|
+ len = sprintf(cs_var, "%" PRIu64, tmp_stbuf.ia_size); |
|
|
|
- ret = sys_lsetxattr(real_path, GF_CS_OBJECT_SIZE, sxattr, len, |
|
+ ret = sys_lsetxattr(real_path, GF_CS_OBJECT_SIZE, cs_var, len, |
|
flags); |
|
if (ret) { |
|
+ op_errno = errno; |
|
gf_msg(this->name, GF_LOG_ERROR, 0, 0, |
|
"setxattr failed. key %s err %d", GF_CS_OBJECT_SIZE, |
|
ret); |
|
+ goto unlock; |
|
+ } |
|
+ |
|
+ len = sprintf(cs_var, "%" PRIu64, tmp_stbuf.ia_blocks); |
|
+ |
|
+ ret = sys_lsetxattr(real_path, GF_CS_NUM_BLOCKS, cs_var, len, |
|
+ flags); |
|
+ if (ret) { |
|
op_errno = errno; |
|
+ gf_msg(this->name, GF_LOG_ERROR, 0, 0, |
|
+ "setxattr failed. key %s err %d", GF_CS_NUM_BLOCKS, ret); |
|
goto unlock; |
|
} |
|
|
|
+ len = sprintf(cs_var, "%" PRIu32, tmp_stbuf.ia_blksize); |
|
+ |
|
+ ret = sys_lsetxattr(real_path, GF_CS_BLOCK_SIZE, cs_var, len, |
|
+ flags); |
|
+ if (ret) { |
|
+ op_errno = errno; |
|
+ gf_msg(this->name, GF_LOG_ERROR, 0, 0, |
|
+ "setxattr failed. key %s err %d", GF_CS_BLOCK_SIZE, ret); |
|
+ goto unlock; |
|
+ } |
|
+ |
|
+ memset(cs_var, 0, 4096); |
|
if (loc->path[0] == '/') { |
|
for (i = 1; i < strlen(loc->path); i++) { |
|
- remotepath[i - 1] = loc->path[i]; |
|
+ cs_var[i - 1] = loc->path[i]; |
|
} |
|
|
|
- remotepath[i] = '\0'; |
|
- gf_msg_debug(this->name, GF_LOG_ERROR, "remotepath %s", |
|
- remotepath); |
|
+ cs_var[i] = '\0'; |
|
+ gf_msg_debug(this->name, GF_LOG_ERROR, "remotepath %s", cs_var); |
|
} |
|
|
|
- ret = sys_lsetxattr(real_path, GF_CS_OBJECT_REMOTE, remotepath, |
|
- strlen(loc->path), flags); |
|
+ ret = sys_lsetxattr(real_path, GF_CS_OBJECT_REMOTE, cs_var, |
|
+ strlen(cs_var), flags); |
|
if (ret) { |
|
+ op_errno = errno; |
|
gf_log("POSIX", GF_LOG_ERROR, |
|
"setxattr failed - %s" |
|
" %d", |
|
@@ -2635,13 +2739,14 @@ posix_setxattr(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict, |
|
|
|
ret = sys_truncate(real_path, 0); |
|
if (ret) { |
|
+ op_errno = errno; |
|
gf_log("POSIX", GF_LOG_ERROR, |
|
"truncate failed - %s" |
|
" %d", |
|
GF_CS_OBJECT_SIZE, ret); |
|
- op_errno = errno; |
|
ret = sys_lremovexattr(real_path, GF_CS_OBJECT_REMOTE); |
|
if (ret) { |
|
+ op_errno = errno; |
|
gf_log("POSIX", GF_LOG_ERROR, |
|
"removexattr " |
|
"failed post processing- %s" |
|
@@ -2659,6 +2764,7 @@ posix_setxattr(call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict, |
|
} |
|
unlock: |
|
UNLOCK(&loc->inode->lock); |
|
+ op_ret = ret; |
|
goto out; |
|
} |
|
|
|
@@ -4927,6 +5033,7 @@ posix_ftruncate(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset, |
|
} |
|
} |
|
|
|
+ posix_update_iatt_buf(&preop, _fd, NULL, xdata); |
|
op_ret = sys_ftruncate(_fd, offset); |
|
|
|
if (op_ret == -1) { |
|
@@ -5008,8 +5115,10 @@ posix_fstat(call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *xdata) |
|
gf_msg(this->name, GF_LOG_ERROR, 0, 0, |
|
"file state check failed, fd %p", fd); |
|
} |
|
+ posix_cs_build_xattr_rsp(this, &xattr_rsp, xdata, _fd, NULL); |
|
} |
|
|
|
+ posix_update_iatt_buf(&buf, _fd, NULL, xdata); |
|
op_ret = 0; |
|
|
|
out: |
|
diff --git a/xlators/storage/posix/src/posix.h b/xlators/storage/posix/src/posix.h |
|
index d5ba08c..1da4d01 100644 |
|
--- a/xlators/storage/posix/src/posix.h |
|
+++ b/xlators/storage/posix/src/posix.h |
|
@@ -664,4 +664,6 @@ posix_check_dev_file(xlator_t *this, inode_t *inode, char *fop, int *op_errno); |
|
int |
|
posix_spawn_ctx_janitor_thread(xlator_t *this); |
|
|
|
+void |
|
+posix_update_iatt_buf(struct iatt *buf, int fd, char *loc, dict_t *xdata); |
|
#endif /* _POSIX_H */ |
|
-- |
|
1.8.3.1 |
|
|
|
|