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 <avati@amp.gluster.com>
This commit is contained in:
Basavanagowda Kanur 2009-02-26 20:36:50 +05:30 committed by Anand V. Avati
parent 431617ef19
commit d3a318973c
2 changed files with 64 additions and 33 deletions

View File

@ -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) {
ret = -1;
goto unlock;
}
if (index == xlator->ctx->xl_count)
return -1;
if (value)
*value = fd->_ctx[index].value;
}
unlock:
UNLOCK (&fd->lock);
if (value)
*value = fd->_ctx[index].value;
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) {
ret = -1;
goto unlock;
}
if (index == xlator->ctx->xl_count)
return -1;
if (value)
*value = fd->_ctx[index].value;
if (value)
*value = fd->_ctx[index].value;
fd->_ctx[index].key = 0;
fd->_ctx[index].value = 0;
}
unlock:
UNLOCK (&fd->lock);
fd->_ctx[index].key = 0;
fd->_ctx[index].value = 0;
return 0;
return ret;
}

View File

@ -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;