diff options
| author | Santosh Kumar Pradhan <spradhan@redhat.com> | 2013-10-28 12:46:37 +0530 | 
|---|---|---|
| committer | Anand Avati <avati@redhat.com> | 2013-11-14 16:07:02 -0800 | 
| commit | e479660d9dd8bf7017c7dc78ccfa6edd9c51ec7a (patch) | |
| tree | 96d4e58b53bef4fddb9455a21deff47ab841a75d /xlators/nfs/server/src/nfs3.c | |
| parent | 2990befa4cf9219f33b21b6c50d3e2afa4b7461b (diff) | |
gNFS: RFE for NFS connection behavior
Implement reconfigure() for NFS xlator so that volume set/reset wont
restart the NFS server process. But few options can not be reconfigured
dynamically e.g. nfs.mem-factor, nfs.port etc which needs NFS to be
restarted.
Change-Id: Ic586fd55b7933c0a3175708d8c41ed0475d74a1c
BUG: 1027409
Signed-off-by: Santosh Kumar Pradhan <spradhan@redhat.com>
Reviewed-on: http://review.gluster.org/6236
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Rajesh Joseph <rjoseph@redhat.com>
Reviewed-by: Anand Avati <avati@redhat.com>
Diffstat (limited to 'xlators/nfs/server/src/nfs3.c')
| -rw-r--r-- | xlators/nfs/server/src/nfs3.c | 125 | 
1 files changed, 78 insertions, 47 deletions
diff --git a/xlators/nfs/server/src/nfs3.c b/xlators/nfs/server/src/nfs3.c index 4faec355986..f914c31937d 100644 --- a/xlators/nfs/server/src/nfs3.c +++ b/xlators/nfs/server/src/nfs3.c @@ -64,19 +64,6 @@          } while (0);                                                    \ -/* - * Special case: If op_ret is -1, it's very unusual op_errno being - * 0 which means something came wrong from upper layer(s). If it - * happens by any means, then set NFS3 status to NFS3ERR_SERVERFAULT. - */ -static inline nfsstat3 nfs3_cbk_errno_status (int32_t op_ret, int32_t op_errno) -{ -        if ((op_ret == -1) && (op_errno == 0)){ -                return NFS3ERR_SERVERFAULT; -        } -        return nfs3_errno_to_nfsstat3 (op_errno); -} -  struct nfs3_export *  __nfs3_get_export_by_index (struct nfs3_state *nfs3, uuid_t exportid)  { @@ -5151,22 +5138,22 @@ rpcsvc_program_t        nfs3prog = {  };  /* - * This function rounds up the input value to multiple of 4096. If the - * value is same as default, then its a NO-OP. Default is already a - * multiple of 4096. Min and Max supported I/O size limits are - * 4KB (GF_NFS3_FILE_IO_SIZE_MIN) and 1MB (GF_NFS3_FILE_IO_SIZE_MAX). + * This function rounds up the input value to multiple of 4096. Min and Max + * supported I/O size limits are 4KB (GF_NFS3_FILE_IO_SIZE_MIN) and + * 1MB (GF_NFS3_FILE_IO_SIZE_MAX).   */ -static void -nfs3_iosize_roundup_4KB (size_t *iosz, size_t iodef) +void +nfs3_iosize_roundup_4KB (uint64_t *ioszptr)  { -        size_t iosize = *iosz; -        size_t iopages; +        uint64_t iosize; +        uint64_t iopages; -        if (iosize == iodef) +        if (!ioszptr)                  return; +        iosize  = *ioszptr;          iopages = (iosize + GF_NFS3_IO_SIZE -1) >> GF_NFS3_IO_SHIFT; -        iosize = iopages * GF_NFS3_IO_SIZE; +        iosize  = (iopages * GF_NFS3_IO_SIZE);          /* Double check - boundary conditions */          if (iosize < GF_NFS3_FILE_IO_SIZE_MIN) { @@ -5175,23 +5162,23 @@ nfs3_iosize_roundup_4KB (size_t *iosz, size_t iodef)                  iosize = GF_NFS3_FILE_IO_SIZE_MAX;          } -        *iosz = iosize; +        *ioszptr = iosize;  }  int -nfs3_init_options (struct nfs3_state *nfs3, xlator_t *nfsx) +nfs3_init_options (struct nfs3_state *nfs3, dict_t *options)  {          int      ret = -1;          char     *optstr = NULL;          uint64_t size64 = 0; -        if ((!nfs3) || (!nfsx)) +        if ((!nfs3) || (!options))                  return -1;          /* nfs3.read-size */          nfs3->readsize = GF_NFS3_RTPREF; -        if (dict_get (nfsx->options, "nfs3.read-size")) { -                ret = dict_get_str (nfsx->options, "nfs3.read-size", &optstr); +        if (dict_get (options, "nfs3.read-size")) { +                ret = dict_get_str (options, "nfs3.read-size", &optstr);                  if (ret < 0) {                          gf_log (GF_NFS3, GF_LOG_ERROR, "Failed to read "                                  " option: nfs3.read-size"); @@ -5200,20 +5187,21 @@ nfs3_init_options (struct nfs3_state *nfs3, xlator_t *nfsx)                  }                  ret = gf_string2bytesize (optstr, &size64); -                nfs3->readsize = size64;                  if (ret == -1) {                          gf_log (GF_NFS3, GF_LOG_ERROR, "Failed to format"                                  " option: nfs3.read-size");                          ret = -1;                          goto err;                  } + +                nfs3_iosize_roundup_4KB (&size64); +                nfs3->readsize = size64;          } -        nfs3_iosize_roundup_4KB (&nfs3->readsize, GF_NFS3_RTPREF);          /* nfs3.write-size */          nfs3->writesize = GF_NFS3_WTPREF; -        if (dict_get (nfsx->options, "nfs3.write-size")) { -                ret = dict_get_str (nfsx->options, "nfs3.write-size", &optstr); +        if (dict_get (options, "nfs3.write-size")) { +                ret = dict_get_str (options, "nfs3.write-size", &optstr);                  if (ret < 0) {                          gf_log (GF_NFS3, GF_LOG_ERROR, "Failed to read "                                  " option: nfs3.write-size"); @@ -5222,20 +5210,21 @@ nfs3_init_options (struct nfs3_state *nfs3, xlator_t *nfsx)                  }                  ret = gf_string2bytesize (optstr, &size64); -                nfs3->writesize = size64;                  if (ret == -1) {                          gf_log (GF_NFS3, GF_LOG_ERROR, "Failed to format"                                  " option: nfs3.write-size");                          ret = -1;                          goto err;                  } + +                nfs3_iosize_roundup_4KB (&size64); +                nfs3->writesize = size64;          } -        nfs3_iosize_roundup_4KB (&nfs3->writesize, GF_NFS3_WTPREF);          /* nfs3.readdir.size */          nfs3->readdirsize = GF_NFS3_DTPREF; -        if (dict_get (nfsx->options, "nfs3.readdir-size")) { -                ret = dict_get_str (nfsx->options,"nfs3.readdir-size", &optstr); +        if (dict_get (options, "nfs3.readdir-size")) { +                ret = dict_get_str (options,"nfs3.readdir-size", &optstr);                  if (ret < 0) {                          gf_log (GF_NFS3, GF_LOG_ERROR, "Failed to read"                                  " option: nfs3.readdir-size"); @@ -5244,16 +5233,16 @@ nfs3_init_options (struct nfs3_state *nfs3, xlator_t *nfsx)                  }                  ret = gf_string2bytesize (optstr, &size64); -                nfs3->readdirsize = size64;                  if (ret == -1) {                          gf_log (GF_NFS3, GF_LOG_ERROR, "Failed to format"                                  " option: nfs3.readdir-size");                          ret = -1;                          goto err;                  } -        } -        nfs3_iosize_roundup_4KB (&nfs3->readdirsize, GF_NFS3_DTPREF); +                nfs3_iosize_roundup_4KB (&size64); +                nfs3->readdirsize = size64; +        }          /* We want to use the size of the biggest param for the io buffer size.           */ @@ -5274,9 +5263,10 @@ err:          return ret;  } -  int -nfs3_init_subvolume_options (struct nfs3_state *nfs3, struct nfs3_export *exp) +nfs3_init_subvolume_options (xlator_t *nfsx, +                             struct nfs3_export *exp, +                             dict_t *options)  {          int             ret = -1;          char            *optstr = NULL; @@ -5284,14 +5274,20 @@ nfs3_init_subvolume_options (struct nfs3_state *nfs3, struct nfs3_export *exp)          char            *name = NULL;          gf_boolean_t    boolt = _gf_false;          uuid_t          volumeid = {0, }; -        dict_t          *options = NULL; -        if ((!exp) || (!nfs3)) +        if ((!nfsx) || (!exp))                  return -1; -        options = nfs3->nfsx->options; +        /* For init, fetch options from xlator but for +         * reconfigure, take the parameter */ +        if (!options) +                options = nfsx->options; + +        if (!options) +                return (-1); +          uuid_clear (volumeid); -        if (gf_nfs_dvm_off (nfs_state (nfs3->nfsx))) +        if (gf_nfs_dvm_off (nfs_state (nfsx)))                  goto no_dvm;          ret = snprintf (searchkey, 1024, "nfs3.%s.volume-id",exp->subvol->name); @@ -5457,7 +5453,7 @@ nfs3_init_subvolume (struct nfs3_state *nfs3, xlator_t *subvol)          INIT_LIST_HEAD (&exp->explist);          gf_log (GF_NFS3, GF_LOG_TRACE, "Initing state: %s", exp->subvol->name); -        ret = nfs3_init_subvolume_options (nfs3, exp); +        ret = nfs3_init_subvolume_options (nfs3->nfsx, exp, NULL);          if (ret == -1) {                  gf_log (GF_NFS3, GF_LOG_ERROR, "Failed to init subvol");                  goto exp_free; @@ -5522,7 +5518,7 @@ nfs3_init_state (xlator_t *nfsx)          }          nfs = nfsx->private; -        ret = nfs3_init_options (nfs3, nfsx); +        ret = nfs3_init_options (nfs3, nfsx->options);          if (ret == -1) {                  gf_log (GF_NFS3, GF_LOG_ERROR, "Failed to init options");                  goto ret; @@ -5596,4 +5592,39 @@ nfs3svc_init (xlator_t *nfsx)          return &nfs3prog;  } +int +nfs3_reconfigure_state (xlator_t *nfsx, dict_t *options) +{ +        int                   ret   = -1; +        struct nfs3_export    *exp  = NULL; +        struct nfs_state      *nfs  = NULL; +        struct nfs3_state     *nfs3 = NULL; + +        if ((!nfsx) || (!nfsx->private) || (!options)) +                goto out; + +        nfs = (struct nfs_state *)nfsx->private; +        nfs3 = nfs->nfs3state; +        if (!nfs3) +                goto out; + +        ret = nfs3_init_options (nfs3, options); +        if (ret) { +                gf_log (GF_NFS3, GF_LOG_ERROR, +                        "Failed to reconfigure options"); +                goto out; +        } + +        list_for_each_entry (exp, &nfs3->exports, explist) { +                ret = nfs3_init_subvolume_options (nfsx, exp, options); +                if (ret) { +                        gf_log (GF_NFS3, GF_LOG_ERROR, +                                "Failed to reconfigure subvol options"); +                        goto out; +                } +        } +        ret = 0; +out: +        return ret; +}  | 
