From 3aff44fab8ba7a109bd691b8675dbfd9842237a3 Mon Sep 17 00:00:00 2001 From: Vikas Gorur Date: Fri, 27 Feb 2009 22:35:25 +0530 Subject: check for fd ctx set in changelog_needed_post_op for flush() in afr Earlier the check was in afr_flush(), which caused race conditions with writev() Signed-off-by: Anand V. Avati --- xlators/cluster/afr/src/afr-transaction.c | 46 ++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 7 deletions(-) (limited to 'xlators/cluster/afr/src/afr-transaction.c') diff --git a/xlators/cluster/afr/src/afr-transaction.c b/xlators/cluster/afr/src/afr-transaction.c index 6a1f228a6c0..82c2ee3406f 100644 --- a/xlators/cluster/afr/src/afr-transaction.c +++ b/xlators/cluster/afr/src/afr-transaction.c @@ -88,6 +88,26 @@ __is_first_write_on_fd (xlator_t *this, fd_t *fd) } +static int +__unset_fd_ctx_if_set (xlator_t *this, fd_t *fd) +{ + int op_ret = 0; + int _ret = -1; + + LOCK (&fd->inode->lock); + { + _ret = fd_ctx_get (fd, this, NULL); + if (_ret == 0) { + fd_ctx_del (fd, this, NULL); + op_ret = 1; + } + } + UNLOCK (&fd->inode->lock); + + return op_ret; +} + + static int __changelog_enabled (afr_private_t *priv, afr_transaction_type type) { @@ -170,19 +190,31 @@ __changelog_needed_post_op (call_frame_t *frame, xlator_t *this) afr_private_t * priv = NULL; afr_local_t * local = NULL; - int ret = 0; + int op_ret = 0; afr_transaction_type type = -1; priv = this->private; local = frame->local; type = local->transaction.type; - if (__changelog_enabled (priv, type) - && (local->op != GF_FOP_WRITE) - && (local->op != GF_FOP_FTRUNCATE)) - ret = 1; - - return ret; + if (__changelog_enabled (priv, type)) { + switch (local->op) { + + case GF_FOP_WRITE: + case GF_FOP_FTRUNCATE: + op_ret = 0; + break; + + case GF_FOP_FLUSH: + op_ret = __unset_fd_ctx_if_set (this, local->fd); + break; + + default: + op_ret = 1; + } + } + + return op_ret; } -- cgit