[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 ... ?