From d3a318973c9613cfef8b1a14256fb5178e417fb0 Mon Sep 17 00:00:00 2001 From: Basavanagowda Kanur Date: Thu, 26 Feb 2009 20:36:50 +0530 Subject: fd->lock added to protect transactions for accessing and modifying fd->_ctx. fd->_ctx access and modifications are now protected by fd->lock. Signed-off-by: Anand V. Avati --- libglusterfs/src/fd.c | 94 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 61 insertions(+), 33 deletions(-) (limited to 'libglusterfs/src/fd.c') diff --git a/libglusterfs/src/fd.c b/libglusterfs/src/fd.c index 78c57884247..bbd15201cf8 100644 --- a/libglusterfs/src/fd.c +++ b/libglusterfs/src/fd.c @@ -415,6 +415,8 @@ fd_destroy (fd_t *fd) } } } + + LOCK_DESTROY (&fd->lock); FREE (fd->_ctx); inode_unref (fd->inode); @@ -489,6 +491,8 @@ fd_create (inode_t *inode, pid_t pid) fd->pid = pid; INIT_LIST_HEAD (&fd->inode_list); + LOCK_INIT (&fd->lock); + LOCK (&inode->lock); fd = _fd_ref (fd); UNLOCK (&inode->lock); @@ -543,45 +547,61 @@ int fd_ctx_set (fd_t *fd, xlator_t *xlator, uint64_t value) { int index = 0; + int ret = 0; if (!fd || !xlator) return -1; - - for (index = 0; index < xlator->ctx->xl_count; index++) { - if (!fd->_ctx[index].key || - (fd->_ctx[index].key == (uint64_t)(long)xlator)) - break; - } + + LOCK (&fd->lock); + { + for (index = 0; index < xlator->ctx->xl_count; index++) { + if (!fd->_ctx[index].key || + (fd->_ctx[index].key == (uint64_t)(long)xlator)) + break; + } - if (index == xlator->ctx->xl_count) - return -1; + if (index == xlator->ctx->xl_count) { + ret = -1; + goto unlock; + } - fd->_ctx[index].key = (uint64_t)(long) xlator; - fd->_ctx[index].value = value; + fd->_ctx[index].key = (uint64_t)(long) xlator; + fd->_ctx[index].value = value; + } +unlock: + UNLOCK (&fd->lock); - return 0; + return ret; } int fd_ctx_get (fd_t *fd, xlator_t *xlator, uint64_t *value) { int index = 0; + int ret = 0; if (!fd || !xlator) return -1; + + LOCK (&fd->lock); + { + for (index = 0; index < xlator->ctx->xl_count; index++) { + if (fd->_ctx[index].key == (uint64_t)(long)xlator) + break; + } - for (index = 0; index < xlator->ctx->xl_count; index++) { - if (fd->_ctx[index].key == (uint64_t)(long)xlator) - break; - } - - if (index == xlator->ctx->xl_count) - return -1; + if (index == xlator->ctx->xl_count) { + ret = -1; + goto unlock; + } - if (value) - *value = fd->_ctx[index].value; + if (value) + *value = fd->_ctx[index].value; + } +unlock: + UNLOCK (&fd->lock); - return 0; + return ret; } @@ -589,23 +609,31 @@ int fd_ctx_del (fd_t *fd, xlator_t *xlator, uint64_t *value) { int index = 0; + int ret = 0; if (!fd || !xlator) return -1; + + LOCK (&fd->lock); + { + for (index = 0; index < xlator->ctx->xl_count; index++) { + if (fd->_ctx[index].key == (uint64_t)(long)xlator) + break; + } - for (index = 0; index < xlator->ctx->xl_count; index++) { - if (fd->_ctx[index].key == (uint64_t)(long)xlator) - break; - } - - if (index == xlator->ctx->xl_count) - return -1; + if (index == xlator->ctx->xl_count) { + ret = -1; + goto unlock; + } - if (value) - *value = fd->_ctx[index].value; + if (value) + *value = fd->_ctx[index].value; - fd->_ctx[index].key = 0; - fd->_ctx[index].value = 0; + fd->_ctx[index].key = 0; + fd->_ctx[index].value = 0; + } +unlock: + UNLOCK (&fd->lock); - return 0; + return ret; } -- cgit