diff options
author | NeilBrown <neil@brown.name> | 2021-03-15 13:58:27 -0400 |
---|---|---|
committer | Steve Dickson <steved@redhat.com> | 2021-03-15 13:58:27 -0400 |
commit | edeb381593d65a4519c71568c969d3e2937ad911 (patch) | |
tree | 5f2d79191c1ccb6560f74a770fbb1e0a7ee9410a /utils | |
parent | f8e2c8d461883fab6f335a8ee8132f1885ff1c9d (diff) | |
download | nfs-utils-edeb381593d65a4519c71568c969d3e2937ad911.tar.gz |
mountd: add logging of NFSv4 clients attaching and detaching.
NFSv4 does not have a MOUNT request like NFSv3 does (via the MOUNT
protocol). So these cannot be logged.
NFSv4 does have SETCLIENTID and EXCHANGE_ID. These are indirectly
visible though changes in /proc/fs/nfsd/clients.
When a new client attaches, a directory appears. When the client
detaches, through a timeout (v4.0) or DESTROY_SESSION (v4.1+)
the directory disappears.
This patch adds tracking of these changes using inotify, with log
messages when a client attaches or detaches.
Unfortuantely clients are created in two steps, the second being a
confirmation. This results in a temporary client appearing and
disappearing. It is not possible (in Linux 5.10) to detect the
unconfirmed client, so extra attach/detach messages are generated.
This patch also moves some cache* function declarations into a header
file, and makes a few related changes to #includes.
Signed-off-by: NeilBrown <neilb@suse.de>
Signed-off-by: Steve Dickson <steved@redhat.com>
Diffstat (limited to 'utils')
-rw-r--r-- | utils/exportd/exportd.c | 1 | ||||
-rw-r--r-- | utils/mountd/mountd.c | 2 | ||||
-rw-r--r-- | utils/mountd/mountd.h | 5 | ||||
-rw-r--r-- | utils/mountd/svc_run.c | 5 |
4 files changed, 6 insertions, 7 deletions
diff --git a/utils/exportd/exportd.c b/utils/exportd/exportd.c index 736ab319..f36f51d2 100644 --- a/utils/exportd/exportd.c +++ b/utils/exportd/exportd.c @@ -297,6 +297,7 @@ main(int argc, char **argv) /* Open files now to avoid sharing descriptors among forked processes */ cache_open(); + v4clients_init(); /* Process incoming upcalls */ cache_process_loop(); diff --git a/utils/mountd/mountd.c b/utils/mountd/mountd.c index fce38966..39e85fd5 100644 --- a/utils/mountd/mountd.c +++ b/utils/mountd/mountd.c @@ -31,6 +31,7 @@ #include "pseudoflavors.h" #include "nfsd_path.h" #include "nfslib.h" +#include "export.h" extern void my_svc_run(void); @@ -924,6 +925,7 @@ main(int argc, char **argv) nfsd_path_init(); /* Open files now to avoid sharing descriptors among forked processes */ cache_open(); + v4clients_init(); xlog(L_NOTICE, "Version " VERSION " starting"); my_svc_run(); diff --git a/utils/mountd/mountd.h b/utils/mountd/mountd.h index f058f01d..d3077531 100644 --- a/utils/mountd/mountd.h +++ b/utils/mountd/mountd.h @@ -60,9 +60,4 @@ bool ipaddr_client_matches(nfs_export *exp, struct addrinfo *ai); bool namelist_client_matches(nfs_export *exp, char *dom); bool client_matches(nfs_export *exp, char *dom, struct addrinfo *ai); -static inline bool is_ipaddr_client(char *dom) -{ - return dom[0] == '$'; -} - #endif /* MOUNTD_H */ diff --git a/utils/mountd/svc_run.c b/utils/mountd/svc_run.c index 41b96d7f..167b9757 100644 --- a/utils/mountd/svc_run.c +++ b/utils/mountd/svc_run.c @@ -56,10 +56,9 @@ #ifdef HAVE_LIBTIRPC #include <rpc/rpc_com.h> #endif +#include "export.h" void my_svc_run(void); -void cache_set_fds(fd_set *fdset); -int cache_process_req(fd_set *readfds); #if defined(__GLIBC__) && LONG_MAX != INT_MAX /* bug in glibc 2.3.6 and earlier, we need @@ -101,6 +100,7 @@ my_svc_run(void) readfds = svc_fdset; cache_set_fds(&readfds); + v4clients_set_fds(&readfds); selret = select(FD_SETSIZE, &readfds, (void *) 0, (void *) 0, (struct timeval *) 0); @@ -116,6 +116,7 @@ my_svc_run(void) default: selret -= cache_process_req(&readfds); + selret -= v4clients_process(&readfds); if (selret) svc_getreqset(&readfds); } |