From ca4c8115a839568405e1dea2f4bda01f43357921 Mon Sep 17 00:00:00 2001 From: Raghavendra G Date: Tue, 24 Nov 2009 20:46:48 +0000 Subject: 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 Signed-off-by: Anand V. Avati BUG: 405 (Segmentation fault in stat-prefetch.) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=405 --- .../performance/stat-prefetch/src/stat-prefetch.c | 40 +++++++--------------- .../performance/stat-prefetch/src/stat-prefetch.h | 18 +++++----- 2 files changed, 22 insertions(+), 36 deletions(-) (limited to 'xlators/performance') diff --git a/xlators/performance/stat-prefetch/src/stat-prefetch.c b/xlators/performance/stat-prefetch/src/stat-prefetch.c index 9c6f44f0de8..47126e877ad 100644 --- a/xlators/performance/stat-prefetch/src/stat-prefetch.c +++ b/xlators/performance/stat-prefetch/src/stat-prefetch.c @@ -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; diff --git a/xlators/performance/stat-prefetch/src/stat-prefetch.h b/xlators/performance/stat-prefetch/src/stat-prefetch.h index a2c1e4f162d..6e329003e8a 100644 --- a/xlators/performance/stat-prefetch/src/stat-prefetch.h +++ b/xlators/performance/stat-prefetch/src/stat-prefetch.h @@ -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; -- cgit