From: bfields@fieldses.org (J. Bruce Fields)
To: Doug Nazar <nazard@nazar.ca>
Cc: linux-nfs@vger.kernel.org
Subject: Re: [PATCH 11/11] svcgssd: Wait for nullrpc channel if not available
Date: Sat, 18 Jul 2020 11:55:01 -0400 [thread overview]
Message-ID: <20200718155501.GB27817@fieldses.org> (raw)
In-Reply-To: <20200718092421.31691-12-nazard@nazar.ca>
On Sat, Jul 18, 2020 at 05:24:21AM -0400, Doug Nazar wrote:
> Signed-off-by: Doug Nazar <nazard@nazar.ca>
So, is there a race here that could result in a hang, and has anyone
seen it in practice?
Just curious. Thanks for doing this.--b.
> ---
> utils/gssd/svcgssd.c | 99 +++++++++++++++++++++++++++++++++++---------
> 1 file changed, 80 insertions(+), 19 deletions(-)
>
> diff --git a/utils/gssd/svcgssd.c b/utils/gssd/svcgssd.c
> index 3155a2f9..3ab2100b 100644
> --- a/utils/gssd/svcgssd.c
> +++ b/utils/gssd/svcgssd.c
> @@ -67,9 +67,14 @@
> #include "misc.h"
> #include "svcgssd_krb5.h"
>
> -struct state_paths etab;
> +struct state_paths etab; /* from cacheio.c */
> static bool signal_received = false;
> static struct event_base *evbase = NULL;
> +static int nullrpc_fd = -1;
> +static struct event *nullrpc_event = NULL;
> +static struct event *wait_event = NULL;
> +
> +#define NULLRPC_FILE "/proc/net/rpc/auth.rpcsec.init/channel"
>
> static void
> sig_die(int signal)
> @@ -118,6 +123,66 @@ svcgssd_nullrpc_cb(int fd, short UNUSED(which), void *UNUSED(data))
> handle_nullreq(lbuf);
> }
>
> +static void
> +svcgssd_nullrpc_close(void)
> +{
> + if (nullrpc_event) {
> + printerr(2, "closing nullrpc channel %s\n", NULLRPC_FILE);
> + event_free(nullrpc_event);
> + nullrpc_event = NULL;
> + }
> + if (nullrpc_fd != -1) {
> + close(nullrpc_fd);
> + nullrpc_fd = -1;
> + }
> +}
> +
> +static void
> +svcgssd_nullrpc_open(void)
> +{
> + nullrpc_fd = open(NULLRPC_FILE, O_RDWR);
> + if (nullrpc_fd < 0) {
> + printerr(0, "failed to open %s: %s\n",
> + NULLRPC_FILE, strerror(errno));
> + return;
> + }
> + nullrpc_event = event_new(evbase, nullrpc_fd, EV_READ | EV_PERSIST,
> + svcgssd_nullrpc_cb, NULL);
> + if (!nullrpc_event) {
> + printerr(0, "failed to create event for %s: %s\n",
> + NULLRPC_FILE, strerror(errno));
> + close(nullrpc_fd);
> + nullrpc_fd = -1;
> + return;
> + }
> + event_add(nullrpc_event, NULL);
> + printerr(2, "opened nullrpc channel %s\n", NULLRPC_FILE);
> +}
> +
> +static void
> +svcgssd_wait_cb(int UNUSED(fd), short UNUSED(which), void *UNUSED(data))
> +{
> + static int times = 0;
> + int rc;
> +
> + rc = access(NULLRPC_FILE, R_OK | W_OK);
> + if (rc != 0) {
> + struct timeval t = {times < 10 ? 1 : 10, 0};
> + times++;
> + if (times % 30 == 0)
> + printerr(2, "still waiting for nullrpc channel: %s\n",
> + NULLRPC_FILE);
> + evtimer_add(wait_event, &t);
> + return;
> + }
> +
> + svcgssd_nullrpc_open();
> + event_free(wait_event);
> + wait_event = NULL;
> +}
> +
> +
> +
> int
> main(int argc, char *argv[])
> {
> @@ -132,8 +197,6 @@ main(int argc, char *argv[])
> char *principal = NULL;
> char *s;
> int rc;
> - int nullrpc_fd = -1;
> - struct event *nullrpc_event = NULL;
>
> conf_init_file(NFS_CONFFILE);
>
> @@ -250,22 +313,19 @@ main(int argc, char *argv[])
> }
> }
>
> -#define NULLRPC_FILE "/proc/net/rpc/auth.rpcsec.init/channel"
> -
> - nullrpc_fd = open(NULLRPC_FILE, O_RDWR);
> - if (nullrpc_fd < 0) {
> - printerr(0, "failed to open %s: %s\n",
> - NULLRPC_FILE, strerror(errno));
> - exit(1);
> - }
> - nullrpc_event = event_new(evbase, nullrpc_fd, EV_READ | EV_PERSIST,
> - svcgssd_nullrpc_cb, NULL);
> + svcgssd_nullrpc_open();
> if (!nullrpc_event) {
> - printerr(0, "failed to create event for %s: %s\n",
> - NULLRPC_FILE, strerror(errno));
> - exit(1);
> + struct timeval t = {1, 0};
> +
> + printerr(2, "waiting for nullrpc channel to appear\n");
> + wait_event = evtimer_new(evbase, svcgssd_wait_cb, NULL);
> + if (!wait_event) {
> + printerr(0, "ERROR: failed to create wait event: %s\n",
> + strerror(errno));
> + exit(EXIT_FAILURE);
> + }
> + evtimer_add(wait_event, &t);
> }
> - event_add(nullrpc_event, NULL);
>
> daemon_ready();
>
> @@ -275,8 +335,9 @@ main(int argc, char *argv[])
> if (rc < 0)
> printerr(0, "event_base_dispatch() returned %i!\n", rc);
>
> - event_free(nullrpc_event);
> - close(nullrpc_fd);
> + svcgssd_nullrpc_close();
> + if (wait_event)
> + event_free(wait_event);
>
> event_base_free(evbase);
>
> --
> 2.26.2
next prev parent reply other threads:[~2020-07-18 15:55 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-18 9:24 [PATCH 00/11] nfs-utils: Misc cleanups & fixes Doug Nazar
2020-07-18 9:24 ` [PATCH 01/11] Add error handling to libevent allocations Doug Nazar
2020-07-18 9:24 ` [PATCH 02/11] gssd: Fix cccache buffer size Doug Nazar
2020-07-20 14:43 ` Steve Dickson
2020-07-20 15:41 ` Doug Nazar
2020-07-18 9:24 ` [PATCH 03/11] gssd: Fix handling of failed allocations Doug Nazar
2020-07-18 9:24 ` [PATCH 04/11] gssd: srchost should never be * Doug Nazar
2020-07-18 9:24 ` [PATCH 05/11] xlog: Reorganize xlog_backend() to work around -Wmaybe-uninitialized Doug Nazar
2020-07-18 9:24 ` [PATCH 06/11] nfsdcld: Add graceful exit handling and resource cleanup Doug Nazar
2020-07-18 9:24 ` [PATCH 07/11] nfsdcld: Don't copy more data than exists in column Doug Nazar
2020-07-18 9:24 ` [PATCH 08/11] svcgssd: Convert to using libevent Doug Nazar
2020-07-18 9:24 ` [PATCH 09/11] nfsidmap: Add support to cleanup resources on exit Doug Nazar
2020-07-20 15:49 ` Steve Dickson
2020-07-20 15:58 ` Doug Nazar
2020-07-20 17:31 ` Steve Dickson
2020-07-18 9:24 ` [PATCH 10/11] svcgssd: Cleanup global " Doug Nazar
2020-07-18 9:24 ` [PATCH 11/11] svcgssd: Wait for nullrpc channel if not available Doug Nazar
2020-07-18 15:55 ` J. Bruce Fields [this message]
2020-07-18 18:07 ` Doug Nazar
2020-07-27 14:42 ` [PATCH 00/11] nfs-utils: Misc cleanups & fixes Steve Dickson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200718155501.GB27817@fieldses.org \
--to=bfields@fieldses.org \
--cc=linux-nfs@vger.kernel.org \
--cc=nazard@nazar.ca \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox