diff options
| author | Soumya Koduri <skoduri@redhat.com> | 2018-11-28 14:14:00 +0530 | 
|---|---|---|
| committer | Raghavendra G <rgowdapp@redhat.com> | 2018-12-04 05:23:03 +0000 | 
| commit | b3d88a0904131f6851f4185e43f815ecc3353ab5 (patch) | |
| tree | d68fc655153a13fc3addfdee01e357a3e89ce52c | |
| parent | 9fc6cf898bcb7dc0f3f671e734678616722d0721 (diff) | |
io-cache: xdata needs to be passed for readv operations
io-cache xlator has been skipping xdata references when the
date needs to be read into page cache. This patch fixes the same.
Note: similar changes may be needed for other fops as well
which are handled by io-cache.
Change-Id: I28d73d4ba471d13eb55d0fd0b5197d222df77a2a
updates: bz#1648768
Signed-off-by: Soumya Koduri <skoduri@redhat.com>
| -rw-r--r-- | xlators/performance/io-cache/src/io-cache.c | 7 | ||||
| -rw-r--r-- | xlators/performance/io-cache/src/page.c | 11 | 
2 files changed, 16 insertions, 2 deletions
diff --git a/xlators/performance/io-cache/src/io-cache.c b/xlators/performance/io-cache/src/io-cache.c index 6705128087e..31e3bb0df96 100644 --- a/xlators/performance/io-cache/src/io-cache.c +++ b/xlators/performance/io-cache/src/io-cache.c @@ -413,6 +413,7 @@ ioc_cache_validate_cbk(call_frame_t *frame, void *cookie, xlator_t *this,       * fd_ref on fd, safe to unref validate frame's private copy       */      fd_unref(local->fd); +    dict_unref(local->xattr_req);      STACK_DESTROY(frame->root); @@ -495,10 +496,13 @@ ioc_cache_validate(call_frame_t *frame, ioc_inode_t *ioc_inode, fd_t *fd,      validate_local->fd = fd_ref(fd);      validate_local->inode = ioc_inode; +    if (local && local->xattr_req) +        validate_local->xattr_req = dict_ref(local->xattr_req);      validate_frame->local = validate_local;      STACK_WIND(validate_frame, ioc_cache_validate_cbk, FIRST_CHILD(frame->this), -               FIRST_CHILD(frame->this)->fops->fstat, fd, NULL); +               FIRST_CHILD(frame->this)->fops->fstat, fd, +               validate_local->xattr_req);  out:      return ret; @@ -1141,6 +1145,7 @@ ioc_readv(call_frame_t *frame, xlator_t *this, fd_t *fd, size_t size,      local->offset = offset;      local->size = size;      local->inode = ioc_inode; +    local->xattr_req = dict_ref(xdata);      gf_msg_trace(this->name, 0,                   "NEW REQ (%p) offset " diff --git a/xlators/performance/io-cache/src/page.c b/xlators/performance/io-cache/src/page.c index d2cbe2499a4..19bd946b76d 100644 --- a/xlators/performance/io-cache/src/page.c +++ b/xlators/performance/io-cache/src/page.c @@ -546,6 +546,8 @@ unlock:      pthread_mutex_destroy(&local->local_lock);      fd_unref(local->fd); +    if (local->xattr_req) +        dict_unref(local->xattr_req);      STACK_DESTROY(frame->root);      return 0; @@ -567,6 +569,7 @@ ioc_page_fault(ioc_inode_t *ioc_inode, call_frame_t *frame, fd_t *fd,      ioc_table_t *table = NULL;      call_frame_t *fault_frame = NULL;      ioc_local_t *fault_local = NULL; +    ioc_local_t *local = NULL;      int32_t op_ret = -1, op_errno = -1;      ioc_waitq_t *waitq = NULL;      ioc_page_t *page = NULL; @@ -588,6 +591,7 @@ ioc_page_fault(ioc_inode_t *ioc_inode, call_frame_t *frame, fd_t *fd,          goto err;      } +    local = frame->local;      fault_local = mem_get0(THIS->local_pool);      if (fault_local == NULL) {          op_ret = -1; @@ -609,6 +613,9 @@ ioc_page_fault(ioc_inode_t *ioc_inode, call_frame_t *frame, fd_t *fd,      fault_local->pending_size = table->page_size;      fault_local->inode = ioc_inode; +    if (local && local->xattr_req) +        fault_local->xattr_req = dict_ref(local->xattr_req); +      gf_msg_trace(frame->this->name, 0,                   "stack winding page fault for offset = %" PRId64                   " with " @@ -617,7 +624,7 @@ ioc_page_fault(ioc_inode_t *ioc_inode, call_frame_t *frame, fd_t *fd,      STACK_WIND(fault_frame, ioc_fault_cbk, FIRST_CHILD(fault_frame->this),                 FIRST_CHILD(fault_frame->this)->fops->readv, fd, -               table->page_size, offset, 0, NULL); +               table->page_size, offset, 0, fault_local->xattr_req);      return;  err: @@ -878,6 +885,8 @@ unwind:      }      if (local) { +        if (local->xattr_req) +            dict_unref(local->xattr_req);          pthread_mutex_destroy(&local->local_lock);          mem_put(local);      }  | 
