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