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