Commit Graph

648 Commits

Author SHA1 Message Date
Benjamin Coddington 7f4bed5dab NLM/NFSD: Fix lock notifications for async-capable filesystems
JIRA: https://issues.redhat.com/browse/RHEL-94440
Conflicts: slight diff here as local var fl_flags has not been renamed by
	60f3154d196b nfsd: convert to using new filelock helpers

commit 7e64c5bc497cf17872b38003307f320e8f077880
Author: Benjamin Coddington <bcodding@redhat.com>
Date:   Wed Sep 11 15:42:59 2024 -0400

    NLM/NFSD: Fix lock notifications for async-capable filesystems

    Instead of checking just the exportfs flag, use the new
    locks_can_async_lock() helper which allows NLM and NFSD to once again
    support lock notifications for all filesystems which use posix_lock_file().

    Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
    Link: https://lore.kernel.org/r/865c40da44af67939e8eb560d17a26c9c50f23e0.1726083391.git.bcodding@redhat.com
    Reviewed-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: Christian Brauner <brauner@kernel.org>

Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
2025-07-11 07:21:56 -04:00
Benjamin Coddington bda34249d2 filelock: move file locking definitions to separate header file
JIRA: https://issues.redhat.com/browse/RHEL-94440
Conflicts: fs/{cifs => smb/client} move already happened, so update includes
	there instead.  We don't have ksmbd, so drop those changes.  Slight context
	diff in fs/nfsd/netns.h.  Also don't have "a75d30c77207 fs/locks: pass
	kernel struct flock to fcntl_getlk/setlk" which removes __user deco.

commit 5970e15dbcfeb0ed3a0bf1954f35bbe60a048754
Author: Jeff Layton <jlayton@kernel.org>
Date:   Sun Nov 20 09:15:34 2022 -0500

    filelock: move file locking definitions to separate header file

    The file locking definitions have lived in fs.h since the dawn of time,
    but they are only used by a small subset of the source files that
    include it.

    Move the file locking definitions to a new header file, and add the
    appropriate #include directives to the source files that need them. By
    doing this we trim down fs.h a bit and limit the amount of rebuilding
    that has to be done when we make changes to the file locking APIs.

    Reviewed-by: Xiubo Li <xiubli@redhat.com>
    Reviewed-by: Christian Brauner (Microsoft) <brauner@kernel.org>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Reviewed-by: David Howells <dhowells@redhat.com>
    Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
    Acked-by: Chuck Lever <chuck.lever@oracle.com>
    Acked-by: Joseph Qi <joseph.qi@linux.alibaba.com>
    Acked-by: Steve French <stfrench@microsoft.com>
    Acked-by: Al Viro <viro@zeniv.linux.org.uk>
    Acked-by: Darrick J. Wong <djwong@kernel.org>
    Signed-off-by: Jeff Layton <jlayton@kernel.org>

Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
2025-07-11 07:21:33 -04:00
Benjamin Coddington a969c35f28 lockd: define nlm_port_min,max with CONFIG_SYSCTL
JIRA: https://issues.redhat.com/browse/RHEL-73723

commit fc412a6196a6f46ece0e6e6b118556464f165800
Author: Tom Rix <trix@redhat.com>
Date:   Tue May 2 14:07:13 2023 -0400

    lockd: define nlm_port_min,max with CONFIG_SYSCTL

    gcc with W=1 and ! CONFIG_SYSCTL
    fs/lockd/svc.c:80:51: error: ‘nlm_port_max’ defined but not used [-Werror=unused-const-variable=]
       80 | static const int                nlm_port_min = 0, nlm_port_max = 65535;
          |                                                   ^~~~~~~~~~~~
    fs/lockd/svc.c:80:33: error: ‘nlm_port_min’ defined but not used [-Werror=unused-const-variable=]
       80 | static const int                nlm_port_min = 0, nlm_port_max = 65535;
          |                                 ^~~~~~~~~~~~

    The only use of these variables is when CONFIG_SYSCTL
    is defined, so their definition should be likewise conditional.

    Signed-off-by: Tom Rix <trix@redhat.com>
    Reviewed-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
2025-01-31 06:45:51 -05:00
Scott Mayhew e3a332ab94 lockd: Use *-y instead of *-objs in Makefile
JIRA: https://issues.redhat.com/browse/RHEL-59704

commit e5d85ec52b1158ea6ea4834e5372bd7ba5862ffa
Author: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Date:   Wed May 8 18:19:38 2024 +0300

    lockd: Use *-y instead of *-objs in Makefile

    *-objs suffix is reserved rather for (user-space) host programs while
    usually *-y suffix is used for kernel drivers (although *-objs works
    for that purpose for now).

    Let's correct the old usages of *-objs in Makefiles.

    Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Reviewed-by: Benjamin Coddington <bcodding@redhat.com>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Scott Mayhew <smayhew@redhat.com>
2024-11-05 07:34:03 -05:00
Scott Mayhew 411a1fe5be lockd: host: Remove unnecessary statements'host = NULL;'
JIRA: https://issues.redhat.com/browse/RHEL-59704

commit 03b0036f452d244b6bfeab3973e9e57e8eac9c04
Author: Li kunyu <kunyu@nfschina.com>
Date:   Wed Apr 17 16:28:07 2024 +0800

    lockd: host: Remove unnecessary statements'host = NULL;'

    In 'nlm_alloc_host', the host has already been assigned a value of NULL
    when defined, so 'host=NULL;' Can be deleted.

    Signed-off-by: Li kunyu <kunyu@nfschina.com>
    Reviewed-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Scott Mayhew <smayhew@redhat.com>
2024-10-25 12:36:14 -04:00
Scott Mayhew d1b4119938 nfsd: stop setting ->pg_stats for unused stats
JIRA: https://issues.redhat.com/browse/RHEL-59704

commit a2214ed588fb3c5b9824a21cff870482510372bb
Author: Josef Bacik <josef@toxicpanda.com>
Date:   Fri Jan 26 10:39:41 2024 -0500

    nfsd: stop setting ->pg_stats for unused stats

    A lot of places are setting a blank svc_stats in ->pg_stats and never
    utilizing these stats.  Remove all of these extra structs as we're not
    reporting these stats anywhere.

    Signed-off-by: Josef Bacik <josef@toxicpanda.com>
    Reviewed-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Scott Mayhew <smayhew@redhat.com>
