[DRBD-cvs] drbd by phil; * Fixed another annoying special case wi...

drbd-user@lists.linbit.com drbd-user@lists.linbit.com
Sun, 7 Mar 2004 21:17:23 +0100 (CET)


DRBD CVS committal

Author  : phil
Module  : drbd

Dir     : drbd/drbd


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


Log Message:
* Fixed another annoying special case with the resync code.
  [Triggered if accidentially w_make_resync_request() just 
  stopped one of its runs, when all requests for this resync
  process were issued. -> But since it has not yet seen the
  MBDS_DONE we run into the ASSERTION in w_update_odbm() ]

* Removed gs_snr. Was unused.

* Increased the time drbdsetup may take. Reading AL and BitMap
  can take some time on real systems...   

===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_dsender.c,v
retrieving revision 1.1.2.82
retrieving revision 1.1.2.83
diff -u -3 -r1.1.2.82 -r1.1.2.83
--- drbd_dsender.c	7 Mar 2004 17:57:25 -0000	1.1.2.82
+++ drbd_dsender.c	7 Mar 2004 20:17:18 -0000	1.1.2.83
@@ -456,7 +456,12 @@
 		}
 	}
 
-   requeue:
+ requeue:
+	if(bm_is_rs_done(mdev->mbds_id)) {
+		mdev->resync_work.cb = w_resync_inactive;
+		return 1;
+	}
+
 	mdev->resync_timer.expires = jiffies + SLEEP_TIME;
 	add_timer(&mdev->resync_timer);
 	return 1;
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_int.h,v
retrieving revision 1.58.2.134
retrieving revision 1.58.2.135
diff -u -3 -r1.58.2.134 -r1.58.2.135
--- drbd_int.h	7 Mar 2004 11:49:23 -0000	1.58.2.134
+++ drbd_int.h	7 Mar 2004 20:17:18 -0000	1.58.2.135
@@ -571,7 +571,6 @@
 	unsigned long size;
 	unsigned long* bm;
 	unsigned long gs_bitnr;
-	unsigned long gs_snr;
 	spinlock_t bm_lock;
 };
 
@@ -810,6 +809,8 @@
 extern int bm_get_bit(struct BitMap* sbm, sector_t sector, int size);
 extern int bm_count_sectors(struct BitMap* sbm, unsigned long enr);
 extern int bm_end_of_dev_case(struct BitMap* sbm);
+extern int bm_is_rs_done(struct BitMap* sbm);
+
 
 
 extern drbd_dev *drbd_conf;
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_main.c,v
retrieving revision 1.73.2.141
retrieving revision 1.73.2.142
diff -u -3 -r1.73.2.141 -r1.73.2.142
--- drbd_main.c	7 Mar 2004 10:51:57 -0000	1.73.2.141
+++ drbd_main.c	7 Mar 2004 20:17:18 -0000	1.73.2.142
@@ -1879,6 +1879,25 @@
 	return ret;
 }
 
+int bm_is_rs_done(struct BitMap* sbm)
+{
+	int rv=0;
+
+	spin_lock(&sbm->bm_lock);
+
+	if( (sbm->gs_bitnr<<BM_SS) + ((1<<BM_SS)-1) > sbm->dev_size<<1) {
+		int ns = sbm->dev_size % (1<<(BM_BLOCK_SIZE_B-10));
+		if(!ns) {
+			sbm->gs_bitnr = -1;
+			rv=1;
+		}
+	}
+
+	spin_unlock(&sbm->bm_lock);
+
+	return rv;
+}
+
 void bm_reset(struct BitMap* sbm)
 {
 	spin_lock(&sbm->bm_lock);