[DRBD-cvs] r1480 - in trunk: . debian drbd

drbd-user@lists.linbit.com drbd-user@lists.linbit.com
Sat, 31 Jul 2004 16:06:52 +0200 (CEST)


Author: lars
Date: 2004-07-31 16:06:51 +0200 (Sat, 31 Jul 2004)
New Revision: 1480

Modified:
   trunk/ChangeLog
   trunk/debian/changelog
   trunk/drbd.spec.in
   trunk/drbd/Makefile
   trunk/drbd/drbd_bitmap.c
   trunk/drbd/drbd_compat_wrappers.h
   trunk/drbd/drbd_int.h
   trunk/drbd/drbd_proc.c
   trunk/drbd/drbd_receiver.c
   trunk/drbd/drbd_req.c
   trunk/drbd/drbd_worker.c
Log:
- io_errors on READA are always passed on
- fixed the resync status overflow in drbd_resync_finished,
  added missig changelog item for it
- account for sync paused state in syncer statistics
- added dependencies for drbd_buildtag.c in drbd/Makefile
- copy'n'paste error in printk error reporting



Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2004-07-30 13:36:34 UTC (rev 1479)
+++ trunk/ChangeLog	2004-07-31 14:06:51 UTC (rev 1480)
@@ -4,6 +4,7 @@
   *) Workaround for XFS' IO requests with page count of zero.
   *) Handle the human and the timeout count correctly in the new init script.
   *) The implementation of the incon-degr-cmd was missing, added.
+  *) Fix for integer overflow in /proc/drbd syncer progress display
   *) Longer timeouts in drbdadm for drbdsetup commands witch operate on 
      meta data.
   *) New major number 147 (officially registered at lanana.org).

Modified: trunk/debian/changelog
===================================================================
--- trunk/debian/changelog	2004-07-30 13:36:34 UTC (rev 1479)
+++ trunk/debian/changelog	2004-07-31 14:06:51 UTC (rev 1480)
@@ -4,6 +4,7 @@
   * Workaround for XFS' IO requests with page count of zero.
   * Handle the human and the timeout count correctly in the new init script.
   * The implementation of the incon-degr-cmd was missing, added.
+  * Fix for integer overflow in /proc/drbd syncer progress display
   * Longer timeouts in drbdadm for drbdsetup commands witch operate on 
     meta data.
   * New major number 147 (officially registered at lanana.org).

Modified: trunk/drbd/Makefile
===================================================================
--- trunk/drbd/Makefile	2004-07-30 13:36:34 UTC (rev 1479)
+++ trunk/drbd/Makefile	2004-07-31 14:06:51 UTC (rev 1480)
@@ -66,6 +66,12 @@
     KDIR := /lib/modules/$(shell uname -r)/build
   endif
 
+  SRC_FILES := $(shell ls 2>/dev/null\
+	linux/drbd_config.h linux/drbd.h drbd_actlog.c drbd_bitmap.c drbd_fs.c \
+	drbd_main.c drbd_proc.c drbd_receiver.c drbd_req.c drbd_worker.c \
+	lru_cache.c drbd_compat_types.h drbd_compat_wrappers.h drbd_int.h \
+	lru_cache.h hlist.h mempool-2.4.c mempool.h)
+
   .PHONY: drbd.o default all greeting clean kbuild install dep
 
   drbd.o: greeting kbuild
@@ -81,9 +87,14 @@
   endif
 	@echo ""
 
-  drbd_buildtag.c:
-	@echo "you probably need to do a 'make' in DRBDs toplevel directory.";\
-	false
+  drbd_buildtag.c: $(SRC_FILES)
+	@if grep ^drbd/drbd_buildtag.c: ../Makefile &>/dev/null; then \
+	  $(MAKE) -C .. drbd/drbd_buildtag.c ;\
+	 else \
+	  echo "drbd_buildtag.c outdated." ;\
+	  echo "you probably need to do a 'make' in DRBDs toplevel directory.";\
+	  false ;\
+	 fi
 
   kbuild: drbd_buildtag.c
 	@rm -f .kernelrelease*

