diff options
author | Raghavendra G <raghavendra@gluster.com> | 2009-11-24 20:46:48 +0000 |
---|---|---|
committer | Anand V. Avati <avati@dev.gluster.com> | 2009-11-24 23:06:12 -0800 |
commit | ca4c8115a839568405e1dea2f4bda01f43357921 (patch) | |
tree | 2c21a214a94705bbf0b537e25fe522a02733b566 /xlators/performance | |
parent | 81af21adec38eb04de19694af1b3ce8a1a095ab7 (diff) |
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
Diffstat (limited to 'xlators/performance')
-rw-r--r-- | xlators/performance/stat-prefetch/src/stat-prefetch.c | 40 | ||||
-rw-r--r-- | xlators/performance/stat-prefetch/src/stat-prefetch.h | 18 |
2 files changed, 22 insertions, 36 deletions
diff --git a/xlators/performance/stat-prefetch/src/stat-prefetch.c b/xlators/performance/stat-prefetch/src/stat-prefetch.c index 9c6f44f0d..47126e877 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 a2c1e4f16..6e329003e 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; |