diff options
Diffstat (limited to 'xlators/performance/io-cache/src/page.c')
| -rw-r--r-- | xlators/performance/io-cache/src/page.c | 38 |
1 files changed, 27 insertions, 11 deletions
diff --git a/xlators/performance/io-cache/src/page.c b/xlators/performance/io-cache/src/page.c index c18c04a0b..416cd5fe4 100644 --- a/xlators/performance/io-cache/src/page.c +++ b/xlators/performance/io-cache/src/page.c @@ -136,6 +136,7 @@ int64_t ioc_page_destroy (ioc_page_t *page) { int64_t ret = 0; + struct ioc_inode *inode = NULL; if (page == NULL) { goto out; @@ -143,9 +144,10 @@ ioc_page_destroy (ioc_page_t *page) ioc_inode_lock (page->inode); { + inode = page->inode; ret = __ioc_page_destroy (page); } - ioc_inode_unlock (page->inode); + ioc_inode_unlock (inode); out: return ret; @@ -315,6 +317,7 @@ __ioc_wait_on_page (ioc_page_t *page, call_frame_t *frame, off_t offset, local->op_errno = ENOMEM; gf_log (frame->this->name, GF_LOG_WARNING, "asked to wait on a NULL page"); + goto out; } waitq = GF_CALLOC (1, sizeof (*waitq), gf_ioc_mt_ioc_waitq_t); @@ -476,6 +479,7 @@ ioc_fault_cbk (call_frame_t *frame, void *cookie, xlator_t *this, iobref_unref (page->iobref); GF_FREE (page->vector); page->vector = NULL; + page->iobref = NULL; } /* keep a copy of the page for our cache */ @@ -804,7 +808,7 @@ ioc_frame_unwind (call_frame_t *frame) int32_t copied = 0; struct iobref *iobref = NULL; struct iatt stbuf = {0,}; - int32_t op_ret = 0; + int32_t op_ret = 0, op_errno = 0; GF_ASSERT (frame); @@ -813,16 +817,21 @@ ioc_frame_unwind (call_frame_t *frame) gf_log (frame->this->name, GF_LOG_WARNING, "local is NULL"); op_ret = -1; - local->op_errno = ENOMEM; + op_errno = ENOMEM; + goto unwind; + } + + if (local->op_ret < 0) { + op_ret = local->op_ret; + op_errno = local->op_errno; goto unwind; } // ioc_local_lock (local); - frame->local = NULL; iobref = iobref_new (); if (iobref == NULL) { op_ret = -1; - local->op_errno = ENOMEM; + op_errno = ENOMEM; } if (list_empty (&local->fill_list)) { @@ -839,7 +848,7 @@ ioc_frame_unwind (call_frame_t *frame) vector = GF_CALLOC (count, sizeof (*vector), gf_ioc_mt_iovec); if (vector == NULL) { op_ret = -1; - local->op_errno = ENOMEM; + op_errno = ENOMEM; } list_for_each_entry_safe (fill, next, &local->fill_list, list) { @@ -850,7 +859,10 @@ ioc_frame_unwind (call_frame_t *frame) copied += (fill->count * sizeof (*vector)); - iobref_merge (iobref, fill->iobref); + if (iobref_merge (iobref, fill->iobref)) { + op_ret = -1; + op_errno = ENOMEM; + } } list_del (&fill->list); @@ -869,7 +881,8 @@ unwind: // ioc_local_unlock (local); - STACK_UNWIND_STRICT (readv, frame, op_ret, local->op_errno, vector, + frame->local = NULL; + STACK_UNWIND_STRICT (readv, frame, op_ret, op_errno, vector, count, &stbuf, iobref, NULL); if (iobref != NULL) { @@ -882,7 +895,8 @@ unwind: } pthread_mutex_destroy (&local->local_lock); - mem_put (local); + if (local) + mem_put (local); return; } @@ -980,7 +994,7 @@ __ioc_page_error (ioc_page_t *page, int32_t op_ret, int32_t op_errno) waitq = page->waitq; page->waitq = NULL; - gf_log (page->inode->table->xl->name, GF_LOG_WARNING, + gf_log (page->inode->table->xl->name, GF_LOG_DEBUG, "page error for page = %p & waitq = %p", page, waitq); for (trav = waitq; trav; trav = trav->next) { @@ -1020,6 +1034,7 @@ ioc_waitq_t * ioc_page_error (ioc_page_t *page, int32_t op_ret, int32_t op_errno) { ioc_waitq_t *waitq = NULL; + struct ioc_inode *inode = NULL; if (page == NULL) { goto out; @@ -1027,9 +1042,10 @@ ioc_page_error (ioc_page_t *page, int32_t op_ret, int32_t op_errno) ioc_inode_lock (page->inode); { + inode = page->inode; waitq = __ioc_page_error (page, op_ret, op_errno); } - ioc_inode_unlock (page->inode); + ioc_inode_unlock (inode); out: return waitq; |
