From mboxrd@z Thu Jan 1 00:00:00 1970 From: jbrassow@sourceware.org Date: 19 Feb 2007 16:29:44 -0000 Subject: [Cluster-devel] cluster/cmirror-kernel/src dm-cmirror-client.c ... Message-ID: <20070219162944.9824.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 Branch: RHEL4 Changes by: jbrassow at sourceware.org 2007-02-19 16:29:43 Modified files: cmirror-kernel/src: dm-cmirror-client.c dm-cmirror-server.c Log message: Bug 228070: DLM assertion when running GFS I/O during cmirror leg failure When a log server drops out of the cluster, it ignores any requests - forcing the clients to retry. Unfortunately, the clients never ran another election - causing operations to stall. The server now replies that it cannot handle the requests, which causes proper initiation of elections. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cmirror-kernel/src/dm-cmirror-client.c.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.1.2.36&r2=1.1.2.37 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cmirror-kernel/src/dm-cmirror-server.c.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.1.2.21&r2=1.1.2.22 --- cluster/cmirror-kernel/src/Attic/dm-cmirror-client.c 2007/02/14 17:44:07 1.1.2.36 +++ cluster/cmirror-kernel/src/Attic/dm-cmirror-client.c 2007/02/19 16:29:42 1.1.2.37 @@ -1058,6 +1058,10 @@ rtn = consult_server(lc, 0, LRT_GET_RESYNC_WORK, region); + if (*region > lc->region_count) { + DMWARN("Error while getting resync work: bad region"); + rtn = 0; + } return rtn; } --- cluster/cmirror-kernel/src/Attic/dm-cmirror-server.c 2007/02/14 17:44:07 1.1.2.21 +++ cluster/cmirror-kernel/src/Attic/dm-cmirror-server.c 2007/02/19 16:29:42 1.1.2.22 @@ -938,7 +938,7 @@ case LRT_MARK_REGION: if(!(nodeid = ipaddr_to_nodeid((struct sockaddr *)msg.msg_name))){ - return -EINVAL; + error = -ENXIO; break; } error = server_mark_region(lc, &lr, nodeid); @@ -947,7 +947,7 @@ case LRT_CLEAR_REGION: if(!(nodeid = ipaddr_to_nodeid((struct sockaddr *)msg.msg_name))){ - return -EINVAL; + error = -ENXIO; break; } error = server_clear_region(lc, &lr, nodeid); @@ -955,7 +955,7 @@ case LRT_GET_RESYNC_WORK: if(!(nodeid = ipaddr_to_nodeid((struct sockaddr *)msg.msg_name))){ - return -EINVAL; + error = -ENXIO; break; } error = server_get_resync_work(lc, &lr, nodeid);