[DRBD-cvs] drbd by lars; change bitmap send. it still works with ...

drbd-user@lists.linbit.com drbd-user@lists.linbit.com
Wed, 19 May 2004 17:36:10 +0200 (CEST)


DRBD CVS committal

Author  : lars
Module  : drbd

Dir     : drbd/drbd


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


Log Message:
change bitmap send.
 it still works with my test setup, so it at least won't worsen things.
 hopefully it fixes some issues with bitmap being modified during bitmap handshake.
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_main.c,v
retrieving revision 1.73.2.177
retrieving revision 1.73.2.178
diff -u -3 -r1.73.2.177 -r1.73.2.178
--- drbd_main.c	18 May 2004 16:20:42 -0000	1.73.2.177
+++ drbd_main.c	19 May 2004 15:36:05 -0000	1.73.2.178
@@ -680,7 +680,7 @@
 }
 
 /* See the comment at receive_bitmap() */
-int drbd_send_bitmap(drbd_dev *mdev)
+int _drbd_send_bitmap(drbd_dev *mdev)
 {
 	int buf_i,want;
 	int ok=TRUE, bm_i=0;
@@ -703,10 +703,20 @@
 		want=min_t(int,MBDS_PACKET_SIZE,(bm_words-bm_i)*sizeof(long));
 		for(buf_i=0;buf_i<want/sizeof(long);buf_i++)
 			buffer[buf_i] = cpu_to_lel(bm[bm_i++]);
-		ok = drbd_send_cmd(mdev,mdev->data.socket,ReportBitMap,
-				   p, sizeof(*p) + want);
+		ok = _drbd_send_cmd(mdev,mdev->data.socket,ReportBitMap,
+				   p, sizeof(*p) + want, 0);
 	} while (ok && want);
+
 	vfree(p);
+	return ok;
+}
+
+int drbd_send_bitmap(drbd_dev *mdev)
+{
+	int ok;
+	down(&mdev->data.mutex);
+	ok=_drbd_send_bitmap(mdev);
+	up(&mdev->data.mutex);
 	return ok;
 }
 
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_receiver.c,v
retrieving revision 1.97.2.159
retrieving revision 1.97.2.160
diff -u -3 -r1.97.2.159 -r1.97.2.160
--- drbd_receiver.c	18 May 2004 22:06:55 -0000	1.97.2.159
+++ drbd_receiver.c	19 May 2004 15:36:05 -0000	1.97.2.160
@@ -1247,8 +1247,21 @@
 
 		if( sync ) {
 			if(have_good == 1) {
-				drbd_send_bitmap(mdev);
+				/*
+				 * receiver expects the whole bitmap in one go.
+				 * so get the data.mutex here.
+				 * set_cstate within the mutex to avoid a race
+				 * between up() and the
+				 * wait_event(cstate != WFBitMap*) condition
+				 * above.
+				 */
+				down(&mdev->data.mutex);
 				set_cstate(mdev,WFBitMapS);
+				/* FIXME, here we actually have to wait for
+				 * ap_bio_cnt == 0 and/or local_cnt == 0
+				 */
+				_drbd_send_bitmap(mdev);
+				up(&mdev->data.mutex);
 			} else { // have_good == -1
 				if ( (mdev->state == Primary) &&
 				     (mdev->gen_cnt[Flags] & MDF_Consistent) ) {