diff options
-rw-r--r-- | libglusterfs/src/fd.c | 94 | ||||
-rw-r--r-- | libglusterfs/src/fd.h | 3 |
2 files changed, 64 insertions, 33 deletions
diff --git a/libglusterfs/src/fd.c b/libglusterfs/src/fd.c index 78c578842..bbd15201c 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; } diff --git a/libglusterfs/src/fd.h b/libglusterfs/src/fd.h index 8b8effdc3..29a79eb76 100644 --- a/libglusterfs/src/fd.h +++ b/libglusterfs/src/fd.h @@ -29,6 +29,7 @@ #include <sys/types.h> #include <unistd.h> #include "glusterfs.h" +#include "locking.h" struct _inode; struct _dict; @@ -44,6 +45,8 @@ struct _fd { struct list_head inode_list; struct _inode *inode; struct _dict *ctx; + gf_lock_t lock; /* used ONLY for manipulating + 'struct _fd_ctx' array (_ctx).*/ struct _fd_ctx *_ctx; }; typedef struct _fd fd_t; |