27 Sep, 2016

1 commit

  • By design notifier can be registered once only, however nfsd registers
    the same inetaddr notifiers per net-namespace. When this happen it
    corrupts list of notifiers, as result some notifiers can be not called
    on proper event, traverse on list can be cycled forever, and second
    unregister can access already freed memory.

    Cc: stable@vger.kernel.org
    fixes: 36684996 ("nfsd: Register callbacks on the inetaddr_chain and inet6addr_chain")
    Signed-off-by: Vasily Averin
    Reviewed-by: Jeff Layton
    Cc: stable@vger.kernel.org
    Signed-off-by: J. Bruce Fields

    Vasily Averin
     

07 Jan, 2016

1 commit

  • Stefan Hajnoczi reports,
    nfsd leaks 3 references to the sunrpc module here:

    # echo -n "asdf 1234" >/proc/fs/nfsd/portlist
    bash: echo: write error: Protocol not supported

    Now stop nfsd and try unloading the kernel modules:

    # systemctl stop nfs-server
    # systemctl stop nfs
    # systemctl stop proc-fs-nfsd.mount
    # systemctl stop var-lib-nfs-rpc_pipefs.mount
    # rmmod nfsd
    # rmmod nfs_acl
    # rmmod lockd
    # rmmod auth_rpcgss
    # rmmod sunrpc
    rmmod: ERROR: Module sunrpc is in use
    # lsmod | grep rpc
    sunrpc 315392 3

    It is caused by nfsd don't cleanup rpcb program for nfsd
    when destroying svc service after creating xprt fail.

    Reported-by: Stefan Hajnoczi
    Signed-off-by: Kinglong Mee
    Signed-off-by: J. Bruce Fields

    Kinglong Mee
     

23 Dec, 2015

1 commit


11 Aug, 2015

5 commits


10 Feb, 2015

1 commit


10 Dec, 2014

1 commit


02 Aug, 2014

1 commit

  • A memory allocation failure could cause nfsd_startup_generic to fail, in
    which case nfsd_users wouldn't be incorrectly left elevated.

    After nfsd restarts nfsd_startup_generic will then succeed without doing
    anything--the first consequence is likely nfs4_start_net finding a bad
    laundry_wq and crashing.

    Signed-off-by: Kinglong Mee
    Fixes: 4539f14981ce "nfsd: replace boolean nfsd_up flag by users counter"
    Cc: stable@vger.kernel.org
    Signed-off-by: J. Bruce Fields

    Kinglong Mee
     

09 Jul, 2014

1 commit

  • Currently, the maximum number of connections that nfsd will allow
    is based on the number of threads spawned. While this is fine for a
    default, there really isn't a clear relationship between the two.

    The number of threads corresponds to the number of concurrent requests
    that we want to allow the server to process at any given time. The
    connection limit corresponds to the maximum number of clients that we
    want to allow the server to handle. These are two entirely different
    quantities.

    Break the dependency on increasing threads in order to allow for more
    connections, by adding a new per-net parameter that can be set to a
    non-zero value. The default is still to base it on the number of threads,
    so there should be no behavior change for anyone who doesn't use it.

    Cc: Trond Myklebust
    Signed-off-by: Jeff Layton
    Signed-off-by: J. Bruce Fields

    Jeff Layton
     

23 Jun, 2014

1 commit


23 May, 2014

1 commit

  • PF_LESS_THROTTLE has a very specific use case: to avoid deadlocks
    and live-locks while writing to the page cache in a loop-back
    NFS mount situation.

    It therefore makes sense to *only* set PF_LESS_THROTTLE in this
    situation.
    We now know when a request came from the local-host so it could be a
    loop-back mount. We already know when we are handling write requests,
    and when we are doing anything else.

    So combine those two to allow nfsd to still be throttled (like any
    other process) in every situation except when it is known to be
    problematic.

    Signed-off-by: NeilBrown
    Signed-off-by: J. Bruce Fields

    NeilBrown
     

07 Jan, 2014

1 commit

  • Without CONFIG_NFSD_V3, compile will get warning as,

    fs/nfsd/nfssvc.c: In function 'nfsd_svc':
    >> fs/nfsd/nfssvc.c:246:60: warning: array subscript is above array bounds [-Warray-bounds]
    return (nfsd_versions[2] != NULL) || (nfsd_versions[3] != NULL);
    ^

    Reported-by: kbuild test robot
    Signed-off-by: Kinglong Mee
    Signed-off-by: J. Bruce Fields

    Kinglong Mee
     

04 Jan, 2014

1 commit


13 Jul, 2013

1 commit

  • You can turn on or off support for minorversions using e.g.

    echo "-4.2" >/proc/fs/nfsd/versions

    However, the current implementation is a little wonky. For example, the
    above will turn off 4.2 support, but it will also turn *on* 4.1 support.

    This didn't matter as long as we only had 2 minorversions, which was
    true till very recently.

    And do a little cleanup here.

    Signed-off-by: J. Bruce Fields

    J. Bruce Fields
     

