From 1b1f063371a66748101ba90bafe08317dee50c4d Mon Sep 17 00:00:00 2001 From: Pranith Kumar K Date: Wed, 7 Oct 2015 17:43:33 +0530 Subject: cluster/afr: Handle stack reset failures Backport of http://review.gluster.com/12309 When all the bricks go down in the middle of the self-heal, in AFR_STACK_RESET afr_local_init will fail because all the bricks are down. So local will remain NULL for the frame. This leads to crashes as this failure is not handled in both entry and data self-heals. Change-Id: I71a02f161f2c4dbfdc8bb7f2a6f32807191ed253 BUG: 1269501 Signed-off-by: Pranith Kumar K Reviewed-on: http://review.gluster.org/12310 Reviewed-by: Krutika Dhananjay Tested-by: NetBSD Build System Tested-by: Gluster Build System --- xlators/cluster/afr/src/afr-self-heal-data.c | 4 ++++ xlators/cluster/afr/src/afr-self-heal-entry.c | 4 ++++ 2 files changed, 8 insertions(+) (limited to 'xlators/cluster') diff --git a/xlators/cluster/afr/src/afr-self-heal-data.c b/xlators/cluster/afr/src/afr-self-heal-data.c index 3245cfd6e9c..279f2faaaaf 100644 --- a/xlators/cluster/afr/src/afr-self-heal-data.c +++ b/xlators/cluster/afr/src/afr-self-heal-data.c @@ -369,6 +369,10 @@ afr_selfheal_data_do (call_frame_t *frame, xlator_t *this, fd_t *fd, goto out; AFR_STACK_RESET (iter_frame); + if (iter_frame->local == NULL) { + ret = -ENOTCONN; + goto out; + } } afr_selfheal_data_restore_time (frame, this, fd->inode, source, diff --git a/xlators/cluster/afr/src/afr-self-heal-entry.c b/xlators/cluster/afr/src/afr-self-heal-entry.c index e06e43eb828..43c038b1c15 100644 --- a/xlators/cluster/afr/src/afr-self-heal-entry.c +++ b/xlators/cluster/afr/src/afr-self-heal-entry.c @@ -550,6 +550,10 @@ afr_selfheal_entry_do_subvol (call_frame_t *frame, xlator_t *this, ret = afr_selfheal_entry_dirent (iter_frame, this, fd, entry->d_name); AFR_STACK_RESET (iter_frame); + if (iter_frame->local == NULL) { + ret = -ENOTCONN; + break; + } if (ret == -1) { /* gfid or type mismatch. */ -- cgit