From b371736a58a3c0174fbd8823d51c690ec9d4f7d3 Mon Sep 17 00:00:00 2001 From: Raghavendra Bhat Date: Tue, 19 Feb 2013 13:22:25 +0530 Subject: cluster/afr: do complete split-brain check in all the fd based fops fd based operations such as readv checked only for data split brain instead of complete split-brain (i.e both data + metadata) assuming that open would have done the complete split-brain check. However open-behind would have unwound open, without winding to afr thus preventing the complete split-brain check and some appliations will be able to read the contents of the file even though the file has metadata split-brain. So let all the fd based fops do a defensive check of complete split-brain. Change-Id: Ia90b35f2b08426dfcad804b7f8105278c86fbd2d BUG: 846240 Signed-off-by: Raghavendra Bhat Reviewed-on: http://review.gluster.org/4548 Tested-by: Gluster Build System Reviewed-by: Anand Avati --- xlators/cluster/afr/src/afr-common.c | 15 --------------- xlators/cluster/afr/src/afr-inode-read.c | 11 ++++++++++- xlators/cluster/afr/src/afr-inode-write.c | 23 +++++++++++++++++++++++ xlators/cluster/afr/src/afr.h | 3 --- 4 files changed, 33 insertions(+), 19 deletions(-) (limited to 'xlators') diff --git a/xlators/cluster/afr/src/afr-common.c b/xlators/cluster/afr/src/afr-common.c index 80134640..e66be035 100644 --- a/xlators/cluster/afr/src/afr-common.c +++ b/xlators/cluster/afr/src/afr-common.c @@ -324,21 +324,6 @@ out: return spb; } -gf_boolean_t -afr_is_data_split_brain (xlator_t *this, inode_t *inode) -{ - afr_inode_ctx_t *ctx = NULL; - gf_boolean_t spb = _gf_false; - - ctx = afr_inode_ctx_get (inode, this); - if (!ctx) - goto out; - if (ctx->data_spb == SPB) - spb = _gf_true; -out: - return spb; -} - gf_boolean_t afr_is_opendir_done (xlator_t *this, inode_t *inode) { diff --git a/xlators/cluster/afr/src/afr-inode-read.c b/xlators/cluster/afr/src/afr-inode-read.c index 40d57b6f..1263749b 100644 --- a/xlators/cluster/afr/src/afr-inode-read.c +++ b/xlators/cluster/afr/src/afr-inode-read.c @@ -348,6 +348,11 @@ afr_fstat (call_frame_t *frame, xlator_t *this, VALIDATE_OR_GOTO (fd->inode, out); + if (afr_is_split_brain (this, fd->inode)) { + op_errno = EIO; + goto out; + } + AFR_LOCAL_ALLOC_OR_GOTO (frame->local, out); local = frame->local; @@ -1658,6 +1663,10 @@ afr_fgetxattr (call_frame_t *frame, xlator_t *this, children = priv->children; + if (afr_is_split_brain (this, fd->inode)) { + op_errno = EIO; + goto out; + } AFR_LOCAL_ALLOC_OR_GOTO (local, out); frame->local = local; @@ -1813,7 +1822,7 @@ afr_readv (call_frame_t *frame, xlator_t *this, priv = this->private; children = priv->children; - if (afr_is_data_split_brain (this, fd->inode)) { + if (afr_is_split_brain (this, fd->inode)) { op_errno = EIO; goto out; } diff --git a/xlators/cluster/afr/src/afr-inode-write.c b/xlators/cluster/afr/src/afr-inode-write.c index c619536c..99fa027d 100644 --- a/xlators/cluster/afr/src/afr-inode-write.c +++ b/xlators/cluster/afr/src/afr-inode-write.c @@ -549,6 +549,11 @@ afr_writev (call_frame_t *frame, xlator_t *this, fd_t *fd, priv = this->private; + if (afr_is_split_brain (this, fd->inode)) { + op_errno = EIO; + goto out; + } + QUORUM_CHECK(writev,out); AFR_LOCAL_ALLOC_OR_GOTO (frame->local, out); @@ -1005,6 +1010,10 @@ afr_ftruncate (call_frame_t *frame, xlator_t *this, priv = this->private; + if (afr_is_split_brain (this, fd->inode)) { + op_errno = EIO; + goto out; + } QUORUM_CHECK(ftruncate,out); AFR_LOCAL_ALLOC_OR_GOTO (frame->local, out); @@ -1410,6 +1419,11 @@ afr_fsetattr (call_frame_t *frame, xlator_t *this, priv = this->private; + if (afr_is_split_brain (this, fd->inode)) { + op_errno = EIO; + goto out; + } + QUORUM_CHECK(fsetattr,out); transaction_frame = copy_frame (frame); @@ -1797,6 +1811,11 @@ afr_fsetxattr (call_frame_t *frame, xlator_t *this, priv = this->private; + if (afr_is_split_brain (this, fd->inode)) { + op_errno = EIO; + goto out; + } + QUORUM_CHECK(fsetxattr,out); AFR_LOCAL_ALLOC_OR_GOTO (local, out); @@ -2182,6 +2201,10 @@ afr_fremovexattr (call_frame_t *frame, xlator_t *this, VALIDATE_OR_GOTO (this->private, out); priv = this->private; + if (afr_is_split_brain (this, fd->inode)) { + op_errno = EIO; + goto out; + } QUORUM_CHECK(fremovexattr, out); diff --git a/xlators/cluster/afr/src/afr.h b/xlators/cluster/afr/src/afr.h index cc0d0107..f4ebf435 100644 --- a/xlators/cluster/afr/src/afr.h +++ b/xlators/cluster/afr/src/afr.h @@ -859,9 +859,6 @@ afr_frame_return (call_frame_t *frame); gf_boolean_t afr_is_split_brain (xlator_t *this, inode_t *inode); -gf_boolean_t -afr_is_data_split_brain (xlator_t *this, inode_t *inode); - void afr_set_split_brain (xlator_t *this, inode_t *inode, afr_spb_state_t mdata_spb, afr_spb_state_t data_spb); -- cgit