]> git.decadent.org.uk Git - nfs-utils.git/commitdiff
gssd: unblock DNOTIFY_SIGNAL in case it was blocked.
authorNeil Brown <neilb@suse.de>
Wed, 26 Nov 2008 13:48:03 +0000 (08:48 -0500)
committerSteve Dickson <steved@redhat.com>
Wed, 26 Nov 2008 13:48:03 +0000 (08:48 -0500)
I have a situation where rpc.gssd appears to not be working.
Mount attempts which need to communicate with it block.

I've narrowed down the problem to that fact that all realtime signals
have been blocked.  This means that DNOTIFY_SIGNAL (which is a
realtime signal) is never delivered, so gssd never rescans the
rpc_pipe/nfs directory.

It seems start_kde (or whatever it is called) and all descendants have
these
signals blocked.  xfce seems to do the same thing.  gnome doesn't.

So if you start rpc.gssd from a terminal window while logged in via
KDE, it doesn't behave as expected.

Signed-off-by: Neil Brown <neilb@suse.de>
Signed-off-by: Steve Dickson <steved@redhat.com>
utils/gssd/gssd_main_loop.c

index 84f04e96eda218cc236e835067b8e0728f27191c..b9f3a06520265c02f7ec5a14b1367d30297141c3 100644 (file)
@@ -99,6 +99,7 @@ gssd_run()
        int                     ret;
        struct sigaction        dn_act;
        int                     fd;
        int                     ret;
        struct sigaction        dn_act;
        int                     fd;
+       sigset_t                set;
 
        /* Taken from linux/Documentation/dnotify.txt: */
        dn_act.sa_sigaction = dir_notify_handler;
 
        /* Taken from linux/Documentation/dnotify.txt: */
        dn_act.sa_sigaction = dir_notify_handler;
@@ -106,6 +107,11 @@ gssd_run()
        dn_act.sa_flags = SA_SIGINFO;
        sigaction(DNOTIFY_SIGNAL, &dn_act, NULL);
 
        dn_act.sa_flags = SA_SIGINFO;
        sigaction(DNOTIFY_SIGNAL, &dn_act, NULL);
 
+       /* just in case the signal is blocked... */
+       sigemptyset(&set);
+       sigaddset(&set, DNOTIFY_SIGNAL);
+       sigprocmask(SIG_UNBLOCK, &set, NULL);
+
        if ((fd = open(pipefs_nfsdir, O_RDONLY)) == -1) {
                printerr(0, "ERROR: failed to open %s: %s\n",
                         pipefs_nfsdir, strerror(errno));
        if ((fd = open(pipefs_nfsdir, O_RDONLY)) == -1) {
                printerr(0, "ERROR: failed to open %s: %s\n",
                         pipefs_nfsdir, strerror(errno));