summaryrefslogtreecommitdiffstats
path: root/xlators/features/shard/src
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/features/shard/src')
-rw-r--r--xlators/features/shard/src/shard.c71
1 files changed, 45 insertions, 26 deletions
diff --git a/xlators/features/shard/src/shard.c b/xlators/features/shard/src/shard.c
index 8c9f9f8978e..52b95472ba7 100644
--- a/xlators/features/shard/src/shard.c
+++ b/xlators/features/shard/src/shard.c
@@ -550,18 +550,35 @@ err:
return 0;
}
-int
-shard_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
- int32_t op_ret, int32_t op_errno, inode_t *inode,
- struct iatt *buf, dict_t *xdata, struct iatt *postparent)
+static void
+shard_inode_ctx_set_if_absent (inode_t *inode, xlator_t *this, dict_t *xdata,
+ struct iatt *buf)
{
int ret = 0;
uint64_t size = 0;
void *bsize = NULL;
- void *size_attr = NULL;
shard_inode_ctx_t ctx_tmp = {0,};
- uint64_t size_array[4];
+ if (shard_inode_ctx_get_block_size (inode, this, &size)) {
+ ret = dict_get_ptr (xdata, GF_XATTR_SHARD_BLOCK_SIZE, &bsize);
+ if (!ret) {
+ ctx_tmp.block_size = ntoh64 (*((uint64_t *)bsize));
+ ctx_tmp.mode = st_mode_from_ia (buf->ia_prot,
+ buf->ia_type);
+ ctx_tmp.rdev = buf->ia_rdev;
+ }
+ ret = shard_inode_ctx_set_all (inode, this, &ctx_tmp);
+ if (ret)
+ gf_log (this->name, GF_LOG_WARNING, "Failed to set "
+ "inode ctx for %s", uuid_utoa (buf->ia_gfid));
+ }
+}
+
+int
+shard_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
+ int32_t op_ret, int32_t op_errno, inode_t *inode,
+ struct iatt *buf, dict_t *xdata, struct iatt *postparent)
+{
if (op_ret < 0)
goto unwind;
@@ -576,31 +593,15 @@ shard_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
* (which are anyway don't cares) in inode ctx. Since @ctx_tmp is
* already initialised to all zeroes, nothing more needs to be done.
*/
- if (shard_inode_ctx_get_block_size (inode, this, &size)) {
- ret = dict_get_ptr (xdata, GF_XATTR_SHARD_BLOCK_SIZE, &bsize);
- if (!ret) {
- ctx_tmp.block_size = ntoh64 (*((uint64_t *)bsize));
- ctx_tmp.mode = st_mode_from_ia (buf->ia_prot,
- buf->ia_type);
- ctx_tmp.rdev = buf->ia_rdev;
- }
- ret = shard_inode_ctx_set_all (inode, this, &ctx_tmp);
- if (ret)
- gf_log (this->name, GF_LOG_WARNING, "Failed to set "
- "inode ctx for %s", uuid_utoa (buf->ia_gfid));
- }
+
+ (void) shard_inode_ctx_set_if_absent (inode, this, xdata, buf);
/* Also, if the file is sharded, get the file size and block cnt xattr,
* and store them in the stbuf appropriately.
*/
- ret = dict_get_ptr (xdata, GF_XATTR_SHARD_FILE_SIZE, &size_attr);
- if (!ret) {
- memcpy (size_array, size_attr, sizeof (size_array));
-
- buf->ia_size = ntoh64 (size_array[0]);
- buf->ia_blocks = ntoh64 (size_array[2]);
- }
+ if (dict_get (xdata, GF_XATTR_SHARD_FILE_SIZE))
+ shard_modify_size_and_block_count (buf, xdata);
unwind:
SHARD_STACK_UNWIND (lookup, frame, op_ret, op_errno, inode, buf,
@@ -3403,6 +3404,12 @@ shard_readdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
if (dict_get (entry->dict, GF_XATTR_SHARD_FILE_SIZE))
shard_modify_size_and_block_count (&entry->d_stat,
entry->dict);
+
+ if (!entry->inode)
+ continue;
+
+ shard_inode_ctx_set_if_absent (entry->inode, this, entry->dict,
+ &entry->d_stat);
}
local->op_ret = op_ret;
@@ -3438,6 +3445,7 @@ int
shard_readdir_do (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,
off_t offset, int whichop, dict_t *xdata)
{
+ int ret = 0;
shard_local_t *local = NULL;
local = mem_get0 (this->local_pool);
@@ -3463,6 +3471,17 @@ shard_readdir_do (call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,
local->xattr_req = (xdata) ? dict_ref (xdata) : dict_new ();
SHARD_MD_READ_FOP_INIT_REQ_DICT (this, local->xattr_req,
fd->inode->gfid, local, err);
+ ret = dict_set_uint64 (local->xattr_req,
+ GF_XATTR_SHARD_BLOCK_SIZE, 0);
+ if (ret) {
+ gf_log (this->name, GF_LOG_WARNING, "Failed to set "
+ "dict value: key:%s, directory gfid=%s",
+ GF_XATTR_SHARD_BLOCK_SIZE,
+ uuid_utoa (fd->inode->gfid));
+ local->op_ret = -1;
+ local->op_errno = ENOMEM;
+ goto err;
+ }
STACK_WIND (frame, shard_readdir_cbk, FIRST_CHILD(this),
FIRST_CHILD(this)->fops->readdirp, fd, size, offset,