• NeilBrown's avatar
    NFSD: further refinement of content of /proc/fs/nfsd/versions · abcb4dac
    NeilBrown authored
    Prior to
      e35659f1 ("NFSD: correctly range-check v4.x minor version when setting versions.")
    
    v4.0 could not be disabled without disabling all NFSv4 protocols.
    So the 'versions' file contained ±4 ±4.1 ±4.2.
    Writing "-4" would disable all v4 completely.  Writing +4 would enabled those
    minor versions that are currently enabled, either by default or otherwise.
    
    After that commit, it was possible to disable v4.0 independently.  To
    maximize backward compatibility with use cases which never disabled
    v4.0, the "versions" file would never contain "+4.0" - that was implied
    by "+4", unless explicitly negated by "-4.0".
    
    This introduced an inconsistency in that it was possible to disable all
    minor versions, but still have the major version advertised.
    e.g. "-4.0 -4.1 -4.2 +4" would result in NFSv4 support being advertised,
    but all attempts to use it rejected.
    
    Commit
      d3635ff0 ("nfsd: fix configuration of supported minor versions")
    
    and following removed this inconsistency. If all minor version were disabled,
    the major would be disabled too.  If any minor was enabled, the major would be
    disabled.
    This patch also treated "+4" as equivalent to "+4.0" and "-4" as "-4.0".
    A consequence of this is that writing "-4" would only disable 4.0.
    This is a regression against the earlier behaviour, in a use case that rpc.nfsd
    actually uses.
    The command "rpc.nfsd -N 4" will write "+2 +3 -4" to the versions files.
    Previously, that would disable v4 completely.  Now it will only disable v4.0.
    
    Also "4.0" never appears in the "versions" file when read.
    So if only v4.1 is available, the previous kernel would have reported
    "+4 -4.0 +4.1 -4.2"  the current kernel reports "-4 +4.1 -4.2" which
    could easily confuse.
    
    This patch restores the implication that "+4" and "-4" apply more
    globals and do not imply "4.0".
    Specifically:
     writing "-4" will disable all 4.x minor versions.
     writing "+4" will enable all 4.1 minor version if none are currently enabled.
        rpc.nfsd will list minor versions before major versions, so
          rpc.nfsd -V 4.2 -N 4.1
        will write "-4.1 +4.2 +2 +3 +4"
        so it would be a regression for "+4" to enable always all versions.
     reading "-4" implies that no v4.x are enabled
     reading "+4" implies that some v4.x are enabled, and that v4.0 is enabled unless
     "-4.0" is also present.  All other minor versions will explicitly be listed.
    Signed-off-by: default avatarNeilBrown <neilb@suse.com>
    Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
    abcb4dac
nfsctl.c 33.5 KB