diff options
| -rw-r--r-- | xlators/cluster/stripe/src/stripe.c | 26 | 
1 files changed, 17 insertions, 9 deletions
diff --git a/xlators/cluster/stripe/src/stripe.c b/xlators/cluster/stripe/src/stripe.c index e7033183f6c..bf54bdea2c2 100644 --- a/xlators/cluster/stripe/src/stripe.c +++ b/xlators/cluster/stripe/src/stripe.c @@ -3774,8 +3774,8 @@ stripe_readdirp_entry_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *thi          LOCK (&frame->lock);          { -                local->count++; -                if (local->count == local->wind_count) +                local->wind_count--; +                if (!local->wind_count)                          done = 1;                  if (op_ret == -1) {                          local->op_errno = op_errno; @@ -3815,6 +3815,8 @@ stripe_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          inode_t        *inode = NULL;          char           *path;          int32_t        count = 0; +        stripe_private_t *priv = NULL; +        int32_t        subvols = 0;          if (!this || !frame || !frame->local || !cookie) {                  gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref"); @@ -3823,6 +3825,9 @@ stripe_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          prev  = cookie;          local = frame->local;          trav = this->children; +        priv = this->private; + +        subvols = priv->child_count;          LOCK (&frame->lock);          { @@ -3837,6 +3842,7 @@ stripe_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                          local->op_ret = op_ret;                          list_splice_init (&orig_entries->list,                                            &local->entries.list); +                        local->wind_count = op_ret * subvols;                  }          }  unlock: @@ -3845,14 +3851,22 @@ unlock:          if (op_ret == -1)                  goto out; +        count = op_ret;          ret = 0;          list_for_each_entry_safe (local_entry, tmp_entry,                                    (&local->entries.list), list) {                  if (!local_entry)                          break; -                if (!IA_ISREG (local_entry->d_stat.ia_type)) +                if (!IA_ISREG (local_entry->d_stat.ia_type)) { +                        LOCK (&frame->lock); +                        { +                                local->wind_count -= subvols; +                                count = local->wind_count; +                        } +                        UNLOCK (&frame->lock);                          continue; +                }                  inode = inode_new (local->fd->inode->table);                  if (!inode) @@ -3877,15 +3891,9 @@ unlock:                  loc.name++;                  trav = this->children;                  while (trav) { -                        LOCK (&frame->lock); -                        { -                                local->wind_count++; -                        } -                        UNLOCK (&frame->lock);                          STACK_WIND_COOKIE (frame, stripe_readdirp_entry_stat_cbk,                                             local_entry, trav->xlator,                                             trav->xlator->fops->stat, &loc); -                        count++;                          trav = trav->next;                  }                  inode_unref (loc.inode);  | 