09 Jul, 2013

1 commit


01 Mar, 2013

1 commit

  • Pull nfsd changes from J Bruce Fields:
    "Miscellaneous bugfixes, plus:

    - An overhaul of the DRC cache by Jeff Layton. The main effect is
    just to make it larger. This decreases the chances of intermittent
    errors especially in the UDP case. But we'll need to watch for any
    reports of performance regressions.

    - Containerized nfsd: with some limitations, we now support
    per-container nfs-service, thanks to extensive work from Stanislav
    Kinsbursky over the last year."

    Some notes about conflicts, since there were *two* non-data semantic
    conflicts here:

    - idr_remove_all() had been added by a memory leak fix, but has since
    become deprecated since idr_destroy() does it for us now.

    - xs_local_connect() had been added by this branch to make AF_LOCAL
    connections be synchronous, but in the meantime Trond had changed the
    calling convention in order to avoid a RCU dereference.

    There were a couple of more obvious actual source-level conflicts due to
    the hlist traversal changes and one just due to code changes next to
    each other, but those were trivial.

    * 'for-3.9' of git://linux-nfs.org/~bfields/linux: (49 commits)
    SUNRPC: make AF_LOCAL connect synchronous
    nfsd: fix compiler warning about ambiguous types in nfsd_cache_csum
    svcrpc: fix rpc server shutdown races
    svcrpc: make svc_age_temp_xprts enqueue under sv_lock
    lockd: nlmclnt_reclaim(): avoid stack overflow
    nfsd: enable NFSv4 state in containers
    nfsd: disable usermode helper client tracker in container
    nfsd: use proper net while reading "exports" file
    nfsd: containerize NFSd filesystem
    nfsd: fix comments on nfsd_cache_lookup
    SUNRPC: move cache_detail->cache_request callback call to cache_read()
    SUNRPC: remove "cache_request" argument in sunrpc_cache_pipe_upcall() function
    SUNRPC: rework cache upcall logic
    SUNRPC: introduce cache_detail->cache_request callback
    NFS: simplify and clean cache library
    NFS: use SUNRPC cache creation and destruction helper for DNS cache
    nfsd4: free_stid can be static
    nfsd: keep a checksum of the first 256 bytes of request
    sunrpc: trim off trailing checksum before returning decrypted or integrity authenticated buffer
    sunrpc: fix comment in struct xdr_buf definition
    ...

    Linus Torvalds
     

24 Feb, 2013

1 commit


16 Feb, 2013

1 commit

  • This patch makes NFSD file system superblock to be created per net.
    This makes possible to get proper network namespace from superblock instead of
    using hard-coded "init_net".

    Note: NFSd fs super-block holds network namespace. This garantees, that
    network namespace won't disappear from underneath of it.
    This, obviously, means, that in case of kill of a container's "init" (which is not a mount
    namespace, but network namespace creator) netowrk namespace won't be
    destroyed.

    Signed-off-by: Stanislav Kinsbursky
    Signed-off-by: J. Bruce Fields

    Stanislav Kinsbursky
     

04 Feb, 2013

1 commit


11 Dec, 2012

