summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnuradha Talur <atalur@commvault.com>2019-04-24 12:06:23 -0700
committerAnuradha Talur <atalur@commvault.com>2019-04-25 08:41:02 -0700
commitde11b4a476b297129065bc7477229e57643ac196 (patch)
treeb3dbc31d95e72271e9e363081668b1827ce7d380
parent2b86da69df423a90b76932bd32b7a17bd5ac2add (diff)
cloudsync: Make readdirp return stat info of all the dirents
This change got missed while the initial changes were sent. Should have been a part of : https://review.gluster.org/#/c/glusterfs/+/21757/ Gist of the change: Function that fills in stat info for dirents is invoked in readdirp in posix when cloudsync populates xdata request with GF_CS_OBJECT_STATUS. Change-Id: Ide0c4e80afb74cd2120f74ba934ed40123152d69 updates: bz#1642168 Signed-off-by: Anuradha Talur <atalur@commvault.com>
-rwxr-xr-xxlators/features/cloudsync/src/cloudsync-fops-c.py2
-rw-r--r--xlators/features/cloudsync/src/cloudsync.c35
-rw-r--r--xlators/storage/posix/src/posix-inode-fd-ops.c2
3 files changed, 38 insertions, 1 deletions
diff --git a/xlators/features/cloudsync/src/cloudsync-fops-c.py b/xlators/features/cloudsync/src/cloudsync-fops-c.py
index a7a2201275c..8878b70a715 100755
--- a/xlators/features/cloudsync/src/cloudsync-fops-c.py
+++ b/xlators/features/cloudsync/src/cloudsync-fops-c.py
@@ -285,7 +285,7 @@ loc_stat_op_fop_template = ['lookup', 'stat', 'discover', 'access', 'setattr',
# These fops need a separate implementation
special_fops = ['statfs', 'setxattr', 'unlink', 'getxattr',
- 'truncate', 'fstat', 'readv']
+ 'truncate', 'fstat', 'readv', 'readdirp']
def gen_defaults():
for name in ops:
diff --git a/xlators/features/cloudsync/src/cloudsync.c b/xlators/features/cloudsync/src/cloudsync.c
index 2240fc3b4d8..2497b4dde47 100644
--- a/xlators/features/cloudsync/src/cloudsync.c
+++ b/xlators/features/cloudsync/src/cloudsync.c
@@ -276,6 +276,40 @@ out:
}
int32_t
+cs_readdirp(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,
+ off_t off, dict_t *xdata)
+{
+ int ret = 0;
+ int op_errno = ENOMEM;
+
+ if (!xdata) {
+ xdata = dict_new();
+ if (!xdata) {
+ gf_msg(this->name, GF_LOG_ERROR, 0, ENOMEM,
+ "failed to create "
+ "dict");
+ goto err;
+ }
+ }
+
+ ret = dict_set_uint32(xdata, GF_CS_OBJECT_STATUS, 1);
+ if (ret) {
+ gf_msg(this->name, GF_LOG_ERROR, 0, 0,
+ "dict_set failed key:"
+ " %s",
+ GF_CS_OBJECT_STATUS);
+ goto err;
+ }
+
+ STACK_WIND(frame, default_readdirp_cbk, FIRST_CHILD(this),
+ FIRST_CHILD(this)->fops->readdirp, fd, size, off, xdata);
+ return 0;
+err:
+ STACK_UNWIND_STRICT(readdirp, frame, -1, op_errno, NULL, NULL);
+ return 0;
+}
+
+int32_t
cs_truncate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,
int32_t op_ret, int32_t op_errno, struct iatt *prebuf,
struct iatt *postbuf, dict_t *xdata)
@@ -2022,6 +2056,7 @@ cs_notify(xlator_t *this, int event, void *data, ...)
struct xlator_fops cs_fops = {
.stat = cs_stat,
+ .readdirp = cs_readdirp,
.truncate = cs_truncate,
.seek = cs_seek,
.statfs = cs_statfs,
diff --git a/xlators/storage/posix/src/posix-inode-fd-ops.c b/xlators/storage/posix/src/posix-inode-fd-ops.c
index f96f65400b2..c12856d4764 100644
--- a/xlators/storage/posix/src/posix-inode-fd-ops.c
+++ b/xlators/storage/posix/src/posix-inode-fd-ops.c
@@ -5491,6 +5491,8 @@ posix_readdirp_fill(xlator_t *this, fd_t *fd, gf_dirent_t *entries,
continue;
}
+ posix_update_iatt_buf(&stbuf, -1, hpath, dict);
+
if (!inode)
inode = inode_find(itable, stbuf.ia_gfid);