diff options
Diffstat (limited to 'xlators')
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volgen.c | 1 | ||||
| -rw-r--r-- | xlators/protocol/client/src/client.c | 26 | ||||
| -rw-r--r-- | xlators/protocol/client/src/client.h | 3 | 
3 files changed, 28 insertions, 2 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.c b/xlators/mgmt/glusterd/src/glusterd-volgen.c index 9feb76560c6..6ae32091a6c 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volgen.c +++ b/xlators/mgmt/glusterd/src/glusterd-volgen.c @@ -235,6 +235,7 @@ static struct volopt_map_entry glusterd_volopt_map[] = {          {"storage.linux-aio",                    "storage/posix",             NULL, NULL, DOC, 0},          {"storage.owner-uid",                    "storage/posix",             "brick-uid", NULL, DOC, 0},          {"storage.owner-gid",                    "storage/posix",             "brick-gid", NULL, DOC, 0}, +        {"network.remote-dio",                   "protocol/client",           "filter-O_DIRECT", NULL, DOC, 0},          {NULL,                                                                }  }; diff --git a/xlators/protocol/client/src/client.c b/xlators/protocol/client/src/client.c index 65df70f0604..d327375d0aa 100644 --- a/xlators/protocol/client/src/client.c +++ b/xlators/protocol/client/src/client.c @@ -815,12 +815,16 @@ client_create (call_frame_t *frame, xlator_t *this, loc_t *loc,  int32_t flags,                  goto out;          args.loc = loc; -        args.flags = flags;          args.mode = mode;          args.fd = fd;          args.umask = umask;          args.xdata = xdata; +        if (!conf->filter_o_direct) +                args.flags = flags; +        else +                args.flags = (flags & ~O_DIRECT); +          proc = &conf->fops->proctable[GF_FOP_CREATE];          if (!proc) {                  gf_log (this->name, GF_LOG_ERROR, @@ -854,10 +858,14 @@ client_open (call_frame_t *frame, xlator_t *this, loc_t *loc,                  goto out;          args.loc = loc; -        args.flags = flags;          args.fd = fd;          args.xdata = xdata; +        if (!conf->filter_o_direct) +                args.flags = flags; +        else +                args.flags = (flags & ~O_DIRECT); +          proc = &conf->fops->proctable[GF_FOP_OPEN];          if (!proc) {                  gf_log (this->name, GF_LOG_ERROR, @@ -2194,6 +2202,9 @@ build_client_config (xlator_t *this, clnt_conf_t *conf)                  gf_log (this->name, GF_LOG_WARNING,                          "option 'remote-subvolume' not given"); +        GF_OPTION_INIT ("filter-O_DIRECT", conf->filter_o_direct, +                        bool, out); +          ret = 0;  out:          return ret; @@ -2377,6 +2388,9 @@ reconfigure (xlator_t *this, dict_t *options)                  }          } +        GF_OPTION_RECONF ("filter-O_DIRECT", conf->filter_o_direct, +                          options, bool, out); +          ret = client_init_grace_timer (this, options, conf);          if (ret)                  goto out; @@ -2712,5 +2726,13 @@ struct volume_options options[] = {           .min  = GF_MIN_SOCKET_WINDOW_SIZE,           .max  = GF_MAX_SOCKET_WINDOW_SIZE          }, +        { .key   = {"filter-O_DIRECT"}, +          .type  = GF_OPTION_TYPE_BOOL, +          .default_value = "disable", +          .description = "If enabled, in open() and creat() calls, O_DIRECT " +          "flag will be filtered at the client protocol level so server will " +          "still continue to cache the file. This works similar to NFS's " +          "behavior of O_DIRECT", +        },          { .key   = {NULL} },  }; diff --git a/xlators/protocol/client/src/client.h b/xlators/protocol/client/src/client.h index ac999db5a16..035a3ecd764 100644 --- a/xlators/protocol/client/src/client.h +++ b/xlators/protocol/client/src/client.h @@ -109,6 +109,9 @@ typedef struct clnt_conf {                                                        means dont register, true                                                        means register */          char                   parent_down; + +        gf_boolean_t           filter_o_direct; /* if set, filter O_DIRECT from +                                                   the flags list of open() */  } clnt_conf_t;  typedef struct _client_fd_ctx {  | 
