diff options
| -rw-r--r-- | xlators/cluster/stripe/src/stripe.c | 165 | ||||
| -rw-r--r-- | xlators/cluster/stripe/src/stripe.h | 1 | 
2 files changed, 116 insertions, 50 deletions
diff --git a/xlators/cluster/stripe/src/stripe.c b/xlators/cluster/stripe/src/stripe.c index fbcf21339e2..c5ea891a754 100644 --- a/xlators/cluster/stripe/src/stripe.c +++ b/xlators/cluster/stripe/src/stripe.c @@ -3727,6 +3727,13 @@ stripe_writev (call_frame_t *frame, xlator_t *this, fd_t *fd,          frame->local = local;          local->stripe_size = stripe_size; +        if (!stripe_size) { +                gf_log (this->name, GF_LOG_DEBUG, +                        "Wrong stripe size for the file"); +                op_errno = EINVAL; +                goto err; +        } +          while (1) {                  /* Send striped chunk of the vector to child                     nodes appropriately. */ @@ -3966,50 +3973,6 @@ stripe_iatt_merge (struct iatt *from, struct iatt *to)          return 0;  } -int32_t -stripe_readdirp_entry_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this, -                                int32_t op_ret, int32_t op_errno, struct iatt *buf) -{ -        gf_dirent_t    *entry = NULL; -        stripe_local_t *local = NULL; -        int32_t        done = 0; - -        if (!this || !frame || !frame->local || !cookie) { -                gf_log (this->name, GF_LOG_DEBUG, "possible NULL deref"); -                goto out; -        } -        entry = cookie; -        local = frame->local; -        LOCK (&frame->lock); -        { - -                local->wind_count--; -                if (!local->wind_count) -                        done = 1; -                if (op_ret == -1) { -                        local->op_errno = op_errno; -                        local->op_ret = op_ret; -                        goto unlock; -                } -                stripe_iatt_merge (buf, &entry->d_stat); -        } -unlock: -        UNLOCK(&frame->lock); - -        if (done) { -                frame->local = NULL; -                STRIPE_STACK_UNWIND (readdir, frame, local->op_ret, -                                     local->op_errno, &local->entries); - -                gf_dirent_free (&local->entries); -                stripe_local_wipe (local); -                mem_put (local); -        } -out: -        return 0; - -} -  int  stripe_setxattr_cbk (call_frame_t *frame, void *cookie,                       xlator_t *this, int op_ret, int op_errno) @@ -4077,6 +4040,77 @@ stripe_fsetxattr (call_frame_t *frame, xlator_t *this, fd_t *fd,  }  int32_t +stripe_readdirp_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this, +                      int op_ret, int op_errno, inode_t *inode, +                      struct iatt *stbuf, dict_t *xattr, struct iatt *parent) +{ +        stripe_local_t          *local          = NULL; +        call_frame_t            *main_frame     = NULL; +        stripe_local_t          *main_local     = NULL; +        gf_dirent_t             *entry          = NULL; +        call_frame_t            *prev           = NULL; +        int                      done           = 0; + +        local = frame->local; +        prev = cookie; + +        entry = local->dirent; + +        main_frame = local->orig_frame; +        main_local = main_frame->local; +        LOCK (&frame->lock); +        { + +                local->call_count--; +                if (!local->call_count) +                        done = 1; +                if (op_ret == -1) { +                        local->op_errno = op_errno; +                        local->op_ret = op_ret; +                        goto unlock; +                } +                stripe_iatt_merge (stbuf, &entry->d_stat); +                stripe_ctx_handle (this, prev, local, xattr); +        } +unlock: +        UNLOCK(&frame->lock); + +        if (done) { +                inode_ctx_put (entry->inode, this, +                               (uint64_t) (long)local->fctx); + +                done = 0; +                LOCK (&main_frame->lock); +                { +                        main_local->wind_count--; +                        if (!main_local->wind_count) +                                done = 1; +                        if (local->op_ret == -1) { +                                main_local->op_errno = local->op_errno; +                                main_local->op_ret = local->op_ret; +                        } +                } +                UNLOCK (&main_frame->lock); +                if (done) { +                        main_frame->local = NULL; +                        STRIPE_STACK_UNWIND (readdir, main_frame, +                                             main_local->op_ret, +                                             main_local->op_errno, +                                             &main_local->entries); +                        gf_dirent_free (&main_local->entries); +                        stripe_local_wipe (main_local); +                        mem_put (main_local); +                } +                frame->local = NULL; +                stripe_local_wipe (local); +                mem_put (local); +                STRIPE_STACK_DESTROY (frame); +        } + +        return 0; +} + +int32_t  stripe_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                       int32_t op_ret, int32_t op_errno, gf_dirent_t *orig_entries)  { @@ -4092,6 +4126,9 @@ stripe_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          int32_t        count = 0;          stripe_private_t *priv = NULL;          int32_t        subvols = 0; +        dict_t         *xattrs = NULL; +        call_frame_t   *local_frame = NULL; +        stripe_local_t *local_ent = NULL;          if (!this || !frame || !frame->local || !cookie) {                  gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref"); @@ -4117,8 +4154,9 @@ 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; +                        local->wind_count = op_ret;                  } +          }  unlock:          UNLOCK (&frame->lock); @@ -4126,6 +4164,9 @@ unlock:          if (op_ret == -1)                  goto out; +        xattrs = dict_new (); +        if (xattrs) +                (void) stripe_xattr_request_build (this, xattrs, 0, 0, 0);          count = op_ret;          ret = 0;          list_for_each_entry_safe (local_entry, tmp_entry, @@ -4136,7 +4177,7 @@ unlock:                  if (!IA_ISREG (local_entry->d_stat.ia_type)) {                          LOCK (&frame->lock);                          { -                                local->wind_count -= subvols; +                                local->wind_count--;                                  count = local->wind_count;                          }                          UNLOCK (&frame->lock); @@ -4165,11 +4206,34 @@ unlock:                  loc.name++;                  uuid_copy (loc.gfid, local_entry->d_stat.ia_gfid); +                local_frame = copy_frame (frame); + +                if (!local_frame) { +                        op_errno = ENOMEM; +                        op_ret = -1; +                        goto out; +                } + +                local_ent = mem_get0 (this->local_pool); +                if (!local_ent) { +                        op_errno = ENOMEM; +                        op_ret = -1; +                        goto out; +                } + +                local_ent->orig_frame = frame; + +                local_ent->call_count = subvols; + +                local_ent->dirent = local_entry; + +                local_frame->local = local_ent; +                  trav = this->children;                  while (trav) { -                        STACK_WIND_COOKIE (frame, stripe_readdirp_entry_stat_cbk, -                                           local_entry, trav->xlator, -                                           trav->xlator->fops->stat, &loc); +                        STACK_WIND (local_frame, stripe_readdirp_lookup_cbk, +                                    trav->xlator, trav->xlator->fops->lookup, +                                    &loc, xattrs);                          trav = trav->next;                  }                  inode_unref (loc.inode); @@ -4184,7 +4248,8 @@ out:                  stripe_local_wipe (local);                  mem_put (local);          } - +        if (xattrs) +                dict_unref (xattrs);          return 0;  } diff --git a/xlators/cluster/stripe/src/stripe.h b/xlators/cluster/stripe/src/stripe.h index 8090e2b46c3..e78583996d2 100644 --- a/xlators/cluster/stripe/src/stripe.h +++ b/xlators/cluster/stripe/src/stripe.h @@ -194,6 +194,7 @@ struct stripe_local {          void                *value;          struct iobref       *iobref;          gf_dirent_t          entries; +        gf_dirent_t         *dirent;          dict_t              *xattr;          uuid_t               ia_gfid;  };  | 