Modified: trunk/drbd/drbd_bitmap.c
===================================================================
--- trunk/drbd/drbd_bitmap.c	2004-07-30 13:36:34 UTC (rev 1479)
+++ trunk/drbd/drbd_bitmap.c	2004-07-31 14:06:51 UTC (rev 1480)
@@ -621,7 +621,7 @@
 	if (!drbd_md_sync_page_io(mdev,on_disk_sector,WRITE)) {
 		int i;
 		err = -EIO;
-		ERR( "IO ERROR reading bitmap sector %lu "
+		ERR( "IO ERROR writing bitmap sector %lu "
 		     "(meta-disk sector %lu)\n",
 		     enr, (unsigned long)on_disk_sector );
 		drbd_chk_io_error(mdev, 1);

Modified: trunk/drbd/drbd_compat_wrappers.h
===================================================================
--- trunk/drbd/drbd_compat_wrappers.h	2004-07-30 13:36:34 UTC (rev 1479)
+++ trunk/drbd/drbd_compat_wrappers.h	2004-07-31 14:06:51 UTC (rev 1480)
@@ -263,7 +263,7 @@
 static inline void drbd_generic_make_request(int rw, struct buffer_head *bh)
 {
 	drbd_dev *mdev = drbd_conf -1 ;
-	
+
 	if (!bh->b_rdev) {
 		if (DRBD_ratelimit(5*HZ,5)) {
 			printk(KERN_ERR "drbd_generic_make_request: bh->b_rdev == NULL\n");
@@ -571,7 +571,7 @@
 static inline void drbd_generic_make_request(int rw, struct bio *bio)
 {
 	drbd_dev *mdev = drbd_conf -1; // for DRBD_ratelimit
-	bio->bi_rw = rw; //??
+	bio->bi_rw = rw; // on the receiver side, e->..rw was not yet defined.
 
 	if (!bio->bi_bdev) {
 		if (DRBD_ratelimit(5*HZ,5)) {

Modified: trunk/drbd/drbd_int.h
===================================================================
--- trunk/drbd/drbd_int.h	2004-07-30 13:36:34 UTC (rev 1479)
+++ trunk/drbd/drbd_int.h	2004-07-31 14:06:51 UTC (rev 1480)
@@ -928,6 +928,9 @@
 #define BM_BIT_TO_SECT(x)   ((x)<<(BM_BLOCK_SIZE_B-9))
 #define BM_SECT_PER_BIT     BM_BIT_TO_SECT(1)
 
+/* bit to represented kilo byte conversion */
+#define Bit2KB(bits) ((bits)<<(BM_BLOCK_SIZE_B-10))
+
 /* in which _bitmap_ extent (resp. sector) the bit for a certain
  * _storage_ sector is located in */
 #define BM_SECT_TO_EXT(x)   ((x)>>(BM_EXT_SIZE_B-9))

Modified: trunk/drbd/drbd_proc.c
===================================================================
--- trunk/drbd/drbd_proc.c	2004-07-30 13:36:34 UTC (rev 1479)
+++ trunk/drbd/drbd_proc.c	2004-07-31 14:06:51 UTC (rev 1480)
@@ -48,7 +48,6 @@
  *	[=====>..............] 33.5% (23456/123456)
  *	finish: 2:20:20 speed: 6,345 (6,456) K/sec
  */
-#define Bit2KB(bits) ((bits)<<(BM_BLOCK_SIZE_B-10))
 STATIC int drbd_syncer_progress(struct Drbd_Conf* mdev,char *buf)
 {
 	int sz = 0;
@@ -121,10 +120,9 @@
 		sz += sprintf(buf + sz, " speed: %ld", dbdt);
 
 	/* mean speed since syncer started
-	 * FIXME introduce some additional "paused jiffies",
-	 * so we can account for PausedSync periods */
-	dt = (jiffies - mdev->rs_start) / HZ;
-	if (!dt) dt++;
+	 * we do account for PausedSync periods */
+	dt = (jiffies - mdev->rs_start - mdev->rs_paused) / HZ;
+	if (dt <= 0) dt=1;
 	db = mdev->rs_total - rs_left;
 	dbdt = Bit2KB(db/dt);
 	if (dbdt > 1000)
@@ -176,6 +174,8 @@
 		              : state_names[s];
 }
 
+/* FIXME we should use snprintf, we only have guaranteed room for one page...
+ * we should eventually use seq_file for this */
 int drbd_proc_get_info(char *buf, char **start, off_t offset,
 		       int len, int *unused, void *data)
 {

Modified: trunk/drbd/drbd_receiver.c
===================================================================
--- trunk/drbd/drbd_receiver.c	2004-07-30 13:36:34 UTC (rev 1479)
+++ trunk/drbd/drbd_receiver.c	2004-07-31 14:06:51 UTC (rev 1480)
@@ -1638,7 +1638,8 @@
 	 * otherwise this does not make much sense, no?
 	 * and some other assertion maybe about cstate...
 	 */
-	ERR_IF(mdev->cstate != Secondary) return FALSE;
+	ERR_IF(mdev->state != Secondary || mdev->cstate != Connected)
+		return FALSE;
 
 	drbd_bm_lock(mdev);
 	drbd_bm_set_all(mdev);

Modified: trunk/drbd/drbd_req.c
===================================================================
--- trunk/drbd/drbd_req.c	2004-07-30 13:36:34 UTC (rev 1479)
+++ trunk/drbd/drbd_req.c	2004-07-31 14:06:51 UTC (rev 1480)
@@ -235,7 +235,7 @@
 				   mdev->cstate > WFBitMapT) );
 
 	local = inc_local(mdev);
-	// FIXME special case handling of READA ??
+	NOT_IN_26( if (rw == READA) rw=READ );
 	if (rw == READ || rw == READA) {
 		if (local) {
 			if (!drbd_may_do_local_read(mdev,sector,size)) {
@@ -268,6 +268,19 @@
 		remote = 1;
 	}
 
+	/* If we have a disk, but a READA request is mapped to remote,
+	 * we are Primary, Inconsistent, SyncTarget.
+	 * Just fail that READA request right here.
+	 *
+	 * THINK: maybe fail all READA when not local?
+	 *        or make this configurable...
+	 *        if network is slow, READA won't do any good.
+	 */
+	if (rw == READA && !test_bit(DISKLESS,&mdev->flags) && !local) {
+		drbd_bio_IO_error(bio);
+		return 0;
+	}
+
 	if (rw == WRITE && local)
 		drbd_al_begin_io(mdev, sector);
 
@@ -332,6 +345,8 @@
 		 */
 		if(rw == WRITE) mdev->writ_cnt += size>>9;
 		else            mdev->read_cnt += size>>9;
+
+		// in 2.4.X, READA are submitted as READ.
 		drbd_generic_make_request(rw,&req->private_bio);
 	}
 

Modified: trunk/drbd/drbd_worker.c
===================================================================
--- trunk/drbd/drbd_worker.c	2004-07-30 13:36:34 UTC (rev 1479)
+++ trunk/drbd/drbd_worker.c	2004-07-31 14:06:51 UTC (rev 1480)
@@ -160,6 +160,7 @@
 	req = container_of(bh,struct drbd_request,private_bio);
 	PARANOIA_BUG_ON(!VALID_POINTER(req));
 
+	// no special case for READA here, in 2.4.X we submit them as READ.
 	if (!uptodate) {
 		// for the panic:
 		drbd_chk_io_error(mdev,!uptodate); // handle panic and detach.
@@ -302,23 +303,14 @@
 	ERR_IF (bio->bi_size)
 		return 1;
 
-#if 0
-	{
-		static int ccc=1;
-
-		if(ccc++ % 100 == 0) {
-			ERR("Injecting IO error.\n");
-			error=-5;
-			clear_bit(BIO_UPTODATE,&bio->bi_flags);
-		}
-	}
-#endif
-
 	PARANOIA_BUG_ON(!IS_VALID_MDEV(mdev));
 
 	req = container_of(bio,struct drbd_request,private_bio);
 	PARANOIA_BUG_ON(!VALID_POINTER(req));
 
+	/* READAs may fail.
+	 * upper layers need to be able to handle that themselves */
+	if (bio_rw(bio) == READA) goto pass_on;
 	if (error) {
 		drbd_chk_io_error(mdev,error); // handle panic and detach.
 		if(mdev->on_io_error == PassOn) goto pass_on;
@@ -529,14 +521,15 @@
 
 int drbd_resync_finished(drbd_dev* mdev)
 {
-	unsigned long dt;
-	sector_t n;
+	unsigned long db,dt,dbdt;
 
-	dt = (jiffies - mdev->rs_start) / HZ + 1;
-	n = mdev->rs_total << (BM_BLOCK_SIZE_B-10);
-	sector_div(n,dt);
-	INFO("Resync done (total %lu sec; %lu K/sec)\n",
-	     dt,(unsigned long)n);
+	dt = (jiffies - mdev->rs_start - mdev->rs_paused) / HZ;
+	if (dt <= 0) dt=1;
+	db = mdev->rs_total;
+	dbdt = Bit2KB(db/dt);
+	mdev->rs_paused /= HZ;
+	INFO("Resync done (total %lu sec; paused %lu sec; %lu K/sec)\n",
+	     dt + mdev->rs_paused, mdev->rs_paused, dbdt);
 
 	if (mdev->cstate == SyncTarget || mdev->cstate == PausedSyncT) {
 		drbd_md_set_flag(mdev,MDF_Consistent);
@@ -553,7 +546,8 @@
 	// assert that all bit-map parts are cleared.
 	D_ASSERT(list_empty(&mdev->resync->lru));
 	D_ASSERT(drbd_bm_total_weight(mdev) == 0);
-	mdev->rs_total = 0;
+	mdev->rs_total  = 0;
+	mdev->rs_paused = 0;
 
 	set_cstate(mdev,Connected);
 	/* FIXME
@@ -690,6 +684,7 @@
 	D_ASSERT(ns == SyncSource || ns == SyncTarget);
 
 	INFO("Syncer continues.\n");
+	mdev->rs_paused += (long)jiffies-(long)mdev->rs_mark_time;
 	_set_cstate(mdev,ns);
 
 	if(mdev->cstate == SyncTarget) {
@@ -718,6 +713,8 @@
 
 	if(mdev->cstate == SyncTarget) set_bit(STOP_SYNC_TIMER,&mdev->flags);
 
+	mdev->rs_mark_time = jiffies;
+	// mdev->rs_mark_left = drbd_bm_total_weight(mdev); // I don't care...
 	_set_cstate(mdev,ns);
 	INFO("Syncer waits for sync group.\n");
 }
@@ -867,6 +864,7 @@
 	set_cstate(mdev,side);
 	mdev->rs_total     =
 	mdev->rs_mark_left = drbd_bm_total_weight(mdev);
+	mdev->rs_paused    = 0;
 	mdev->rs_start     =
 	mdev->rs_mark_time = jiffies;
 

Modified: trunk/drbd.spec.in
===================================================================
--- trunk/drbd.spec.in	2004-07-30 13:36:34 UTC (rev 1479)
+++ trunk/drbd.spec.in	2004-07-31 14:06:51 UTC (rev 1480)
@@ -183,6 +183,7 @@
   * Workaround for XFS' IO requests with page count of zero.
   * Handle the human and the timeout count correctly in the new init script.
   * The implementation of the incon-degr-cmd was missing, added.
+  * Fix for integer overflow in /proc/drbd syncer progress display
   * Longer timeouts in drbdadm for drbdsetup commands witch operate on 
     meta data.
   * New major number 147 (officially registered at lanana.org).