diff options
Diffstat (limited to 'xlators/protocol/client/src/client.c')
| -rw-r--r-- | xlators/protocol/client/src/client.c | 29 | 
1 files changed, 29 insertions, 0 deletions
diff --git a/xlators/protocol/client/src/client.c b/xlators/protocol/client/src/client.c index b0a71d3f9ea..45ef9de5fac 100644 --- a/xlators/protocol/client/src/client.c +++ b/xlators/protocol/client/src/client.c @@ -159,6 +159,8 @@ client_submit_request (xlator_t *this, void *req, call_frame_t *frame,          struct iobref  *new_iobref = NULL;          ssize_t         xdr_size   = 0;          struct rpc_req  rpcreq     = {0, }; +        uint64_t        ngroups    = 0; +        uint64_t        gid        = 0;          GF_VALIDATE_OR_GOTO ("client", this, out);          GF_VALIDATE_OR_GOTO (this->name, prog, out); @@ -225,6 +227,18 @@ client_submit_request (xlator_t *this, void *req, call_frame_t *frame,                  count = 1;          } +        /* do not send all groups if they are resolved server-side */ +        if (!conf->send_gids) { +                /* copy some values for restoring later */ +                ngroups = frame->root->ngrps; +                frame->root->ngrps = 1; +                if (ngroups <= SMALL_GROUP_COUNT) { +                        gid = frame->root->groups_small[0]; +                        frame->root->groups_small[0] = frame->root->gid; +                        frame->root->groups = frame->root->groups_small; +                } +        } +          /* Send the msg */          ret = rpc_clnt_submit (conf->rpc, prog, procnum, cbkfn, &iov, count,                                 NULL, 0, new_iobref, frame, rsphdr, rsphdr_count, @@ -247,6 +261,13 @@ client_submit_request (xlator_t *this, void *req, call_frame_t *frame,          if (start_ping)                  client_start_ping ((void *) this); +        if (!conf->send_gids) { +                /* restore previous values */ +                frame->root->ngrps = ngroups; +                if (ngroups <= SMALL_GROUP_COUNT) +                        frame->root->groups_small[0] = gid; +        } +          ret = 0;          if (new_iobref) @@ -2328,6 +2349,8 @@ build_client_config (xlator_t *this, clnt_conf_t *conf)          GF_OPTION_INIT ("filter-O_DIRECT", conf->filter_o_direct,                          bool, out); +        GF_OPTION_INIT ("send-gids", conf->send_gids, bool, out); +          ret = 0;  out:          return ret; @@ -2515,6 +2538,8 @@ reconfigure (xlator_t *this, dict_t *options)          GF_OPTION_RECONF ("filter-O_DIRECT", conf->filter_o_direct,                            options, bool, out); +        GF_OPTION_RECONF ("send-gids", conf->send_gids, options, bool, out); +          ret = client_init_grace_timer (this, options, conf);          if (ret)                  goto out; @@ -2870,5 +2895,9 @@ struct volume_options options[] = {            "still continue to cache the file. This works similar to NFS's "            "behavior of O_DIRECT",          }, +        { .key   = {"send-gids"}, +          .type  = GF_OPTION_TYPE_BOOL, +          .default_value = "on", +        },          { .key   = {NULL} },  };  | 