15 commits

  • Since NFSd service is per-net now, we have to pass proper network
    context in nfsd_shutdown() from NFSd kthreads.

    The simplest way I found is to get proper net from one of transports
    with permanent sockets.

    Signed-off-by: Stanislav Kinsbursky
    Signed-off-by: J. Bruce Fields

    Stanislav Kinsbursky
     
  • Function nfsd_shutdown is called from two places: nfsd_last_thread (when last
    kernel thread is exiting) and nfsd_svc (in case of kthreads starting error).
    When calling from nfsd_svc(), we can be sure that per-net resources are
    allocated, so we don't need to check per-net nfsd_net_up boolean flag.
    This allows us to remove nfsd_shutdown function at all and move check for
    per-net nfsd_net_up boolean flag to nfsd_last_thread.

    Signed-off-by: Stanislav Kinsbursky
    Signed-off-by: J. Bruce Fields

    Stanislav Kinsbursky
     
  • Since we have generic NFSd resurces, we have to introduce some way how to
    allocate and destroy those resources on first per-net NFSd start and on
    last per-net NFSd stop respectively.
    This patch replaces global boolean nfsd_up flag (which is unused now) by users
    counter and use it to determine either we need to allocate generic resources
    or destroy them.

    Signed-off-by: Stanislav Kinsbursky
    Signed-off-by: J. Bruce Fields

    Stanislav Kinsbursky
     
  • This patch moves nfsd_startup_generic() and nfsd_shutdown_generic()
    calls to nfsd_startup_net() and nfsd_shutdown_net() respectively, which
    allows us to call nfsd_startup_net() instead of nfsd_startup() and makes
    the code look clearer. It also modifies nfsd_svc() and nfsd_shutdown()
    to check nn->nfsd_net_up instead of global nfsd_up. The latter is now
    used only for generic resources shutdown and is currently useless. It
    will replaced by NFSd users counter later in this series.

    Signed-off-by: Stanislav Kinsbursky
    Signed-off-by: J. Bruce Fields

    Stanislav Kinsbursky
     
  • NFSd have per-net resources and resources, used globally.
    Let's move generic resources init and shutdown to separated functions since
    they are going to be allocated on first NFSd service start and destroyed after
    last NFSd service shutdown.

    Signed-off-by: Stanislav Kinsbursky
    Signed-off-by: J. Bruce Fields

    Stanislav Kinsbursky
     
  • This patch makes main step in NFSd containerisation.

    There could be different approaches to how to make NFSd able to handle
    incoming RPC request from different network namespaces. The two main
    options are:

    1) Share NFSd kthreads betwween all network namespaces.
    2) Create separated pool of threads for each namespace.

    While first approach looks more flexible, second one is simpler and
    non-racy. This patch implements the second option.

    To make it possible to allocate separate pools of threads, we have to
    make it possible to allocate separate NFSd service structures per net.

    Signed-off-by: Stanislav Kinsbursky
    Signed-off-by: J. Bruce Fields

    Stanislav Kinsbursky
     
  • This is simple: an NFSd service can be started at different times in
    different network environments. So, its "boot time" has to be assigned
    per net.

    Signed-off-by: Stanislav Kinsbursky
    Signed-off-by: J. Bruce Fields

    Stanislav Kinsbursky
     
  • This patch introduces introduces per-net "nfsd_net_up" boolean flag, which has
    the same purpose as general "nfsd_up" flag - skip init or shutdown of per-net
    resources in case of they are inited on shutted down respectively.

    Signed-off-by: Stanislav Kinsbursky
    Signed-off-by: J. Bruce Fields

    Stanislav Kinsbursky
     
  • NFSd resources are partially per-net and partially globally used.
    This patch splits resources init and shutdown and moves per-net code to
    separated functions.
    Generic and per-net init and shutdown are called sequentially for a while.

    Signed-off-by: Stanislav Kinsbursky
    Signed-off-by: J. Bruce Fields

    Stanislav Kinsbursky
     
  • Precursor patch. Hard-coded "init_net" will be replaced by proper one in
    future.

    Signed-off-by: Stanislav Kinsbursky
    Signed-off-by: J. Bruce Fields

    Stanislav Kinsbursky
     
  • Precursor patch. Hard-coded "init_net" will be replaced by proper one in
    future.

    Signed-off-by: Stanislav Kinsbursky
    Signed-off-by: J. Bruce Fields

    Stanislav Kinsbursky
     
  • Precursor patch. Hard-coded "init_net" will be replaced by proper one in
    future.

    Signed-off-by: Stanislav Kinsbursky
    Signed-off-by: J. Bruce Fields

    Stanislav Kinsbursky
     
  • Precursor patch. Hard-coded "init_net" will be replaced by proper one in
    future.

    Signed-off-by: Stanislav Kinsbursky
    Signed-off-by: J. Bruce Fields

    Stanislav Kinsbursky
     
  • Precursor patch. Hard-coded "init_net" will be replaced by proper one in
    future.

    Signed-off-by: Stanislav Kinsbursky
    Signed-off-by: J. Bruce Fields

    Stanislav Kinsbursky
     
  • There could be a situation, when NFSd was started in one network namespace, but
    stopped in another one.
    This will trigger kernel panic, because RPCBIND client is stored on per-net
    NFSd data, and will be NULL on NFSd shutdown.

    Signed-off-by: Stanislav Kinsbursky
    Signed-off-by: J. Bruce Fields

    Stanislav Kinsbursky
     

28 Nov, 2012

1 commit

  • Split NFSv4 state init and shutdown into two different calls: per-net one and
    generic one.
    Per-net cwinit/shutdown pair have to be called for any namespace, generic pair
    - only once on NSFd kthreads start and shutdown respectively.

    Refresh of diff-nfsd-call-state-init-twice

    Signed-off-by: J. Bruce Fields

    Stanislav Kinsbursky
     

26 Nov, 2012

1 commit

  • Very embarassing: 1091006c5eb15cba56785bd5b498a8d0b9546903 "nfsd: turn
    on reply cache for NFSv4" missed a line, effectively leaving the reply
    cache off in the v4 case. I thought I'd tested that, but I guess not.

    This time, wrote a pynfs test to confirm it works.

    Cc: stable@vger.kernel.org
    Signed-off-by: J. Bruce Fields

    J. Bruce Fields
     

22 Aug, 2012

1 commit