2024-10-25 12:35:53 -04:00
Scott Mayhew 196111a579 SUNRPC: change how svc threads are asked to exit.
JIRA: https://issues.redhat.com/browse/RHEL-59704
Conflicts:
	include/linux/sunrpc/svc.h: Context diff due to out of order backport
	of 3587b5c75376 ("SUNRPC: Remove RQ_SPLICE_OK").
	net/sunrpc/svc.c: Context and code diff due to out of order backport
	of 1e3577a4521e ("SUNRPC: discard sv_refcnt, and svc_get/svc_put").
	net/sunrpc/svc_xprt.c: Context diff due to RHEL-only commit
	d654df46f8 ("sunrpc: have svc tasks sleep in TASK_INTERRUPTIBLE
	instead of TASK_IDLE").

commit fa341560ca7458f4396d5a0771cb5f2358d8535d
Author: NeilBrown <neilb@suse.de>
Date:   Mon Sep 11 10:39:04 2023 -0400

    SUNRPC: change how svc threads are asked to exit.

    svc threads are currently stopped using kthread_stop().  This requires
    identifying a specific thread.  However we don't care which thread
    stops, just as long as one does.

    So instead, set a flag in the svc_pool to say that a thread needs to
    die, and have each thread check this flag instead of calling
    kthread_should_stop().  The first thread to find and clear this flag
    then moves towards exiting.

    This removes an explicit dependency on sp_all_threads which will make a
    future patch simpler.

    Signed-off-by: NeilBrown <neilb@suse.de>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Scott Mayhew <smayhew@redhat.com>
2024-10-25 12:35:46 -04:00
Benjamin Coddington 9c9cb3b8d6 SUNRPC: discard sv_refcnt, and svc_get/svc_put
JIRA: https://issues.redhat.com/browse/RHEL-34875
Conflicts: We have another diff here due to not taking the lockless
server thread queueing patches, this time we don't remove the additional
comment in svc_exit_thread() that would have been added by that work.

commit 1e3577a4521ef33199eea05ce7b9099825848c49
Author: NeilBrown <neilb@suse.de>
Date:   Fri Dec 15 11:56:34 2023 +1100

    SUNRPC: discard sv_refcnt, and svc_get/svc_put

    sv_refcnt is no longer useful.
    lockd and nfs-cb only ever have the svc active when there are a non-zero
    number of threads, so sv_refcnt mirrors sv_nrthreads.

    nfsd also keeps the svc active between when a socket is added and when
    the first thread is started, but we don't really need a refcount for
    that.  We can simply not destroy the svc while there are any permanent
    sockets attached.

    So remove sv_refcnt and the get/put functions.
    Instead of a final call to svc_put(), call svc_destroy() instead.
    This is changed to also store NULL in the passed-in pointer to make it
    easier to avoid use-after-free situations.

    Signed-off-by: NeilBrown <neilb@suse.de>
    Reviewed-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
2024-06-27 08:14:42 -04:00
Benjamin Coddington 8d35740846 lockd: hold a reference to nlmsvc_serv while stopping the thread.
JIRA: https://issues.redhat.com/browse/RHEL-34875

commit f4578ba11c4a211d45877babe56c84d922301576
Author: NeilBrown <neilb@suse.de>
Date:   Wed Oct 11 09:31:22 2023 +1100

    lockd: hold a reference to nlmsvc_serv while stopping the thread.

    Both nfsd and nfsv4-callback take a temporary reference to the svc_serv
    while calling svc_set_num_threads() to stop the last thread.  lockd does
    not.

    This extra reference prevents the scv_serv from being freed when the
    last thread drops its reference count.  This is not currently needed
    for lockd as the svc_serv is not accessed after the last thread is told
    to exit.

    However a future patch will require svc_exit_thread() to access the
    svc_serv after the svc_put() so it will need the code that calls
    svc_set_num_threads() to keep a reference and keep the svc_serv active.

    So copy the pattern from nfsd and nfsv4-cb to lockd, and take a
    reference around svc_set_num_threads(.., 0)

    Reviewed-by: Jeff Layton <jlayton@kernel.org>
    Tested-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: NeilBrown <neilb@suse.de>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
2024-06-27 08:14:04 -04:00
Benjamin Coddington 601594e5de lockd: fix race in async lock request handling
JIRA: https://issues.redhat.com/browse/RHEL-34875

commit afb13302aa664170684c76b0c12ece37b4e91d12
Author: Alexander Aring <aahringo@redhat.com>
Date:   Tue Sep 12 17:53:20 2023 -0400

    lockd: fix race in async lock request handling

    This patch fixes a race in async lock request handling between adding
    the relevant struct nlm_block to nlm_blocked list after the request was
    sent by vfs_lock_file() and nlmsvc_grant_deferred() does a lookup of the
    nlm_block in the nlm_blocked list. It could be that the async request is
    completed before the nlm_block was added to the list. This would end
    in a -ENOENT and a kernel log message of "lockd: grant for unknown
    block".

    To solve this issue we add the nlm_block before the vfs_lock_file() call
    to be sure it has been added when a possible nlmsvc_grant_deferred() is
    called. If the vfs_lock_file() results in an case when it wouldn't be
    added to nlm_blocked list, the nlm_block struct will be removed from
    this list again.

    Reviewed-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: Alexander Aring <aahringo@redhat.com>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
2024-06-27 08:14:03 -04:00
Benjamin Coddington 3443e20370 lockd: don't call vfs_lock_file() for pending requests
JIRA: https://issues.redhat.com/browse/RHEL-34875

commit b743612c0aaa49a781f1f0c760e35d7298b5c5b4
Author: Alexander Aring <aahringo@redhat.com>
Date:   Tue Sep 12 17:53:19 2023 -0400

    lockd: don't call vfs_lock_file() for pending requests

    This patch returns nlm_lck_blocked in nlmsvc_lock() when an asynchronous
    lock request is pending. During testing I ran into the case with the
    side-effects that lockd is waiting for only one lm_grant() callback
    because it's already part of the nlm_blocked list. If another
    asynchronous for the same nlm_block is triggered two lm_grant()
    callbacks will occur but lockd was only waiting for one.

    To avoid any change of existing users this handling will only being made
    when export_op_support_safe_async_lock() returns true.

    Reviewed-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: Alexander Aring <aahringo@redhat.com>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
2024-06-27 08:14:03 -04:00
Benjamin Coddington ccf6487e6e lockd: introduce safe async lock op
JIRA: https://issues.redhat.com/browse/RHEL-34875

commit 2dd10de8e6bcbacf85ad758b904543c294820c63
Author: Alexander Aring <aahringo@redhat.com>
Date:   Tue Sep 12 17:53:18 2023 -0400

    lockd: introduce safe async lock op

    This patch reverts mostly commit 40595cdc93ed ("nfs: block notification
    on fs with its own ->lock") and introduces an EXPORT_OP_ASYNC_LOCK
    export flag to signal that the "own ->lock" implementation supports
    async lock requests. The only main user is DLM that is used by GFS2 and
    OCFS2 filesystem. Those implement their own lock() implementation and
    return FILE_LOCK_DEFERRED as return value. Since commit 40595cdc93ed
    ("nfs: block notification on fs with its own ->lock") the DLM
    implementation were never updated. This patch should prepare for DLM
    to set the EXPORT_OP_ASYNC_LOCK export flag and update the DLM
    plock implementation regarding to it.

    Acked-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: Alexander Aring <aahringo@redhat.com>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
2024-06-27 08:14:02 -04:00
Andrew Halaney 16b2a9a32a sysctl: fix proc_dobool() usability
JIRA: https://issues.redhat.com/browse/RHEL-24205
Conflicts: Conflict due to missing cb55f27ac932
           ("fs/proc: Introduce list_for_each_table_entry for proc sysctl")

commit f1aa2eb5ea05ccd1fd92d235346e60e90a1ed949
Author: Ondrej Mosnacek <omosnace@redhat.com>
Date:   Fri Feb 10 15:58:23 2023 +0100

    sysctl: fix proc_dobool() usability

    Currently proc_dobool expects a (bool *) in table->data, but sizeof(int)
    in table->maxsize, because it uses do_proc_dointvec() directly.

    This is unsafe for at least two reasons:
    1. A sysctl table definition may use { .data = &variable, .maxsize =
       sizeof(variable) }, not realizing that this makes the sysctl unusable
       (see the Fixes: tag) and that they need to use the completely
       counterintuitive sizeof(int) instead.
    2. proc_dobool() will currently try to parse an array of values if given
       .maxsize >= 2*sizeof(int), but will try to write values of type bool
       by offsets of sizeof(int), so it will not work correctly with neither
       an (int *) nor a (bool *). There is no .maxsize validation to prevent
       this.

    Fix this by:
    1. Constraining proc_dobool() to allow only one value and .maxsize ==
       sizeof(bool).
    2. Wrapping the original struct ctl_table in a temporary one with .data
       pointing to a local int variable and .maxsize set to sizeof(int) and
       passing this one to proc_dointvec(), converting the value to/from
       bool as needed (using proc_dou8vec_minmax() as an example).
    3. Extending sysctl_check_table() to enforce proc_dobool() expectations.
    4. Fixing the proc_dobool() docstring (it was just copy-pasted from
       proc_douintvec, apparently...).
    5. Converting all existing proc_dobool() users to set .maxsize to
       sizeof(bool) instead of sizeof(int).

    Fixes: 83efeeeb3d04 ("tty: Allow TIOCSTI to be disabled")
    Fixes: a2071573d634 ("sysctl: introduce new proc handler proc_dobool")
    Signed-off-by: Ondrej Mosnacek <omosnace@redhat.com>
    Acked-by: Kees Cook <keescook@chromium.org>
    Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>

Signed-off-by: Andrew Halaney <ahalaney@redhat.com>
2024-05-09 11:25:32 -04:00
Jeffrey Layton 2de5b23ab1 SUNRPC: Add enum svc_auth_status
JIRA: https://issues.redhat.com/browse/RHEL-7936

commit 78c542f916bccafffef4f3bec9bc60d7cda548f5
Author: Chuck Lever <chuck.lever@oracle.com>
Date:   Sat Jul 29 20:58:54 2023 -0400

    SUNRPC: Add enum svc_auth_status

    In addition to the benefits of using an enum rather than a set of
    macros, we now have a named type that can improve static type
    checking of function return values.

    As part of this change, I removed a stale comment from svcauth.h;
    the return values from current implementations of the
    auth_ops::release method are all zero/negative errno, not the SVC_OK
    enum values as the old comment suggested.

    Suggested-by: NeilBrown <neilb@suse.de>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Jeffrey Layton <jlayton@redhat.com>
2023-12-02 05:12:41 -05:00
Jeffrey Layton 471e9b18b5 SUNRPC: remove timeout arg from svc_recv()
JIRA: https://issues.redhat.com/browse/RHEL-7936

commit c743b4259c3af2c0637c307f08a062d25fa3c99f
Author: NeilBrown <neilb@suse.de>
Date:   Tue Jul 18 16:38:08 2023 +1000

    SUNRPC: remove timeout arg from svc_recv()

    Most svc threads have no interest in a timeout.
    nfsd sets it to 1 hour, but this is a wart of no significance.

    lockd uses the timeout so that it can call nlmsvc_retry_blocked().
    It also sometimes calls svc_wake_up() to ensure this is called.

    So change lockd to be consistent and always use svc_wake_up() to trigger
    nlmsvc_retry_blocked() - using a timer instead of a timeout to
    svc_recv().

    And change svc_recv() to not take a timeout arg.

    This makes the sp_threads_timedout counter always zero.

    Signed-off-by: NeilBrown <neilb@suse.de>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Jeffrey Layton <jlayton@redhat.com>
2023-12-02 05:12:41 -05:00
Jeffrey Layton 1dc34a2dea SUNRPC: change svc_recv() to return void.
JIRA: https://issues.redhat.com/browse/RHEL-7936

commit 7b719e2bf342a59e88b2b6215b98ca4cf824bc58
Author: NeilBrown <neilb@suse.de>
Date:   Tue Jul 18 16:38:08 2023 +1000

    SUNRPC: change svc_recv() to return void.

    svc_recv() currently returns a 0 on success or one of two errors:
     - -EAGAIN means no message was successfully received
     - -EINTR means the thread has been told to stop

    Previously nfsd would stop as the result of a signal as well as
    following kthread_stop().  In that case the difference was useful: EINTR
    means stop unconditionally.  EAGAIN means stop if kthread_should_stop(),
    continue otherwise.

    Now threads only exit when kthread_should_stop() so we don't need the
    distinction.

    Signed-off-by: NeilBrown <neilb@suse.de>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Jeffrey Layton <jlayton@redhat.com>
2023-12-02 05:12:41 -05:00
Jeffrey Layton 424ef2f7ea SUNRPC: call svc_process() from svc_recv().
JIRA: https://issues.redhat.com/browse/RHEL-7936

commit f78116d3bf4fd7a84451e1a2adc35df7a63fbbf4
Author: NeilBrown <neilb@suse.de>
Date:   Tue Jul 18 16:38:08 2023 +1000

    SUNRPC: call svc_process() from svc_recv().

    All callers of svc_recv() go on to call svc_process() on success.
    Simplify callers by having svc_recv() do that for them.

    This loses one call to validate_process_creds() in nfsd.  That was
    debugging code added 14 years ago.  I don't think we need to keep it.

    Signed-off-by: NeilBrown <neilb@suse.de>
    Reviewed-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Jeffrey Layton <jlayton@redhat.com>
2023-12-02 05:12:41 -05:00
Jeffrey Layton c3be76a49a lockd: remove SIGKILL handling
JIRA: https://issues.redhat.com/browse/RHEL-7936

commit 8db14cad28ae8ec3fde0fef18e969782bca204d1
Author: NeilBrown <neilb@suse.de>
Date:   Tue Jul 18 16:38:08 2023 +1000

    lockd: remove SIGKILL handling

    lockd allows SIGKILL and responds by dropping all locks and restarting
    the grace period.  This functionality has been present since 2.1.32 when
    lockd was added to Linux.

    This functionality is undocumented and most likely added as a useful
    debug aid.  When there is a need to drop locks, the better approach is
    to use /proc/fs/nfsd/unlock_*.

    This patch removes SIGKILL handling as part of preparation for removing
    all signal handling from sunrpc service threads.

    Signed-off-by: NeilBrown <neilb@suse.de>
    Reviewed-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Jeffrey Layton <jlayton@redhat.com>
2023-12-02 05:12:41 -05:00
Jeffrey Layton 8f3873cd35 fs: lockd: avoid possible wrong NULL parameter
JIRA: https://issues.redhat.com/browse/RHEL-7936

commit de8d38cf44bac43e83bad28357ba84784c412752
Author: Su Hui <suhui@nfschina.com>
Date:   Fri Aug 4 09:26:57 2023 +0800

    fs: lockd: avoid possible wrong NULL parameter

    clang's static analysis warning: fs/lockd/mon.c: line 293, column 2:
    Null pointer passed as 2nd argument to memory copy function.

    Assuming 'hostname' is NULL and calling 'nsm_create_handle()', this will
    pass NULL as 2nd argument to memory copy function 'memcpy()'. So return
    NULL if 'hostname' is invalid.

    Fixes: 77a3ef33e2 ("NSM: More clean up of nsm_get_handle()")
    Signed-off-by: Su Hui <suhui@nfschina.com>
    Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
    Reviewed-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Jeffrey Layton <jlayton@redhat.com>
2023-12-02 05:12:41 -05:00
Jeffrey Layton 33c9eb647b lockd: nlm_blocked list race fixes
JIRA: https://issues.redhat.com/browse/RHEL-7936

commit be2be5f7f4436442d8f6bffbb97a6f438df2896b
Author: Alexander Aring <aahringo@redhat.com>
Date:   Thu Jul 20 08:58:04 2023 -0400

    lockd: nlm_blocked list race fixes

    This patch fixes races when lockd accesses the global nlm_blocked list.
    It was mostly safe to access the list because everything was accessed
    from the lockd kernel thread context but there exist cases like
    nlmsvc_grant_deferred() that could manipulate the nlm_blocked list and
    it can be called from any context.

    Signed-off-by: Alexander Aring <aahringo@redhat.com>
    Reviewed-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Jeffrey Layton <jlayton@redhat.com>
2023-12-02 05:12:40 -05:00
Jeffrey Layton a13df6e120 NFS: add a sysfs link to the lockd rpc_client
JIRA: https://issues.redhat.com/browse/RHEL-7936

commit d97c05897757a5d7fa131073d04a2fb29b5836ee
Author: Benjamin Coddington <bcodding@redhat.com>
Date:   Thu Jun 15 14:07:28 2023 -0400

    NFS: add a sysfs link to the lockd rpc_client

    After lockd is started, add a symlink for lockd's rpc_client under
    NFS' superblock sysfs.

    Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>

Signed-off-by: Jeffrey Layton <jlayton@redhat.com>
2023-12-02 05:12:35 -05:00
Jeffrey Layton 55e852cfb6 lockd: drop inappropriate svc_get() from locked_get()
JIRA: https://issues.redhat.com/browse/RHEL-7936

commit 665e89ab7c5af1f2d260834c861a74b01a30f95f
Author: NeilBrown <neilb@suse.de>
Date:   Sat Jun 3 07:14:14 2023 +1000

    lockd: drop inappropriate svc_get() from locked_get()

    The below-mentioned patch was intended to simplify refcounting on the
    svc_serv used by locked.  The goal was to only ever have a single
    reference from the single thread.  To that end we dropped a call to
    lockd_start_svc() (except when creating thread) which would take a
    reference, and dropped the svc_put(serv) that would drop that reference.

    Unfortunately we didn't also remove the svc_get() from
    lockd_create_svc() in the case where the svc_serv already existed.
    So after the patch:
     - on the first call the svc_serv was allocated and the one reference
       was given to the thread, so there are no extra references
     - on subsequent calls svc_get() was called so there is now an extra
       reference.
    This is clearly not consistent.

    The inconsistency is also clear in the current code in lockd_get()
    takes *two* references, one on nlmsvc_serv and one by incrementing
    nlmsvc_users.   This clearly does not match lockd_put().

    So: drop that svc_get() from lockd_get() (which used to be in
    lockd_create_svc().

    Reported-by: Ido Schimmel <idosch@idosch.org>
    Closes: https://lore.kernel.org/linux-nfs/ZHsI%2FH16VX9kJQX1@shredder/T/#u
    Fixes: b73a2972041b ("lockd: move lockd_start_svc() call into lockd_create_svc()")
    Signed-off-by: NeilBrown <neilb@suse.de>
    Tested-by: Ido Schimmel <idosch@nvidia.com>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Jeffrey Layton <jlayton@redhat.com>
2023-12-02 05:12:27 -05:00
Jeffrey Layton 10731ec067 lockd: simplify two-level sysctl registration for nlm_sysctls
JIRA: https://issues.redhat.com/browse/RHEL-7936

commit 37b768ce3d23f79cef906aaf7427dd345b57f477
Author: Luis Chamberlain <mcgrof@kernel.org>
Date:   Fri Mar 10 00:37:19 2023 -0800

    lockd: simplify two-level sysctl registration for nlm_sysctls

    There is no need to declare two tables to just create directories,
    this can be easily be done with a prefix path with register_sysctl().

    Simplify this registration.

    Reviewed-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>

Signed-off-by: Jeffrey Layton <jlayton@redhat.com>
2023-12-02 05:12:26 -05:00
Jeffrey Layton c33b12c143 lockd: add some client-side tracepoints
Bugzilla: https://bugzilla.redhat.com/2063818

commit 2f90e18ffec47c265c14e313047189b79784bc0e
Author: Jeff Layton <jlayton@kernel.org>
Date:   Fri Mar 3 07:16:03 2023 -0500

    lockd: add some client-side tracepoints

    Signed-off-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Jeffrey Layton <jlayton@redhat.com>
2023-05-24 09:48:57 -04:00
Jeffrey Layton b1ecc3a228 lockd: server should unlock lock if client rejects the grant
Bugzilla: https://bugzilla.redhat.com/2063818

commit 244cc19196d2f6691d34e8cd9bc34a55e4f778e5
Author: Jeff Layton <jlayton@kernel.org>
Date:   Fri Mar 3 07:16:01 2023 -0500

    lockd: server should unlock lock if client rejects the grant

    Currently lockd just dequeues the block and ignores it if the client
    sends a GRANT_RES with a status of nlm_lck_denied. That status is an
    indicator that the client has rejected the lock, so the right thing to
    do is to unlock the lock we were trying to grant.

    Reported-by: Yongcheng Yang <yoyang@redhat.com>
    Link: https://bugzilla.redhat.com/show_bug.cgi?id=2063818
    Signed-off-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Jeffrey Layton <jlayton@redhat.com>
2023-05-24 09:48:57 -04:00
Jeffrey Layton 30657815a1 lockd: fix races in client GRANTED_MSG wait logic
Bugzilla: https://bugzilla.redhat.com/2063818

commit 2005f5b9c35bd736c81e9f24f5c5051967c022ee
Author: Jeff Layton <jlayton@kernel.org>
Date:   Fri Mar 3 07:16:00 2023 -0500

    lockd: fix races in client GRANTED_MSG wait logic

    After the wait for a grant is done (for whatever reason), nlmclnt_block
    updates the status of the nlm_rqst with the status of the block. At the
    point it does this, however, the block is still queued its status could
    change at any time.

    This is particularly a problem when the waiting task is signaled during
    the wait. We can end up giving up on the lock just before the GRANTED_MSG
    callback comes in, and accept it even though the lock request gets back
    an error, leaving a dangling lock on the server.

    Since the nlm_wait never lives beyond the end of nlmclnt_lock, put it on
    the stack and add functions to allow us to enqueue and dequeue the
    block. Enqueue it just before the lock/wait loop, and dequeue it
    just after we exit the loop instead of waiting until the end of
    the function. Also, scrape the status at the time that we dequeue it to
    ensure that it's final.

    Reported-by: Yongcheng Yang <yoyang@redhat.com>
    Link: https://bugzilla.redhat.com/show_bug.cgi?id=2063818
    Signed-off-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Jeffrey Layton <jlayton@redhat.com>
2023-05-24 09:48:57 -04:00
Jeffrey Layton 91677de253 lockd: move struct nlm_wait to lockd.h
Bugzilla: https://bugzilla.redhat.com/2063818

commit f0aa4852e63f9c1cfd4322c770e69d7e6817e906
Author: Jeff Layton <jlayton@kernel.org>
Date:   Fri Mar 3 07:15:59 2023 -0500

    lockd: move struct nlm_wait to lockd.h

    The next patch needs struct nlm_wait in fs/lockd/clntproc.c, so move
    the definition to a shared header file. As an added clean-up, drop
    the unused b_reclaim field.

    Signed-off-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Jeffrey Layton <jlayton@redhat.com>
2023-05-24 09:48:57 -04:00
Jeffrey Layton 97084a9a75 lockd: purge resources held on behalf of nlm clients when shutting down
Bugzilla: https://bugzilla.redhat.com/2063818

commit bfca7a6f0c75f5d97f5efc2c80cca55bdbf5f79a
Author: Jeff Layton <jlayton@kernel.org>
Date:   Fri Mar 3 07:15:57 2023 -0500

    lockd: purge resources held on behalf of nlm clients when shutting down

    It's easily possible for the server to have an outstanding lock when we
    go to shut down. When that happens, we often get a warning like this in
    the kernel log:

        lockd: couldn't shutdown host module for net f0000000!

    This is because the shutdown procedures skip removing any hosts that
    still have outstanding resources (locks). Eventually, things seem to get
    cleaned up anyway, but the log message is unsettling, and server
    shutdown doesn't seem to be working the way it was intended.

    Ensure that we tear down any resources held on behalf of a client when
    tearing one down for server shutdown.

    Reported-by: Yongcheng Yang <yoyang@redhat.com>
    Link: https://bugzilla.redhat.com/show_bug.cgi?id=2063818
    Signed-off-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Jeffrey Layton <jlayton@redhat.com>
2023-05-24 09:36:34 -04:00
Scott Mayhew 7fc4e3c5bc lockd: set file_lock start and end when decoding nlm4 testargs
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2183621

commit 7ff84910c66c9144cc0de9d9deed9fb84c03aff0
Author: Jeff Layton <jlayton@kernel.org>
Date:   Tue Mar 14 06:20:58 2023 -0400

    lockd: set file_lock start and end when decoding nlm4 testargs

    Commit 6930bcbfb6ce dropped the setting of the file_lock range when
    decoding a nlm_lock off the wire. This causes the client side grant
    callback to miss matching blocks and reject the lock, only to rerequest
    it 30s later.

    Add a helper function to set the file_lock range from the start and end
    values that the protocol uses, and have the nlm_lock decoder call that to
    set up the file_lock args properly.

    Fixes: 6930bcbfb6ce ("lockd: detect and reject lock arguments that overflow")
    Reported-by: Amir Goldstein <amir73il@gmail.com>
    Signed-off-by: Jeff Layton <jlayton@kernel.org>
    Tested-by: Amir Goldstein <amir73il@gmail.com>
    Cc: stable@vger.kernel.org #6.0
    Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>

Signed-off-by: Scott Mayhew <smayhew@redhat.com>
2023-05-08 10:41:47 -04:00
Scott Mayhew 8cce148b58 SUNRPC: Use per-CPU counters to tally server RPC counts
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2183621

commit 65ba3d2425bf51165b6e88509c632bd15d12883d
Author: Chuck Lever <chuck.lever@oracle.com>
Date:   Tue Jan 10 10:31:54 2023 -0500

    SUNRPC: Use per-CPU counters to tally server RPC counts

     - Improves counting accuracy
     - Reduces cross-CPU memory traffic

    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Scott Mayhew <smayhew@redhat.com>
2023-05-08 10:41:45 -04:00
Scott Mayhew fdf50a0ee5 SUNRPC: Refactor RPC server dispatch method
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2183621

commit cee4db19452467eef8ab93c6eb6a3a84d11d25d7
Author: Chuck Lever <chuck.lever@oracle.com>
Date:   Sun Jan 8 11:30:59 2023 -0500

    SUNRPC: Refactor RPC server dispatch method

    Currently, svcauth_gss_accept() pre-reserves response buffer space
    for the RPC payload length and GSS sequence number before returning
    to the dispatcher, which then adds the header's accept_stat field.

    The problem is the accept_stat field is supposed to go before the
    length and seq_num fields. So svcauth_gss_release() has to relocate
    the accept_stat value (see svcauth_gss_prepare_to_wrap()).

    To enable these fields to be added to the response buffer in the
    correct (final) order, the pointer to the accept_stat has to be made
    available to svcauth_gss_accept() so that it can set it before
    reserving space for the length and seq_num fields.

    As a first step, move the pointer to the location of the accept_stat
    field into struct svc_rqst.

    Reviewed-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Scott Mayhew <smayhew@redhat.com>
2023-05-08 10:41:44 -04:00
Scott Mayhew 9b83265572 SUNRPC: Push svcxdr_init_encode() into svc_process_common()
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2183621

commit 8dd41d70f331c342842e8d349d7a1f73b0ba7ccd
Author: Chuck Lever <chuck.lever@oracle.com>
Date:   Sun Jan 8 11:29:44 2023 -0500

    SUNRPC: Push svcxdr_init_encode() into svc_process_common()

    Now that all vs_dispatch functions invoke svcxdr_init_encode(), it
    is common code and can be pushed down into the generic RPC server.

    Reviewed-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Scott Mayhew <smayhew@redhat.com>
2023-05-08 10:41:42 -04:00
Scott Mayhew c618b79207 SUNRPC: Push svcxdr_init_decode() into svc_process_common()
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2183621

commit dba5eaa46b0282cb9607d362c8887dfcb44bfd2e
Author: Chuck Lever <chuck.lever@oracle.com>
Date:   Mon Jan 2 12:05:30 2023 -0500

    SUNRPC: Push svcxdr_init_decode() into svc_process_common()

    Now that all vs_dispatch functions invoke svcxdr_init_decode(), it
    is common code and can be pushed down into the generic RPC server.

    Reviewed-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Scott Mayhew <smayhew@redhat.com>
2023-05-08 10:41:33 -04:00
Scott Mayhew ae7877cc2b lockd: fix file selection in nlmsvc_cancel_blocked
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2183621

commit 9f27783b4dd235ef3c8dbf69fc6322777450323c
Author: Jeff Layton <jlayton@kernel.org>
Date:   Fri Nov 11 14:36:38 2022 -0500

    lockd: fix file selection in nlmsvc_cancel_blocked

    We currently do a lock_to_openmode call based on the arguments from the
    NLM_UNLOCK call, but that will always set the fl_type of the lock to
    F_UNLCK, and the O_RDONLY descriptor is always chosen.

    Fix it to use the file_lock from the block instead.

    Signed-off-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Scott Mayhew <smayhew@redhat.com>
2023-05-08 10:41:22 -04:00
Scott Mayhew ed68c7336e lockd: ensure we use the correct file descriptor when unlocking
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2183621

commit 69efce009f7df888e1fede3cb2913690eb829f52
Author: Jeff Layton <jlayton@kernel.org>
Date:   Fri Nov 11 14:36:37 2022 -0500

    lockd: ensure we use the correct file descriptor when unlocking

    Shared locks are set on O_RDONLY descriptors and exclusive locks are set
    on O_WRONLY ones. nlmsvc_unlock however calls vfs_lock_file twice, once
    for each descriptor, but it doesn't reset fl_file. Ensure that it does.

    Signed-off-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Scott Mayhew <smayhew@redhat.com>
2023-05-08 10:41:22 -04:00
Scott Mayhew 03ab1276d7 lockd: set missing fl_flags field when retrieving args
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2183621

commit 75c7940d2a86d3f1b60a0a265478cb8fc887b970
Author: Jeff Layton <jlayton@kernel.org>
Date:   Fri Nov 11 14:36:36 2022 -0500

    lockd: set missing fl_flags field when retrieving args

    Signed-off-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Scott Mayhew <smayhew@redhat.com>
2023-05-08 10:41:22 -04:00
Scott Mayhew d477b54e1c SUNRPC: Parametrize how much of argsize should be zeroed
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2183621

commit 103cc1fafee48adb91fca0e19deb869fd23e46ab
Author: Chuck Lever <chuck.lever@oracle.com>
Date:   Mon Sep 12 17:22:38 2022 -0400

    SUNRPC: Parametrize how much of argsize should be zeroed

    Currently, SUNRPC clears the whole of .pc_argsize before processing
    each incoming RPC transaction. Add an extra parameter to struct
    svc_procedure to enable upper layers to reduce the amount of each
    operation's argument structure that is zeroed by SUNRPC.

    The size of struct nfsd4_compoundargs, in particular, is a lot to
    clear on each incoming RPC Call. A subsequent patch will cut this
    down to something closer to what NFSv2 and NFSv3 uses.

    This patch should cause no behavior changes.

    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Scott Mayhew <smayhew@redhat.com>
2023-05-08 10:41:07 -04:00
Scott Mayhew 696e866fbc lockd: move from strlcpy with unused retval to strscpy
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2183621

commit 97f8e62572555f8ad578d7b1739ba64d5d2cac0f
Author: Wolfram Sang <wsa+renesas@sang-engineering.com>
Date:   Thu Aug 18 23:01:16 2022 +0200

    lockd: move from strlcpy with unused retval to strscpy

    Follow the advice of the below link and prefer 'strscpy' in this
    subsystem. Conversion is 1:1 because the return value is not used.
    Generated by a coccinelle script.

    Link: https://lore.kernel.org/r/CAHk-=wgfRnXz0W3D37d01q3JFkr_i_uTL=V6A6G1oUZcprmknw@mail.gmail.com/
    Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Scott Mayhew <smayhew@redhat.com>
2023-05-08 10:41:03 -04:00
Scott Mayhew 81d461b33b lockd: detect and reject lock arguments that overflow
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2183621

commit 6930bcbfb6ceda63e298c6af6d733ecdf6bd4cde
Author: Jeff Layton <jlayton@kernel.org>
Date:   Mon Aug 1 15:57:26 2022 -0400

    lockd: detect and reject lock arguments that overflow

    lockd doesn't currently vet the start and length in nlm4 requests like
    it should, and can end up generating lock requests with arguments that
    overflow when passed to the filesystem.

    The NLM4 protocol uses unsigned 64-bit arguments for both start and
    length, whereas struct file_lock tracks the start and end as loff_t
    values. By the time we get around to calling nlm4svc_retrieve_args,
    we've lost the information that would allow us to determine if there was
    an overflow.

    Start tracking the actual start and len for NLM4 requests in the
    nlm_lock. In nlm4svc_retrieve_args, vet these values to ensure they
    won't cause an overflow, and return NLM4_FBIG if they do.

    Link: https://bugzilla.linux-nfs.org/show_bug.cgi?id=392
    Reported-by: Jan Kasiak <j.kasiak@gmail.com>
    Signed-off-by: Jeff Layton <jlayton@kernel.org>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
    Cc: <stable@vger.kernel.org> # 5.14+

Signed-off-by: Scott Mayhew <smayhew@redhat.com>
2023-05-08 10:41:00 -04:00
Jeffrey Layton c6fec65f76 lockd: use locks_inode_context helper
Bugzilla: https://bugzilla.redhat.com/2172087

commit 98b41ffe0afdfeaa1439a5d6bd2db4a94277e31b
Author: Jeff Layton <jlayton@kernel.org>
Date:   Wed Nov 16 09:19:43 2022 -0500

    lockd: use locks_inode_context helper

    lockd currently doesn't access i_flctx safely. This requires a
    smp_load_acquire, as the pointer is set via cmpxchg (a release
    operation).

    Cc: Trond Myklebust <trond.myklebust@hammerspace.com>
    Cc: Anna Schumaker <anna@kernel.org>
    Cc: Chuck Lever <chuck.lever@oracle.com>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Jeff Layton <jlayton@kernel.org>

Signed-off-by: Jeffrey Layton <jlayton@redhat.com>
2023-03-27 07:08:10 -04:00
Benjamin Coddington 0e013d9528 lockd: set other missing fields when unlocking files
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2154879

commit 18ebd35b61b4693a0ddc270b6d4f18def232e770
Author: Trond Myklebust <trond.myklebust@hammerspace.com>
Date:   Sun Nov 6 14:02:39 2022 -0500

    lockd: set other missing fields when unlocking files

    vfs_lock_file() expects the struct file_lock to be fully initialised by
    the caller. Re-exported NFSv3 has been seen to Oops if the fl_file field
    is NULL.

    Fixes: aec158242b87 ("lockd: set fl_owner when unlocking files")
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Reviewed-by: Jeff Layton <jlayton@kernel.org>
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=216582
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
2023-03-02 13:55:24 -05:00
Benjamin Coddington d0600495f1 NLM: Defend against file_lock changes after vfs_test_lock()
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2154879

commit 184cefbe62627730c30282df12bcff9aae4816ea
Author: Benjamin Coddington <bcodding@redhat.com>
Date:   Mon Jun 13 09:40:06 2022 -0400

    NLM: Defend against file_lock changes after vfs_test_lock()

    Instead of trusting that struct file_lock returns completely unchanged
    after vfs_test_lock() when there's no conflicting lock, stash away our
    nlm_lockowner reference so we can properly release it for all cases.

    This defends against another file_lock implementation overwriting fl_owner
    when the return type is F_UNLCK.

    Reported-by: Roberto Bergantinos Corpas <rbergant@redhat.com>
    Tested-by: Roberto Bergantinos Corpas <rbergant@redhat.com>
    Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
2023-03-02 13:55:24 -05:00
Benjamin Coddington 9f848b7091 NFSD: Move svc_serv_ops::svo_function into struct svc_serv
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2094072

commit 37902c6313090235c847af89c5515591261ee338
Author: Chuck Lever <chuck.lever@oracle.com>
Date:   Wed Feb 16 12:16:27 2022 -0500

    NFSD: Move svc_serv_ops::svo_function into struct svc_serv

    Hoist svo_function back into svc_serv and remove struct
    svc_serv_ops, since the struct is now devoid of fields.

    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
2022-09-26 09:34:15 -04:00
Benjamin Coddington c6d4ab247f NFSD: Remove svc_serv_ops::svo_module
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2094072
Conflicts: this patch is modified from upstream since RHEL-9 doesn't have
ebiederm's cleanups from v5.17 which change module_put_and_exit() callsites
to module_put_and_exit().

commit f49169c97fceb21ad6a0aaf671c50b0f520f15a5
Author: Chuck Lever <chuck.lever@oracle.com>
Date:   Wed Feb 16 12:31:09 2022 -0500

    NFSD: Remove svc_serv_ops::svo_module

    struct svc_serv_ops is about to be removed.

    Neil Brown says:
    > I suspect svo_module can go as well - I don't think the thread is
    > ever the thing that primarily keeps a module active.

    A random sample of kthread_create() callers shows sunrpc is the only
    one that manages module reference count in this way.

    Suggested-by: Neil Brown <neilb@suse.de>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
2022-09-26 09:34:15 -04:00
Benjamin Coddington a858347089 SUNRPC: Remove svc_shutdown_net()
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2094072

commit c7d7ec8f043e53ad16e30f5ebb8b9df415ec0f2b
Author: Chuck Lever <chuck.lever@oracle.com>
Date:   Wed Jan 26 11:30:55 2022 -0500

    SUNRPC: Remove svc_shutdown_net()

    Clean up: svc_shutdown_net() now does nothing but call
    svc_close_net(). Replace all external call sites.

    svc_close_net() is renamed to be the inverse of svc_xprt_create().

    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
2022-09-26 09:34:15 -04:00
Benjamin Coddington 4c266e4139 SUNRPC: Rename svc_create_xprt()
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2094072

commit 352ad31448fecc78a2e9b78da64eea5d63b8d0ce
Author: Chuck Lever <chuck.lever@oracle.com>
Date:   Wed Jan 26 11:42:08 2022 -0500

    SUNRPC: Rename svc_create_xprt()

    Clean up: Use the "svc_xprt_<task>" function naming convention as
    is used for other external APIs.

    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
2022-09-26 09:34:14 -04:00
Benjamin Coddington a2b87282a7 SUNRPC: Remove svo_shutdown method
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2094072

commit 87cdd8641c8a1ec6afd2468265e20840a57fd888
Author: Chuck Lever <chuck.lever@oracle.com>
Date:   Tue Jan 25 13:49:29 2022 -0500

    SUNRPC: Remove svo_shutdown method

    Clean up. Neil observed that "any code that calls svc_shutdown_net()
    knows what the shutdown function should be, and so can call it
    directly."

    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
    Reviewed-by: NeilBrown <neilb@suse.de>

Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
2022-09-26 09:34:14 -04:00
Benjamin Coddington 2780aa4252 SUNRPC: Remove the .svo_enqueue_xprt method
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2094072

commit a9ff2e99e9fa501ec965da03c18a5422b37a2f44
Author: Chuck Lever <chuck.lever@oracle.com>
Date:   Tue Jan 25 10:17:59 2022 -0500

    SUNRPC: Remove the .svo_enqueue_xprt method

    We have never been able to track down and address the underlying
    cause of the performance issues with workqueue-based service
    support. svo_enqueue_xprt is called multiple times per RPC, so
    it adds instruction path length, but always ends up at the same
    function: svc_xprt_do_enqueue(). We do not anticipate needing
    this flexibility for dynamic nfsd thread management support.

    As a micro-optimization, remove .svo_enqueue_xprt because
    Spectre/Meltdown makes virtual function calls more costly.

    This change essentially reverts commit b9e13cdfac ("nfsd/sunrpc:
    turn enqueueing a svc_xprt into a svc_serv operation").

    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
2022-09-26 09:34:14 -04:00
Benjamin Coddington a88f04cf1f lockd: use svc_set_num_threads() for thread start and stop
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2094072

commit 6b044fbaab02292fedb17565dbb3f2528083b169
Author: NeilBrown <neilb@suse.de>
Date:   Mon Nov 29 15:51:25 2021 +1100

    lockd: use svc_set_num_threads() for thread start and stop

    svc_set_num_threads() does everything that lockd_start_svc() does, except
    set sv_maxconn.  It also (when passed 0) finds the threads and
    stops them with kthread_stop().

    So move the setting for sv_maxconn, and use svc_set_num_thread()

    We now don't need nlmsvc_task.

    Now that we use svc_set_num_threads() it makes sense to set svo_module.
    This request that the thread exists with module_put_and_exit().
    Also fix the documentation for svo_module to make this explicit.

    svc_prepare_thread is now only used where it is defined, so it can be
    made static.

    Signed-off-by: NeilBrown <neilb@suse.de>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
2022-09-26 09:34:02 -04:00
Benjamin Coddington 230bf3602a lockd: rename lockd_create_svc() to lockd_get()
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2094072

commit ecd3ad68d2c6d3ae178a63a2d9a02c392904fd36
Author: NeilBrown <neilb@suse.de>
Date:   Mon Nov 29 15:51:25 2021 +1100

    lockd: rename lockd_create_svc() to lockd_get()

    lockd_create_svc() already does an svc_get() if the service already
    exists, so it is more like a "get" than a "create".

    So:
     - Move the increment of nlmsvc_users into the function as well
     - rename to lockd_get().

    It is now the inverse of lockd_put().

    Signed-off-by: NeilBrown <neilb@suse.de>
    Signed-off-by: Chuck Lever <chuck.lever@oracle.com>

Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
2022-09-26 09:34:02 -04:00