[DRBD-cvs] drbd by lars; make cstate volatile in two places, mayb...

drbd-user@lists.linbit.com drbd-user@lists.linbit.com
Mon, 26 Apr 2004 18:24:18 +0200 (CEST)


DRBD CVS committal

Author  : lars
Module  : drbd

Dir     : drbd/drbd


Modified Files:
      Tag: rel-0_7-branch
	drbd_main.c 


Log Message:
make cstate volatile in two places, maybe this helps Eugene
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_main.c,v
retrieving revision 1.73.2.154
retrieving revision 1.73.2.155
diff -u -3 -r1.73.2.154 -r1.73.2.155
--- drbd_main.c	24 Apr 2004 16:35:21 -0000	1.73.2.154
+++ drbd_main.c	26 Apr 2004 16:24:13 -0000	1.73.2.155
@@ -389,6 +389,7 @@
 
 	os = mdev->cstate;
 	mdev->cstate = ns;
+	smp_mb();
 	wake_up_interruptible(&mdev->cstate_wait);
 
 	if ( ( os==SyncSource || os==SyncTarget ) && ns <= Connected ) {
@@ -398,6 +399,9 @@
 	}
 	if(test_bit(MD_IO_ALLOWED,&mdev->flags) &&
 	   test_bit(DISKLESS,&mdev->flags) && ns < Connected) {
+
+/* are you SURE you want this HERE ? */
+
 		clear_bit(DISKLESS,&mdev->flags);
 		smp_wmb();
 		clear_bit(MD_IO_ALLOWED,&mdev->flags);
@@ -714,7 +718,11 @@
 	// long elapsed = (long)(jiffies - mdev->last_received);
 	// DUMPLU(elapsed); // elapsed ignored for now.
 
-	if (mdev->meta.socket == sock || !mdev->asender.task)
+	drop_it =   mdev->meta.socket == sock
+		|| !mdev->asender.task
+		|| (volatile int)mdev->cstate < Connected;
+
+	if (drop_it)
 		return TRUE;
 
 	drop_it = !--mdev->ko_count;
@@ -891,7 +899,7 @@
 	int rv,sent=0;
 
 	if (!sock) return -1000;
-	if (mdev->cstate < WFReportParams) return -1001;
+	if ((volatile int)mdev->cstate < WFReportParams) return -1001;
 
 	// THINK  if (signal_pending) return ... ?