[DRBD-cvs] drbd by phil; Fix for a 32-64 Bit problem, discovered ...

drbd-user@lists.linbit.com drbd-user@lists.linbit.com
Fri, 2 Jul 2004 13:58:50 +0200 (CEST)


DRBD CVS committal

Author  : phil
Module  : drbd

Dir     : drbd/drbd


Modified Files:
      Tag: rel-0_7-branch
	drbd_fs.c drbd_int.h 


Log Message:
Fix for a 32-64 Bit problem, discovered by LMB on s390x
(reproducible on any long=64b int=32b platform, like Alpha)

===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_fs.c,v
retrieving revision 1.28.2.107
retrieving revision 1.28.2.108
diff -u -3 -r1.28.2.107 -r1.28.2.108
--- drbd_fs.c	1 Jul 2004 10:11:12 -0000	1.28.2.107
+++ drbd_fs.c	2 Jul 2004 11:58:45 -0000	1.28.2.108
@@ -1055,13 +1055,19 @@
 		// We can drop the mutex, we do not touch anything in mdev.
 		up(&mdev->device_mutex);
 
-		err = wait_event_interruptible_timeout(
+		time = wait_event_interruptible_timeout(
 			mdev->cstate_wait,
 			mdev->cstate < Unconnected
 			|| mdev->cstate >= Connected,
 			time );
-		if (err == 0) err = -ETIME;
-		if (err < 0) goto out_unlocked;
+		if (time < 0) {
+			err = time;
+			goto out_unlocked;
+		}
+		if (time == 0) {
+			err = -ETIME;
+			goto out_unlocked;
+		}
 		err=0; // no error
 
 		if(put_user(mdev->cstate>=Connected,&wp->ret_code))err=-EFAULT;
@@ -1074,19 +1080,28 @@
 		up(&mdev->device_mutex);
 
 		do {
-			if (mdev->cstate > Connected)
-				time=MAX_SCHEDULE_TIMEOUT;
-			// XXX else back to user supplied timeout ??
-			err = wait_event_interruptible_timeout(
+			time = wait_event_interruptible_timeout(
 				mdev->cstate_wait,
 				mdev->cstate == Connected
 				|| mdev->cstate < Unconnected,
 				time );
-			if (err == 0) err = -ETIME;
-			if (err < 0) goto out_unlocked;
-		} while (err > 0
-			 && mdev->cstate != Connected
-			 && mdev->cstate >= Unconnected);
+
+			if (time < 0 ) {
+				err = time;
+				goto out_unlocked;
+			}
+
+			if (mdev->cstate > Connected) {
+				time=MAX_SCHEDULE_TIMEOUT;
+			}
+
+			if (time == 0) {
+				err = -ETIME;
+				goto out_unlocked;
+			}
+		} while ( mdev->cstate != Connected
+			  && mdev->cstate >= Unconnected );
+
 		err=0; // no error
 
 		if(put_user(mdev->cstate==Connected,&wp->ret_code))err=-EFAULT;
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_int.h,v
retrieving revision 1.58.2.181
retrieving revision 1.58.2.182
diff -u -3 -r1.58.2.181 -r1.58.2.182
--- drbd_int.h	1 Jul 2004 10:11:12 -0000	1.58.2.181
+++ drbd_int.h	2 Jul 2004 11:58:45 -0000	1.58.2.182
@@ -1040,7 +1040,7 @@
 
 #define wait_event_interruptible_timeout(wq, condition, timeout)	\
 ({									\
-	unsigned long __ret = timeout;						\
+	long __ret = timeout;						\
 	if (!(condition))						\
 		__wait_event_interruptible_timeout(wq, condition, __ret); \
 	__ret;								\