From mboxrd@z Thu Jan 1 00:00:00 1970 From: bmarzins@sourceware.org Date: 21 Sep 2006 20:00:02 -0000 Subject: [Cluster-devel] cluster/gnbd/server gnbd_serv.c gserv.c gserv.h Message-ID: <20060921200002.30852.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit CVSROOT: /cvs/cluster Module name: cluster Changes by: bmarzins at sourceware.org 2006-09-21 20:00:01 Modified files: gnbd/server : gnbd_serv.c gserv.c gserv.h Log message: Fix for bugzilla #207599. The individual gserv processes inherit the atexit callbacks from the main gnbd_serv process. One of those kills all the gserv processes. Now they don't do that. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gnbd/server/gnbd_serv.c.diff?cvsroot=cluster&r1=1.4&r2=1.5 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gnbd/server/gserv.c.diff?cvsroot=cluster&r1=1.5&r2=1.6 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gnbd/server/gserv.h.diff?cvsroot=cluster&r1=1.3&r2=1.4 --- cluster/gnbd/server/gnbd_serv.c 2005/03/18 19:39:39 1.4 +++ cluster/gnbd/server/gnbd_serv.c 2006/09/21 20:00:01 1.5 @@ -337,7 +337,9 @@ void exit_main(void) { - kill_all_gserv(); + if (!is_gserv) /* don't do this is you are a gserv process. Only + the main process should kill the gservs */ + kill_all_gserv(); } int main(int argc, char **argv) --- cluster/gnbd/server/gserv.c 2006/08/11 15:18:14 1.5 +++ cluster/gnbd/server/gserv.c 2006/09/21 20:00:01 1.6 @@ -34,6 +34,10 @@ #include +int is_gserv = 0; /* This gets set when child is forked. It is needed so that + the gserv processes don't execute the atexit commands + set up for the main program */ + list_decl(waiter_list); list_decl(gserv_list); off_t file_offset = (off_t)-1; @@ -402,6 +406,7 @@ unblock_sigchld(); return; } + is_gserv = 1; unblock_sigchld(); memset(&act,0,sizeof(act)); --- cluster/gnbd/server/gserv.h 2004/07/09 18:56:21 1.3 +++ cluster/gnbd/server/gserv.h 2006/09/21 20:00:01 1.4 @@ -49,6 +49,8 @@ (x)->sectors = cpu_to_be64((x)->sectors);\ (x)->version = cpu_to_be16((x)->version); +extern int is_gserv; + void gserv(int sock, char *node, uint64_t sectors, unsigned int flags, char *name, int devfd); int add_gserv_info(int sock, char *node, dev_info_t *dev, pid_t pid);