diff options
author | shishir gowda <shishirng@gluster.com> | 2012-04-19 13:18:33 +0530 |
---|---|---|
committer | Vijay Bellur <vijay@gluster.com> | 2012-04-20 05:56:19 -0700 |
commit | 443806fcfa6332163e08a63620e54d2f6be3996e (patch) | |
tree | 437e69d3f6431c5b39828a3bc6636b534fa4991a | |
parent | 10e8f8e7a9dbcb048fd6991d3c474e3430676859 (diff) |
stripe: make sure we have complete set of subvolumes before making fop
Change-Id: Ifc3b05183945a7ce3e25f8c777daaf3fd4aecff3
BUG: 810450
Signed-off-by: shishir gowda <shishirng@gluster.com>
Reviewed-on: http://review.gluster.com/3190
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Amar Tumballi <amarts@redhat.com>
-rw-r--r-- | xlators/cluster/stripe/src/stripe.c | 4 | ||||
-rw-r--r-- | xlators/cluster/stripe/src/stripe.h | 17 |
2 files changed, 21 insertions, 0 deletions
diff --git a/xlators/cluster/stripe/src/stripe.c b/xlators/cluster/stripe/src/stripe.c index 44a00ee1216..86cc66f59c1 100644 --- a/xlators/cluster/stripe/src/stripe.c +++ b/xlators/cluster/stripe/src/stripe.c @@ -3314,6 +3314,8 @@ stripe_readv (call_frame_t *frame, xlator_t *this, fd_t *fd, fctx = (stripe_fd_ctx_t *)(long)tmp_fctx; stripe_size = fctx->stripe_size; + STRIPE_VALIDATE_FCTX (fctx, err); + if (!stripe_size) { gf_log (this->name, GF_LOG_DEBUG, "Wrong stripe size for the file"); @@ -3459,6 +3461,8 @@ stripe_writev (call_frame_t *frame, xlator_t *this, fd_t *fd, fctx = (stripe_fd_ctx_t *)(long)tmp_fctx; stripe_size = fctx->stripe_size; + STRIPE_VALIDATE_FCTX (fctx, err); + /* File has to be stripped across the child nodes */ for (idx = 0; idx< count; idx ++) { total_size += vector[idx].iov_len; diff --git a/xlators/cluster/stripe/src/stripe.h b/xlators/cluster/stripe/src/stripe.h index 2d245dac902..607dc9e74d4 100644 --- a/xlators/cluster/stripe/src/stripe.h +++ b/xlators/cluster/stripe/src/stripe.h @@ -64,6 +64,23 @@ } \ } while (0) +#define STRIPE_VALIDATE_FCTX(fctx, label) do { \ + int idx = 0; \ + if (!fctx) { \ + op_errno = EINVAL; \ + goto label; \ + } \ + for (idx = 0; idx < fctx->stripe_count; idx++) { \ + if (!fctx->xl_array[idx]) { \ + gf_log (this->name, GF_LOG_ERROR, \ + "fctx->xl_array[%d] is NULL", \ + idx); \ + op_errno = ESTALE; \ + goto label; \ + } \ + } \ + } while (0) + typedef struct stripe_xattr_sort { int32_t pos; int32_t xattr_len; |