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