summaryrefslogtreecommitdiffstats
path: root/xlators/cluster/afr/src/afr-read-txn.c
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/cluster/afr/src/afr-read-txn.c')
-rw-r--r--xlators/cluster/afr/src/afr-read-txn.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/xlators/cluster/afr/src/afr-read-txn.c b/xlators/cluster/afr/src/afr-read-txn.c
index 1b2faf31eea..a70565c37a1 100644
--- a/xlators/cluster/afr/src/afr-read-txn.c
+++ b/xlators/cluster/afr/src/afr-read-txn.c
@@ -193,12 +193,16 @@ afr_read_txn (call_frame_t *frame, xlator_t *this, inode_t *inode,
{
afr_local_t *local = NULL;
afr_private_t *priv = NULL;
+ unsigned char *data = NULL;
+ unsigned char *metadata = NULL;
int read_subvol = -1;
int event_generation = 0;
int ret = -1;
priv = this->private;
local = frame->local;
+ data = alloca0 (priv->child_count);
+ metadata = alloca0 (priv->child_count);
afr_read_txn_wipe (frame, this);
@@ -213,10 +217,16 @@ afr_read_txn (call_frame_t *frame, xlator_t *this, inode_t *inode,
goto read;
}
-
local->transaction.type = type;
- ret = afr_inode_read_subvol_type_get (inode, this, local->readable,
- &event_generation, type);
+ if (local->op == GF_FOP_FSTAT || local->op == GF_FOP_STAT) {
+ ret = afr_inode_read_subvol_get (inode, this, data, metadata,
+ &event_generation);
+ AFR_INTERSECT (local->readable, data, metadata,
+ priv->child_count);
+ } else {
+ ret = afr_inode_read_subvol_type_get (inode, this, local->readable,
+ &event_generation, type);
+ }
if (ret == -1)
/* very first transaction on this inode */
goto refresh;