summaryrefslogtreecommitdiffstats
path: root/xlators/cluster/dht/src/dht-helper.c
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/cluster/dht/src/dht-helper.c')
-rw-r--r--xlators/cluster/dht/src/dht-helper.c41
1 files changed, 35 insertions, 6 deletions
diff --git a/xlators/cluster/dht/src/dht-helper.c b/xlators/cluster/dht/src/dht-helper.c
index 19bea0a0ae2..7aa307da6b8 100644
--- a/xlators/cluster/dht/src/dht-helper.c
+++ b/xlators/cluster/dht/src/dht-helper.c
@@ -815,11 +815,23 @@ dht_init_subvolumes (xlator_t *this, dht_conf_t *conf)
static int
dht_migration_complete_check_done (int op_ret, call_frame_t *frame, void *data)
{
- dht_local_t *local = NULL;
+ dht_local_t *local = NULL;
+ xlator_t *subvol = NULL;
local = frame->local;
- local->rebalance.target_op_fn (THIS, frame, op_ret);
+ if (op_ret == -1)
+ goto out;
+
+ if (local->cached_subvol == NULL) {
+ local->op_errno = EINVAL;
+ goto out;
+ }
+
+ subvol = local->cached_subvol;
+
+out:
+ local->rebalance.target_op_fn (THIS, subvol, frame);
return 0;
}
@@ -998,13 +1010,30 @@ dht_rebalance_complete_check (xlator_t *this, call_frame_t *frame)
/* During 'in-progress' state, both nodes should have the file */
static int
-dht_inprogress_check_done (int op_ret, call_frame_t *sync_frame, void *data)
+dht_inprogress_check_done (int op_ret, call_frame_t *frame, void *data)
{
- dht_local_t *local = NULL;
+ dht_local_t *local = NULL;
+ xlator_t *subvol = NULL;
+ inode_t *inode = NULL;
- local = sync_frame->local;
+ local = frame->local;
+
+ if (op_ret == -1)
+ goto out;
+
+ inode = local->loc.inode ? local->loc.inode : local->fd->inode;
+
+ dht_inode_ctx_get1 (THIS, inode, &subvol);
+ if (!subvol) {
+ subvol = dht_subvol_get_cached (THIS, inode);
+ if (!subvol) {
+ local->op_errno = EINVAL;
+ goto out;
+ }
+ }
- local->rebalance.target_op_fn (THIS, sync_frame, op_ret);
+out:
+ local->rebalance.target_op_fn (THIS, subvol, frame);
return 0;
}