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 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;  } diff --git a/libglusterfs/src/fd.h b/libglusterfs/src/fd.h index 8b8effdc335..29a79eb76ac 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;  | 
