performance/stat-prefetch: remove lock member in sp_fd_ctx_t.

- since the lifetime of fd context can be no longer than the fd, we can use
    lock in fd.

Signed-off-by: Raghavendra G <raghavendra@gluster.com>
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>

BUG: 405 (Segmentation fault in stat-prefetch.)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=405
This commit is contained in:
Raghavendra G 2009-11-24 20:46:48 +00:00 committed by Anand V. Avati
parent 81af21adec
commit ca4c8115a8
2 changed files with 22 additions and 36 deletions

View File

@ -253,11 +253,7 @@ __sp_get_cache_fd (xlator_t *this, fd_t *fd)
fd_ctx = (void *)(long) value;
LOCK (&fd_ctx->lock);
{
cache = fd_ctx->cache;
}
UNLOCK (&fd_ctx->lock);
cache = fd_ctx->cache;
out:
return cache;
@ -317,9 +313,6 @@ sp_fd_ctx_init (void)
sp_fd_ctx_t *fd_ctx = NULL;
fd_ctx = CALLOC (1, sizeof (*fd_ctx));
if (fd_ctx) {
LOCK_INIT (&fd_ctx->lock);
}
return fd_ctx;
}
@ -367,19 +360,16 @@ sp_del_cache_fd (xlator_t *this, fd_t *fd)
goto out;
}
ret = fd_ctx_get (fd, this, &value);
if (ret == -1) {
goto out;
}
fd_ctx = (void *)(long) value;
LOCK (&fd_ctx->lock);
LOCK (&fd->lock);
{
cache = fd_ctx->cache;
fd_ctx->cache = NULL;
ret = __fd_ctx_get (fd, this, &value);
if (ret == 0) {
fd_ctx = (void *)(long) value;
cache = fd_ctx->cache;
fd_ctx->cache = NULL;
}
}
UNLOCK (&fd_ctx->lock);
UNLOCK (&fd->lock);
out:
return cache;
@ -434,15 +424,11 @@ __sp_put_cache (xlator_t *this, fd_t *fd, sp_cache_t *cache)
}
}
LOCK (&fd_ctx->lock);
{
if (fd_ctx->cache) {
sp_cache_free (fd_ctx->cache);
}
fd_ctx->cache = cache;
if (fd_ctx->cache) {
sp_cache_free (fd_ctx->cache);
}
UNLOCK (&fd_ctx->lock);
fd_ctx->cache = cache;
out:
return ret;

View File

@ -37,25 +37,25 @@
struct sp_cache {
rbthash_table_t *table;
uint64_t expected_offset; /* Offset where the next read will
* happen.
*/
gf_lock_t lock;
unsigned long miss;
unsigned long hits;
uint64_t expected_offset; /* Offset where the next read will
* happen.
*/
gf_lock_t lock;
unsigned long miss;
unsigned long hits;
uint32_t ref;
};
typedef struct sp_cache sp_cache_t;
struct sp_fd_ctx {
sp_cache_t *cache;
inode_t *parent_inode; /*
inode_t *parent_inode; /*
* inode corresponding to dirname (path)
*/
char *name; /*
* basename of path on which this fd is
* basename of path on which this fd is
* opened
*/
gf_lock_t lock;
};
typedef struct sp_fd_ctx sp_fd_ctx_t;