diff options
| -rw-r--r-- | api/src/glfs-fops.c | 32 | ||||
| -rw-r--r-- | rpc/rpc-lib/src/rpcsvc.c | 4 | ||||
| -rw-r--r-- | xlators/features/locks/src/clear.c | 36 | ||||
| -rw-r--r-- | xlators/features/locks/src/entrylk.c | 40 | ||||
| -rw-r--r-- | xlators/features/locks/src/inodelk.c | 38 | ||||
| -rw-r--r-- | xlators/features/locks/src/posix.c | 38 | ||||
| -rw-r--r-- | xlators/features/quota/src/quota.c | 72 | ||||
| -rw-r--r-- | xlators/performance/open-behind/src/open-behind.c | 18 | ||||
| -rw-r--r-- | xlators/performance/write-behind/src/write-behind.c | 21 | ||||
| -rw-r--r-- | xlators/protocol/client/src/client-lk.c | 10 | ||||
| -rw-r--r-- | xlators/storage/posix/src/posix-inode-handle.h | 4 | 
11 files changed, 176 insertions, 137 deletions
diff --git a/api/src/glfs-fops.c b/api/src/glfs-fops.c index f59990aed1f..a534697fc12 100644 --- a/api/src/glfs-fops.c +++ b/api/src/glfs-fops.c @@ -5314,9 +5314,7 @@ glfs_recall_lease_fd(struct glfs *fs, struct gf_upcall *up_data)      inode_t *inode = NULL;      struct glfs_fd *glfd = NULL;      struct glfs_fd *tmp = NULL; -    struct list_head glfd_list = { -        0, -    }; +    struct list_head glfd_list;      fd_t *fd = NULL;      uint64_t value = 0;      struct glfs_lease lease = { @@ -5365,22 +5363,24 @@ glfs_recall_lease_fd(struct glfs *fs, struct gf_upcall *up_data)      }      UNLOCK(&inode->lock); -    list_for_each_entry_safe(glfd, tmp, &glfd_list, list) -    { -        LOCK(&glfd->lock); +    if (!list_empty(&glfd_list)) { +        list_for_each_entry_safe(glfd, tmp, &glfd_list, list)          { -            if (glfd->state != GLFD_CLOSE) { -                gf_msg_trace(THIS->name, 0, -                             "glfd (%p) has held lease, " -                             "calling recall cbk", -                             glfd); -                glfd->cbk(lease, glfd->cookie); +            LOCK(&glfd->lock); +            { +                if (glfd->state != GLFD_CLOSE) { +                    gf_msg_trace(THIS->name, 0, +                                 "glfd (%p) has held lease, " +                                 "calling recall cbk", +                                 glfd); +                    glfd->cbk(lease, glfd->cookie); +                }              } -        } -        UNLOCK(&glfd->lock); +            UNLOCK(&glfd->lock); -        list_del_init(&glfd->list); -        GF_REF_PUT(glfd); +            list_del_init(&glfd->list); +            GF_REF_PUT(glfd); +        }      }  out: diff --git a/rpc/rpc-lib/src/rpcsvc.c b/rpc/rpc-lib/src/rpcsvc.c index 0a80bb179c2..273443d5619 100644 --- a/rpc/rpc-lib/src/rpcsvc.c +++ b/rpc/rpc-lib/src/rpcsvc.c @@ -2176,9 +2176,7 @@ rpcsvc_request_handler(void *arg)      rpcsvc_actor_t *actor = NULL;      gf_boolean_t done = _gf_false;      int ret = 0; -    struct list_head tmp_list = { -        0, -    }; +    struct list_head tmp_list;      queue = arg;      program = queue->program; diff --git a/xlators/features/locks/src/clear.c b/xlators/features/locks/src/clear.c index fbd17942c6c..578d6d18666 100644 --- a/xlators/features/locks/src/clear.c +++ b/xlators/features/locks/src/clear.c @@ -254,14 +254,16 @@ blkd:      }      pthread_mutex_unlock(&pl_inode->mutex); -    list_for_each_entry_safe(ilock, tmp, &released, blocked_locks) -    { -        list_del_init(&ilock->blocked_locks); -        pl_trace_out(this, ilock->frame, NULL, NULL, F_SETLKW, -                     &ilock->user_flock, -1, EAGAIN, ilock->volume); -        STACK_UNWIND_STRICT(inodelk, ilock->frame, -1, EAGAIN, NULL); -        // No need to take lock as the locks are only in one list -        __pl_inodelk_unref(ilock); +    if (!list_empty(&released)) { +        list_for_each_entry_safe(ilock, tmp, &released, blocked_locks) +        { +            list_del_init(&ilock->blocked_locks); +            pl_trace_out(this, ilock->frame, NULL, NULL, F_SETLKW, +                         &ilock->user_flock, -1, EAGAIN, ilock->volume); +            STACK_UNWIND_STRICT(inodelk, ilock->frame, -1, EAGAIN, NULL); +            // No need to take lock as the locks are only in one list +            __pl_inodelk_unref(ilock); +        }      }      if (!(args->kind & CLRLK_GRANTED)) { @@ -357,15 +359,17 @@ blkd:      }      pthread_mutex_unlock(&pl_inode->mutex); -    list_for_each_entry_safe(elock, tmp, &released, blocked_locks) -    { -        list_del_init(&elock->blocked_locks); -        entrylk_trace_out(this, elock->frame, elock->volume, NULL, NULL, -                          elock->basename, ENTRYLK_LOCK, elock->type, -1, -                          EAGAIN); -        STACK_UNWIND_STRICT(entrylk, elock->frame, -1, EAGAIN, NULL); +    if (!list_empty(&released)) { +        list_for_each_entry_safe(elock, tmp, &released, blocked_locks) +        { +            list_del_init(&elock->blocked_locks); +            entrylk_trace_out(this, elock->frame, elock->volume, NULL, NULL, +                              elock->basename, ENTRYLK_LOCK, elock->type, -1, +                              EAGAIN); +            STACK_UNWIND_STRICT(entrylk, elock->frame, -1, EAGAIN, NULL); -        __pl_entrylk_unref(elock); +            __pl_entrylk_unref(elock); +        }      }      if (!(args->kind & CLRLK_GRANTED)) { diff --git a/xlators/features/locks/src/entrylk.c b/xlators/features/locks/src/entrylk.c index d4135542cc9..8aa12831609 100644 --- a/xlators/features/locks/src/entrylk.c +++ b/xlators/features/locks/src/entrylk.c @@ -1072,32 +1072,36 @@ pl_entrylk_client_cleanup(xlator_t *this, pl_ctx_t *ctx)      }      pthread_mutex_unlock(&ctx->lock); -    list_for_each_entry_safe(l, tmp, &unwind, client_list) -    { -        list_del_init(&l->client_list); +    if (!list_empty(&unwind)) { +        list_for_each_entry_safe(l, tmp, &unwind, client_list) +        { +            list_del_init(&l->client_list); -        if (l->frame) -            STACK_UNWIND_STRICT(entrylk, l->frame, -1, EAGAIN, NULL); -        list_add_tail(&l->client_list, &released); +            if (l->frame) +                STACK_UNWIND_STRICT(entrylk, l->frame, -1, EAGAIN, NULL); +            list_add_tail(&l->client_list, &released); +        }      } -    list_for_each_entry_safe(l, tmp, &released, client_list) -    { -        list_del_init(&l->client_list); +    if (!list_empty(&released)) { +        list_for_each_entry_safe(l, tmp, &released, client_list) +        { +            list_del_init(&l->client_list); -        pinode = l->pinode; +            pinode = l->pinode; -        dom = get_domain(pinode, l->volume); +            dom = get_domain(pinode, l->volume); -        grant_blocked_entry_locks(this, pinode, dom, &now, pcontend); +            grant_blocked_entry_locks(this, pinode, dom, &now, pcontend); -        pthread_mutex_lock(&pinode->mutex); -        { -            __pl_entrylk_unref(l); -        } -        pthread_mutex_unlock(&pinode->mutex); +            pthread_mutex_lock(&pinode->mutex); +            { +                __pl_entrylk_unref(l); +            } +            pthread_mutex_unlock(&pinode->mutex); -        inode_unref(pinode->inode); +            inode_unref(pinode->inode); +        }      }      if (pcontend != NULL) { diff --git a/xlators/features/locks/src/inodelk.c b/xlators/features/locks/src/inodelk.c index 19b6f739f28..98367831dcf 100644 --- a/xlators/features/locks/src/inodelk.c +++ b/xlators/features/locks/src/inodelk.c @@ -691,31 +691,35 @@ pl_inodelk_client_cleanup(xlator_t *this, pl_ctx_t *ctx)      }      pthread_mutex_unlock(&ctx->lock); -    list_for_each_entry_safe(l, tmp, &unwind, client_list) -    { -        list_del_init(&l->client_list); +    if (!list_empty(&unwind)) { +        list_for_each_entry_safe(l, tmp, &unwind, client_list) +        { +            list_del_init(&l->client_list); -        if (l->frame) -            STACK_UNWIND_STRICT(inodelk, l->frame, -1, EAGAIN, NULL); -        list_add_tail(&l->client_list, &released); +            if (l->frame) +                STACK_UNWIND_STRICT(inodelk, l->frame, -1, EAGAIN, NULL); +            list_add_tail(&l->client_list, &released); +        }      } -    list_for_each_entry_safe(l, tmp, &released, client_list) -    { -        list_del_init(&l->client_list); +    if (!list_empty(&released)) { +        list_for_each_entry_safe(l, tmp, &released, client_list) +        { +            list_del_init(&l->client_list); -        pl_inode = l->pl_inode; +            pl_inode = l->pl_inode; -        dom = get_domain(pl_inode, l->volume); +            dom = get_domain(pl_inode, l->volume); -        grant_blocked_inode_locks(this, pl_inode, dom, &now, pcontend); +            grant_blocked_inode_locks(this, pl_inode, dom, &now, pcontend); -        pthread_mutex_lock(&pl_inode->mutex); -        { -            __pl_inodelk_unref(l); +            pthread_mutex_lock(&pl_inode->mutex); +            { +                __pl_inodelk_unref(l); +            } +            pthread_mutex_unlock(&pl_inode->mutex); +            inode_unref(pl_inode->inode);          } -        pthread_mutex_unlock(&pl_inode->mutex); -        inode_unref(pl_inode->inode);      }      if (pcontend != NULL) { diff --git a/xlators/features/locks/src/posix.c b/xlators/features/locks/src/posix.c index ce6b6f9fbfc..2d7fd112c8d 100644 --- a/xlators/features/locks/src/posix.c +++ b/xlators/features/locks/src/posix.c @@ -2562,25 +2562,33 @@ pl_forget(xlator_t *this, inode_t *inode)      }      pthread_mutex_unlock(&pl_inode->mutex); -    list_for_each_entry_safe(ext_l, ext_tmp, &posixlks_released, list) -    { -        STACK_UNWIND_STRICT(lk, ext_l->frame, -1, 0, &ext_l->user_flock, NULL); -        __destroy_lock(ext_l); +    if (!list_empty(&posixlks_released)) { +        list_for_each_entry_safe(ext_l, ext_tmp, &posixlks_released, list) +        { +            STACK_UNWIND_STRICT(lk, ext_l->frame, -1, 0, &ext_l->user_flock, +                                NULL); +            __destroy_lock(ext_l); +        }      } -    list_for_each_entry_safe(ino_l, ino_tmp, &inodelks_released, blocked_locks) -    { -        STACK_UNWIND_STRICT(inodelk, ino_l->frame, -1, 0, NULL); -        __pl_inodelk_unref(ino_l); +    if (!list_empty(&inodelks_released)) { +        list_for_each_entry_safe(ino_l, ino_tmp, &inodelks_released, +                                 blocked_locks) +        { +            STACK_UNWIND_STRICT(inodelk, ino_l->frame, -1, 0, NULL); +            __pl_inodelk_unref(ino_l); +        }      } -    list_for_each_entry_safe(entry_l, entry_tmp, &entrylks_released, -                             blocked_locks) -    { -        STACK_UNWIND_STRICT(entrylk, entry_l->frame, -1, 0, NULL); -        GF_FREE((char *)entry_l->basename); -        GF_FREE(entry_l->connection_id); -        GF_FREE(entry_l); +    if (!list_empty(&entrylks_released)) { +        list_for_each_entry_safe(entry_l, entry_tmp, &entrylks_released, +                                 blocked_locks) +        { +            STACK_UNWIND_STRICT(entrylk, entry_l->frame, -1, 0, NULL); +            GF_FREE((char *)entry_l->basename); +            GF_FREE(entry_l->connection_id); +            GF_FREE(entry_l); +        }      }      pthread_mutex_destroy(&pl_inode->mutex); diff --git a/xlators/features/quota/src/quota.c b/xlators/features/quota/src/quota.c index 84df5c3caff..418edfc0942 100644 --- a/xlators/features/quota/src/quota.c +++ b/xlators/features/quota/src/quota.c @@ -674,39 +674,43 @@ quota_timeout(struct timeval *tv, int32_t timeout)  /* Return: 1 if new entry added   *         0 no entry added + *        -1 on errors   */  static int32_t  quota_add_parent(struct list_head *list, char *name, uuid_t pgfid)  {      quota_dentry_t *entry = NULL;      gf_boolean_t found = _gf_false; +    int ret = 0; -    if (list == NULL) { -        goto out; -    } - -    list_for_each_entry(entry, list, next) -    { -        if (gf_uuid_compare(pgfid, entry->par) == 0) { -            found = _gf_true; -            goto out; +    if (!list_empty(list)) { +        list_for_each_entry(entry, list, next) +        { +            if (gf_uuid_compare(pgfid, entry->par) == 0) { +                found = _gf_true; +                goto out; +            }          }      }      entry = __quota_dentry_new(NULL, name, pgfid);      if (entry)          list_add_tail(&entry->next, list); +    else +        ret = -1;  out:      if (found)          return 0; -    else +    else if (ret == 0)          return 1; +    else +        return -1;  }  /* This function iterates the parent list in inode   * context and add unique parent to the list - * Returns number of dentry added to the list + * Returns number of dentry added to the list, or -1 on errors   */  static int32_t  quota_add_parents_from_ctx(quota_inode_ctx_t *ctx, struct list_head *list) @@ -723,15 +727,16 @@ quota_add_parents_from_ctx(quota_inode_ctx_t *ctx, struct list_head *list)          list_for_each_entry(dentry, &ctx->parents, next)          {              ret = quota_add_parent(list, dentry->name, dentry->par); -              if (ret == 1)                  count++; +            else if (ret == -1) +                break;          }      }      UNLOCK(&ctx->lock);  out: -    return count; +    return (ret == -1) ? -1 : count;  }  int32_t @@ -750,10 +755,9 @@ quota_build_ancestry_cbk(call_frame_t *frame, void *cookie, xlator_t *this,      quota_dentry_t *dentry = NULL;      quota_dentry_t *tmp = NULL;      quota_inode_ctx_t *ctx = NULL; -    struct list_head parents = { -        0, -    }; +    struct list_head parents;      quota_local_t *local = NULL; +    int ret;      INIT_LIST_HEAD(&parents); @@ -828,7 +832,11 @@ quota_build_ancestry_cbk(call_frame_t *frame, void *cookie, xlator_t *this,      quota_inode_ctx_get(local->loc.inode, this, &ctx, 0); -    quota_add_parents_from_ctx(ctx, &parents); +    ret = quota_add_parents_from_ctx(ctx, &parents); +    if (ret == -1) { +        op_errno = errno; +        goto err; +    }      if (list_empty(&parents)) {          /* we built ancestry for a directory */ @@ -843,7 +851,11 @@ quota_build_ancestry_cbk(call_frame_t *frame, void *cookie, xlator_t *this,             GF_ASSERT (&entry->list != &entries->list);          */ -        quota_add_parent(&parents, entry->d_name, parent->gfid); +        ret = quota_add_parent(&parents, entry->d_name, parent->gfid); +        if (ret == -1) { +            op_errno = errno; +            goto err; +        }      }      local->ancestry_cbk(&parents, local->loc.inode, 0, 0, local->ancestry_data); @@ -861,9 +873,11 @@ cleanup:          parent = NULL;      } -    list_for_each_entry_safe(dentry, tmp, &parents, next) -    { -        __quota_dentry_free(dentry); +    if (!list_empty(&parents)) { +        list_for_each_entry_safe(dentry, tmp, &parents, next) +        { +            __quota_dentry_free(dentry); +        }      }      return 0; @@ -1839,9 +1853,7 @@ quota_writev(call_frame_t *frame, xlator_t *this, fd_t *fd,      quota_inode_ctx_t *ctx = NULL;      quota_dentry_t *dentry = NULL, *tmp = NULL;      call_stub_t *stub = NULL; -    struct list_head head = { -        0, -    }; +    struct list_head head;      inode_t *par_inode = NULL;      priv = this->private; @@ -1881,9 +1893,13 @@ quota_writev(call_frame_t *frame, xlator_t *this, fd_t *fd,      priv = this->private;      GF_VALIDATE_OR_GOTO(this->name, priv, unwind); -    size = iov_length(vector, count); -      parents = quota_add_parents_from_ctx(ctx, &head); +    if (parents == -1) { +        op_errno = errno; +        goto unwind; +    } + +    size = iov_length(vector, count);      LOCK(&local->lock);      { @@ -4805,6 +4821,10 @@ quota_fallocate(call_frame_t *frame, xlator_t *this, fd_t *fd, int32_t mode,      GF_VALIDATE_OR_GOTO(this->name, priv, unwind);      parents = quota_add_parents_from_ctx(ctx, &head); +    if (parents == -1) { +        op_errno = errno; +        goto unwind; +    }      /*       * Note that by using len as the delta we're assuming the range from diff --git a/xlators/performance/open-behind/src/open-behind.c b/xlators/performance/open-behind/src/open-behind.c index a4302a776c5..268c7176f02 100644 --- a/xlators/performance/open-behind/src/open-behind.c +++ b/xlators/performance/open-behind/src/open-behind.c @@ -347,12 +347,14 @@ ob_inode_wake(xlator_t *this, struct list_head *ob_fds)      ob_fd_t *ob_fd = NULL, *tmp = NULL;      fd_t *fd = NULL; -    list_for_each_entry_safe(ob_fd, tmp, ob_fds, ob_fds_on_inode) -    { -        ob_fd_wake(this, ob_fd->fd, ob_fd); -        fd = ob_fd->fd; -        ob_fd_free(ob_fd); -        fd_unref(fd); +    if (!list_empty(ob_fds)) { +        list_for_each_entry_safe(ob_fd, tmp, ob_fds, ob_fds_on_inode) +        { +            ob_fd_wake(this, ob_fd->fd, ob_fd); +            fd = ob_fd->fd; +            ob_fd_free(ob_fd); +            fd_unref(fd); +        }      }  } @@ -381,9 +383,7 @@ open_all_pending_fds_and_resume(xlator_t *this, inode_t *inode,      ob_fd_t *ob_fd = NULL, *tmp = NULL;      gf_boolean_t was_open_in_progress = _gf_false;      gf_boolean_t wait_for_open = _gf_false; -    struct list_head ob_fds = { -        0, -    }; +    struct list_head ob_fds;      ob_inode = ob_inode_get(this, inode);      if (ob_inode == NULL) diff --git a/xlators/performance/write-behind/src/write-behind.c b/xlators/performance/write-behind/src/write-behind.c index f90abad38da..98b2f4639d3 100644 --- a/xlators/performance/write-behind/src/write-behind.c +++ b/xlators/performance/write-behind/src/write-behind.c @@ -1744,15 +1744,9 @@ wb_do_winds(wb_inode_t *wb_inode, list_head_t *tasks)  void  wb_process_queue(wb_inode_t *wb_inode)  { -    list_head_t tasks = { -        0, -    }; -    list_head_t lies = { -        0, -    }; -    list_head_t liabilities = { -        0, -    }; +    list_head_t tasks; +    list_head_t lies; +    list_head_t liabilities;      int wind_failure = 0;      INIT_LIST_HEAD(&tasks); @@ -1773,15 +1767,18 @@ wb_process_queue(wb_inode_t *wb_inode)          }          UNLOCK(&wb_inode->lock); -        wb_do_unwinds(wb_inode, &lies); +        if (!list_empty(&lies)) +            wb_do_unwinds(wb_inode, &lies); -        wb_do_winds(wb_inode, &tasks); +        if (!list_empty(&tasks)) +            wb_do_winds(wb_inode, &tasks);          /* If there is an error in wb_fulfill before winding write           * requests, we would miss invocation of wb_process_queue           * from wb_fulfill_cbk. So, retry processing again.           */ -        wind_failure = wb_fulfill(wb_inode, &liabilities); +        if (!list_empty(&liabilities)) +            wind_failure = wb_fulfill(wb_inode, &liabilities);      } while (wind_failure);      return; diff --git a/xlators/protocol/client/src/client-lk.c b/xlators/protocol/client/src/client-lk.c index 01613b7ab66..679e1982f49 100644 --- a/xlators/protocol/client/src/client-lk.c +++ b/xlators/protocol/client/src/client-lk.c @@ -360,10 +360,12 @@ delete_granted_locks_owner(fd_t *fd, gf_lkowner_t *owner)      pthread_spin_unlock(&conf->fd_lock); -    list_for_each_entry_safe(lock, tmp, &delete_list, list) -    { -        list_del_init(&lock->list); -        destroy_client_lock(lock); +    if (!list_empty(&delete_list)) { +        list_for_each_entry_safe(lock, tmp, &delete_list, list) +        { +            list_del_init(&lock->list); +            destroy_client_lock(lock); +        }      }      /* FIXME: Need to actually print the locks instead of count */ diff --git a/xlators/storage/posix/src/posix-inode-handle.h b/xlators/storage/posix/src/posix-inode-handle.h index 2a4b6438150..2009421cdba 100644 --- a/xlators/storage/posix/src/posix-inode-handle.h +++ b/xlators/storage/posix/src/posix-inode-handle.h @@ -91,8 +91,10 @@                         (loc)->path);                                           \              }                                                                  \              break;                                                             \ +        } /* __ret == -1 && errno == ELOOP */                                  \ +        else {                                                                 \ +            op_ret = -1;                                                       \          }                                                                      \ -        /* __ret == -1 && errno == ELOOP */                                    \      } while (0)  #define POSIX_ANCESTRY_PATH (1 << 0)  | 
