From patchwork Tue Dec 9 05:41:35 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?RGF2aWQgSMODwqRyZGVtYW4=?= X-Patchwork-Id: 5460431 Return-Path: X-Original-To: patchwork-linux-nfs@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 7D7A9BEEA8 for ; Tue, 9 Dec 2014 05:41:48 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 8EE6D20155 for ; Tue, 9 Dec 2014 05:41:47 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 839092013D for ; Tue, 9 Dec 2014 05:41:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932104AbaLIFlp (ORCPT ); Tue, 9 Dec 2014 00:41:45 -0500 Received: from vader.hardeman.nu ([95.142.160.32]:51279 "EHLO hardeman.nu" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932100AbaLIFlp (ORCPT ); Tue, 9 Dec 2014 00:41:45 -0500 Received: from zeus.hardeman.nu (ppp-93-104-122-8.dynamic.mnet-online.de [93.104.122.8]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by vader.hardeman.nu (Postfix) with ESMTPSA id 0316810C4; Tue, 9 Dec 2014 06:41:44 +0100 (CET) Received: by zeus.hardeman.nu (Postfix, from userid 1000) id B7ADE3281C94; Tue, 9 Dec 2014 06:41:35 +0100 (CET) Subject: [PATCH 11/19] nfs-utils: gssd - keep the rpc_pipefs dir open From: David =?utf-8?b?SMOkcmRlbWFu?= To: linux-nfs@vger.kernel.org Cc: SteveD@redhat.com Date: Tue, 09 Dec 2014 06:41:35 +0100 Message-ID: <20141209054135.24756.61210.stgit@zeus.muc.hardeman.nu> In-Reply-To: <20141209053828.24756.89941.stgit@zeus.muc.hardeman.nu> References: <20141209053828.24756.89941.stgit@zeus.muc.hardeman.nu> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Keep the rpc_pipefs dir open and just do a rewind/rescan when necessary. Signed-off-by: David Härdeman --- utils/gssd/gssd.c | 86 +++++++++++++++++++++++------------------------------ 1 file changed, 37 insertions(+), 49 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/utils/gssd/gssd.c b/utils/gssd/gssd.c index d0eae16..d03df2c 100644 --- a/utils/gssd/gssd.c +++ b/utils/gssd/gssd.c @@ -72,7 +72,9 @@ #include "krb5_util.h" #include "nfslib.h" -static char *pipefs_dir = GSSD_PIPEFS_DIR; +static char *pipefs_path = GSSD_PIPEFS_DIR; +static DIR *pipefs_dir; + char *keytabfile = GSSD_DEFAULT_KEYTAB_FILE; char **ccachesearch; int use_memcache = 0; @@ -87,6 +89,7 @@ struct topdir { TAILQ_ENTRY(topdir) list; TAILQ_HEAD(clnt_list_head, clnt_info) clnt_list; int fd; + char *name; char dirname[]; }; @@ -550,7 +553,7 @@ find_client(struct topdir *tdi, const char *dirname) } static int -process_pipedir(struct topdir *tdi) +gssd_process_topdir(struct topdir *tdi) { struct dirent **namelist; int i, j; @@ -576,40 +579,23 @@ process_pipedir(struct topdir *tdi) return 0; } -/* Used to read (and re-read) list of clients, set up poll array. */ -static void -gssd_update_clients(void) -{ - int retval; - struct topdir *tdi; - - TAILQ_FOREACH(tdi, &topdir_list, list) { - retval = process_pipedir(tdi); - if (retval) - printerr(1, "WARNING: error processing %s\n", - tdi->dirname); - - } -} - -static void -gssd_update_clients_cb(int UNUSED(ifd), short UNUSED(which), void *UNUSED(data)) -{ - gssd_update_clients(); -} - static int -topdirs_add_entry(int pfd, const char *name) +gssd_add_topdir(int pfd, const char *name) { struct topdir *tdi; - tdi = malloc(sizeof(*tdi) + strlen(pipefs_dir) + strlen(name) + 2); + TAILQ_FOREACH(tdi, &topdir_list, list) + if (!strcmp(tdi->name, name)) + return gssd_process_topdir(tdi); + + tdi = malloc(sizeof(*tdi) + strlen(pipefs_path) + strlen(name) + 2); if (!tdi) { printerr(0, "ERROR: Couldn't allocate struct topdir\n"); return -1; } - sprintf(tdi->dirname, "%s/%s", pipefs_dir, name); + sprintf(tdi->dirname, "%s/%s", pipefs_path, name); + tdi->name = tdi->dirname + strlen(pipefs_path) + 1; TAILQ_INIT(&tdi->clnt_list); tdi->fd = openat(pfd, name, O_RDONLY); @@ -624,43 +610,39 @@ topdirs_add_entry(int pfd, const char *name) fcntl(tdi->fd, F_NOTIFY, DN_CREATE|DN_DELETE|DN_MODIFY|DN_MULTISHOT); TAILQ_INSERT_HEAD(&topdir_list, tdi, list); - return 0; + return gssd_process_topdir(tdi); } static void -topdirs_init_list(void) +gssd_update_clients(void) { - DIR *pipedir; - struct dirent *dent; + struct dirent *d; - TAILQ_INIT(&topdir_list); + rewinddir(pipefs_dir); - pipedir = opendir("."); - if (!pipedir) { - printerr(0, "ERROR: could not open rpc_pipefs directory: '%s'\n", - strerror(errno)); - exit(EXIT_FAILURE); - } - - while ((dent = readdir(pipedir))) { - if (dent->d_type != DT_DIR) + while ((d = readdir(pipefs_dir))) { + if (d->d_type != DT_DIR) continue; - if (dent->d_name[0] == '.') + if (d->d_name[0] == '.') continue; - if (topdirs_add_entry(dirfd(pipedir), dent->d_name)) - exit(EXIT_FAILURE); + gssd_add_topdir(dirfd(pipefs_dir), d->d_name); } if (TAILQ_EMPTY(&topdir_list)) { printerr(0, "ERROR: the rpc_pipefs directory is empty!\n"); exit(EXIT_FAILURE); } +} - closedir(pipedir); +static void +gssd_update_clients_cb(int UNUSED(ifd), short UNUSED(which), void *UNUSED(data)) +{ + gssd_update_clients(); } + static void gssd_atexit(void) { @@ -711,7 +693,7 @@ main(int argc, char *argv[]) rpc_verbosity++; break; case 'p': - pipefs_dir = optarg; + pipefs_path = optarg; break; case 'k': keytabfile = optarg; @@ -814,8 +796,14 @@ main(int argc, char *argv[]) event_init(); - if (chdir(pipefs_dir)) { - printerr(1, "ERROR: chdir(%s) failed: %s\n", pipefs_dir, strerror(errno)); + pipefs_dir = opendir(pipefs_path); + if (!pipefs_dir) { + printerr(1, "ERROR: opendir(%s) failed: %s\n", pipefs_path, strerror(errno)); + exit(EXIT_FAILURE); + } + + if (fchdir(dirfd(pipefs_dir))) { + printerr(1, "ERROR: fchdir(%s) failed: %s\n", pipefs_path, strerror(errno)); exit(EXIT_FAILURE); } @@ -829,7 +817,7 @@ main(int argc, char *argv[]) signal_set(&sigdnotify_ev, DNOTIFY_SIGNAL, gssd_update_clients_cb, NULL); signal_add(&sigdnotify_ev, NULL); - topdirs_init_list(); + TAILQ_INIT(&topdir_list); gssd_update_clients(); daemon_ready();