[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) ) {