[DRBD-cvs] svn commit by lars - r3062 - branches/drbd-0.7/drbd - get on-disk bitmap update out of the generic_make_reque

drbd-cvs at lists.linbit.com drbd-cvs at lists.linbit.com
Mon Sep 17 11:15:43 CEST 2007


Author: lars
Date: 2007-09-17 11:15:41 +0200 (Mon, 17 Sep 2007)
New Revision: 3062

Modified:
   branches/drbd-0.7/drbd/drbd_actlog.c
Log:
get on-disk bitmap update out of the generic_make_request path
would deadlock due to recursion prevention patch in kernel now
 (0.7 equivalent of r3024)


Modified: branches/drbd-0.7/drbd/drbd_actlog.c
===================================================================
--- branches/drbd-0.7/drbd/drbd_actlog.c	2007-09-07 10:23:50 UTC (rev 3061)
+++ branches/drbd-0.7/drbd/drbd_actlog.c	2007-09-17 09:15:41 UTC (rev 3062)
@@ -196,6 +196,8 @@
 	struct lc_element * al_ext;
 	struct completion event;
 	unsigned int enr;
+	/* if old_enr != LC_FREE, write corresponding bitmap sector, too */
+	unsigned int old_enr;
 };
 
 STATIC int w_al_write_transaction(struct Drbd_Conf *, struct drbd_work *, int);
@@ -242,15 +244,6 @@
 	wait_event(mdev->al_wait, (al_ext = _al_get(mdev,enr)) );
 
 	if (al_ext->lc_number != enr) {
-		// We have to do write an transaction to AL.
-		unsigned int evicted;
-
-		evicted = al_ext->lc_number;
-
-		if(mdev->cstate < Connected && evicted != LC_FREE ) {
-			drbd_bm_write_sect(mdev, evicted/AL_EXT_PER_BM_SECT );
-		}
-
 		/* drbd_al_write_transaction(mdev,al_ext,enr);
 		   generic_make_request() are serialized on the 
 		   current->bio_tail list now. Therefore we have
@@ -259,10 +252,11 @@
 		init_completion(&al_work.event);
 		al_work.al_ext = al_ext;
 		al_work.enr = enr;
+		al_work.old_enr = al_ext->lc_number;
 		al_work.w.cb = w_al_write_transaction;
 		drbd_queue_work_front(mdev,&mdev->data.work,&al_work.w);
 		wait_for_completion(&al_work.event);
-		
+
 		mdev->al_writ_cnt++;
 
 		/*
@@ -302,14 +296,23 @@
 STATIC int
 w_al_write_transaction(struct Drbd_Conf *mdev, struct drbd_work *w, int unused)
 {
+	struct update_al_work *aw = (struct update_al_work*)w;
+	struct lc_element *updated = aw->al_ext;
+	const unsigned int new_enr = aw->enr;
+	const unsigned int evicted = aw->old_enr;
+
+	struct al_transaction* buffer;
+	sector_t sector;
 	int i,n,mx;
 	unsigned int extent_nr;
-	struct al_transaction* buffer;
-	sector_t sector;
 	u32 xor_sum=0;
 
-	struct lc_element *updated = ((struct update_al_work*)w)->al_ext;
-	unsigned int new_enr = ((struct update_al_work*)w)->enr;
+	/* do we have to do a bitmap write, first?
+	 * TODO reduce maximum latency:
+	 * submit both bios, then wait for both,
+	 * instead of doing two synchronous sector writes. */
+	if (mdev->cstate < Connected && evicted != LC_FREE)
+		drbd_bm_write_sect(mdev, evicted/AL_EXT_PER_BM_SECT);
 
 	down(&mdev->md_io_mutex); // protects md_io_buffer, al_tr_cycle, ...
 	buffer = (struct al_transaction*)page_address(mdev->md_io_page);



More information about the drbd-cvs mailing list