[DRBD-cvs] drbd by phil; * drop write-hint packets if they can no...

drbd-user@lists.linbit.com drbd-user@lists.linbit.com
Sat, 7 Feb 2004 17:37:55 +0100 (CET)


DRBD CVS committal

Author  : phil
Module  : drbd

Dir     : drbd/drbd


Modified Files:
      Tag: rel-0_7-branch
	drbd_actlog.c drbd_dsender.c drbd_fs.c drbd_int.h drbd_main.c 
	drbd_receiver.c drbd_req-2.4.c 


Log Message:
* drop write-hint packets if they can not be sent immediately. 
* Lots of work on the disk-less-node case.
  . Resync gets started if a disk-less node gets a disk again...

===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_actlog.c,v
retrieving revision 1.1.2.68
retrieving revision 1.1.2.69
diff -u -3 -r1.1.2.68 -r1.1.2.69
--- drbd_actlog.c	5 Feb 2004 15:17:36 -0000	1.1.2.68
+++ drbd_actlog.c	7 Feb 2004 16:37:49 -0000	1.1.2.69
@@ -424,6 +424,8 @@
 void drbd_write_bm(struct Drbd_Conf *mdev)
 {
 	unsigned int exts,i;
+
+	if( mdev->lo_file == 0) return;
 	exts = div_ceil(mdev->mbds_id->size,BM_EXTENT_SIZE);
 
 	for(i=0;i<exts;i++) {
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_dsender.c,v
retrieving revision 1.1.2.68
retrieving revision 1.1.2.69
diff -u -3 -r1.1.2.68 -r1.1.2.69
--- drbd_dsender.c	3 Feb 2004 07:57:14 -0000	1.1.2.68
+++ drbd_dsender.c	7 Feb 2004 16:37:49 -0000	1.1.2.69
@@ -267,7 +267,7 @@
 {
 	drbd_dev* mdev = (drbd_dev*) data;
 
-	if(unlikely(test_and_clear_bit(SYNC_PAUSED,&mdev->flags))) {
+	if(unlikely(test_and_clear_bit(STOP_SYNC_TIMER,&mdev->flags))) {
 		mdev->resync_work.cb = w_resync_inactive;
 	} else {
 		drbd_queue_work(mdev,&mdev->data.work,&mdev->resync_work);
@@ -443,7 +443,7 @@
 	D_ASSERT(mdev->cstate == SyncSource || mdev->cstate == SyncTarget);
 	ns = mdev->cstate + (PausedSyncS - SyncSource);
 
-	set_bit(SYNC_PAUSED,&mdev->flags);
+	if(mdev->cstate == SyncTarget) set_bit(STOP_SYNC_TIMER,&mdev->flags);
 
 	_set_cstate(mdev,ns);
 	INFO("Syncer waits for sync group.\n");
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_fs.c,v
retrieving revision 1.28.2.65
retrieving revision 1.28.2.66
diff -u -3 -r1.28.2.65 -r1.28.2.66
--- drbd_fs.c	6 Feb 2004 15:43:55 -0000	1.28.2.65
+++ drbd_fs.c	7 Feb 2004 16:37:49 -0000	1.28.2.66
@@ -290,12 +290,7 @@
 		goto release_bdev2_fail_ioctl;
 	}
 
-	drbd_sync_me(mdev); // XXX does this make sense?
-
-	drbd_thread_stop(&mdev->worker);
-	drbd_thread_stop(&mdev->asender);
-	drbd_thread_stop(&mdev->receiver);
-	drbd_free_resources(mdev);
+	drbd_free_ll_dev(mdev);
 
 	mdev->md_bdev  = bdev2;
 	mdev->md_file  = filp2;
@@ -362,7 +357,10 @@
 
 	drbd_set_blocksize(mdev,INITIAL_BLOCK_SIZE);
 
-	set_cstate(mdev,StandAlone);
+	if(mdev->cstate == Unconfigured ) set_cstate(mdev,StandAlone);
+	if(mdev->cstate >= Connected ) {
+		drbd_send_param(mdev,1);
+	}
 
 	return 0;
 
@@ -564,6 +562,7 @@
 		set_disk_ro(mdev->vdisk, FALSE );
 		D_ASSERT(mdev->this_bdev->bd_holder == drbd_sec_holder);
 		bd_release(mdev->this_bdev);
+		mdev->this_bdev->bd_disk = mdev->vdisk;
 )
 
 		if(newstate & Human) {
@@ -587,7 +586,7 @@
 	drbd_md_write(mdev);
 
 	if (mdev->cstate >= WFReportParams)
-		drbd_send_param(mdev);
+		drbd_send_param(mdev,0);
 
 	return 0;
 }
@@ -733,7 +732,7 @@
 		drbd_determin_dev_size(mdev);
 		drbd_md_write(mdev); // Write mdev->la_size to disk.
 		//#warning "yet an other reason to serialize all state changes on a rw_semaphore"
-		if (mdev->cstate == Connected) drbd_send_param(mdev);
+		if (mdev->cstate == Connected) drbd_send_param(mdev,0);
 		break;
 
 	case DRBD_IOCTL_SET_NET_CONFIG:
@@ -800,7 +799,7 @@
 		// TODO: Fix all this. Currently it is the 
 		// blissfully ignorant implementation.
 		drbd_free_ll_dev(mdev); 
-		if (mdev->cstate == Connected) drbd_send_param(mdev);
+		if (mdev->cstate == Connected) drbd_send_param(mdev,0);
 		if (mdev->cstate == StandAlone) set_cstate(mdev,Unconfigured);
 
 		break;
@@ -850,8 +849,10 @@
 		goto out_unlocked;
 
 	case DRBD_IOCTL_INVALIDATE:
-		if( mdev->cstate != Connected) {
-			err = -ENXIO;
+		if( mdev->cstate != Connected ||
+		    !mdev->lo_file || 
+		    test_bit(PARTNER_DISKLESS,&mdev->flags) ) {
+			err = -EINPROGRESS;
 			break;
 		}
 
@@ -863,8 +864,10 @@
 		break;
 
 	case DRBD_IOCTL_INVALIDATE_REM:
-		if( mdev->cstate != Connected) {
-			err = -ENXIO;
+		if( mdev->cstate != Connected ||
+		    !mdev->lo_file || 
+		    test_bit(PARTNER_DISKLESS,&mdev->flags) ) {
+			err = -EINPROGRESS;
 			break;
 		}
 
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_int.h,v
retrieving revision 1.58.2.116
retrieving revision 1.58.2.117
diff -u -3 -r1.58.2.116 -r1.58.2.117
--- drbd_int.h	6 Feb 2004 15:43:55 -0000	1.58.2.116
+++ drbd_int.h	7 Feb 2004 16:37:49 -0000	1.58.2.117
@@ -439,6 +439,7 @@
 	u32         sync_use_csums;
 	u32         skip_sync;
 	u32         sync_group;
+	u32         flags; // flags & 1 -> reply call drbd_send_param(mdev);
 } Drbd_Parameter_Packet  __attribute((packed));
 
 typedef union {
@@ -566,7 +567,7 @@
 #define COLLECT_ZOMBIES    1
 #define SEND_PING          2
 #define WRITER_PRESENT     3
-#define SYNC_PAUSED        4
+#define STOP_SYNC_TIMER    4
 #define DO_NOT_INC_CONCNT  5
 #define WRITE_HINT_QUEUED  6
 #define PARTNER_DISKLESS   7
@@ -732,7 +733,7 @@
 extern void drbd_free_sock(drbd_dev *mdev);
 /* extern int drbd_send(drbd_dev *mdev, struct socket *sock,
 	      void* buf, size_t size, unsigned msg_flags); */
-extern int drbd_send_param(drbd_dev *mdev);
+extern int drbd_send_param(drbd_dev *mdev, int flags);
 extern int drbd_send_cmd(drbd_dev *mdev, struct socket *sock,
 			  Drbd_Packet_Cmd cmd, Drbd_Header *h, size_t size);
 extern int drbd_send_sync_param(drbd_dev *mdev, struct syncer_config *sc);
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_main.c,v
retrieving revision 1.73.2.123
retrieving revision 1.73.2.124
diff -u -3 -r1.73.2.123 -r1.73.2.124
--- drbd_main.c	6 Feb 2004 15:43:55 -0000	1.73.2.123
+++ drbd_main.c	7 Feb 2004 16:37:49 -0000	1.73.2.124
@@ -539,12 +539,12 @@
 	    && !sc->skip )
 	{
 		set_cstate(mdev,WFReportParams);
-		ok = drbd_send_param(mdev);
+		ok = drbd_send_param(mdev,0);
 	}
 	return ok;
 }
 
-int drbd_send_param(drbd_dev *mdev)
+int drbd_send_param(drbd_dev *mdev, int flags)
 {
 	Drbd_Parameter_Packet p;
 	int ok,i;
@@ -569,6 +569,7 @@
 	p.sync_use_csums = cpu_to_be32(mdev->sync_conf.use_csums);
 	p.skip_sync      = cpu_to_be32(mdev->sync_conf.skip);
 	p.sync_group     = cpu_to_be32(mdev->sync_conf.group);
+	p.flags          = cpu_to_be32(flags);
 
 	ok = drbd_send_cmd(mdev,mdev->data.socket,ReportParams,(Drbd_Header*)&p,sizeof(p));
 	return ok;
@@ -996,19 +997,19 @@
 	/* In order to avoid deadlocks the receiver should only
 	   use blk_run_queue(). It must not use blk_run_queues() to 
 	   avoid deadlocks. 
+
+	   Maybe we should consider to use the plain drbd_send_cmd.
 	*/
 
-	if (drbd_send_cmd_dontwait(mdev,mdev->data.socket,WriteHint,&h,sizeof(h))==1){
-		spin_lock_irq(q->queue_lock);
-		blk_remove_plug(q);
-		spin_unlock_irq(q->queue_lock);
-	} else {
-		if(mdev->cstate < Connected) {
-			spin_lock_irq(q->queue_lock);
-			blk_remove_plug(q);
-			spin_unlock_irq(q->queue_lock);
-		}
+	if (drbd_send_cmd_dontwait(mdev,mdev->data.socket,WriteHint,&h,
+				   sizeof(h)) != 1) {
+		WARN("Have to drop sending of an io-hint\n");
 	}
+
+	spin_lock_irq(q->queue_lock);
+	blk_remove_plug(q);
+	spin_unlock_irq(q->queue_lock);
+
 }
 #endif
 
@@ -1849,6 +1850,12 @@
 	sector_t sector;
 	int i;
 
+ONLY_IN_26(
+	if (mdev->this_bdev->bd_disk == 0) { // strange...
+		mdev->this_bdev->bd_disk = mdev->vdisk; 
+	}
+)
+
 	if( mdev->lo_file == 0) return;
 
 	down(&mdev->md_io_mutex);
@@ -1871,6 +1878,7 @@
 	buffer->bm_offset = __constant_cpu_to_be32(MD_BM_OFFSET);
 
 	kunmap(mdev->md_io_page);
+	
 	sector = drbd_md_ss(mdev) + MD_GC_OFFSET;
 
 	drbd_md_sync_page_io(mdev,sector,WRITE);
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_receiver.c,v
retrieving revision 1.97.2.103
retrieving revision 1.97.2.104
diff -u -3 -r1.97.2.103 -r1.97.2.104
--- drbd_receiver.c	6 Feb 2004 15:43:55 -0000	1.97.2.103
+++ drbd_receiver.c	7 Feb 2004 16:37:49 -0000	1.97.2.104
@@ -633,7 +633,7 @@
 	drbd_thread_start(&mdev->asender);
 	drbd_thread_start(&mdev->worker);
 
-	drbd_send_param(mdev);
+	drbd_send_param(mdev,0);
 
 	return 1;
 }
@@ -1050,7 +1050,7 @@
 	    && !mdev->sync_conf.skip )
 	{
 		set_cstate(mdev,WFReportParams);
-		ok = drbd_send_param(mdev);
+		ok = drbd_send_param(mdev,0);
 	}
 
 	return ok;
@@ -1059,7 +1059,7 @@
 STATIC int receive_param(drbd_dev *mdev, Drbd_Header *h)
 {
 	Drbd_Parameter_Packet *p = (Drbd_Parameter_Packet*)h;
-	int no_sync=0;
+	int consider_sync;
 	int oo_state;
 	unsigned long p_size;
 
@@ -1097,49 +1097,56 @@
 		mdev->receiver.t_state = Exiting;
 		return FALSE;
 	}
+	mdev->p_size=p_size;
+
+	consider_sync = (mdev->cstate == WFReportParams);
+	if(drbd_determin_dev_size(mdev)) consider_sync=0;
+
+	if(be32_to_cpu(p->flags)&1) {
+		consider_sync=1;
+		drbd_send_param(mdev,2);
+	}
+	if(be32_to_cpu(p->flags)&2) consider_sync=1;
 
 	// XXX harmless race with ioctl ...
 	mdev->sync_conf.rate  =
 		max_t(int,mdev->sync_conf.rate, be32_to_cpu(p->sync_rate));
-	/* FIXME how to decide when use_csums differs??
-		mdev->sync_conf.use_csums  = ???
-	 */
+
 	// if one of them wants to skip, both of them should skip.
 	mdev->sync_conf.skip  =
 		mdev->sync_conf.skip != 0 || p->skip_sync != 0;
 	mdev->sync_conf.group =
 		min_t(int,mdev->sync_conf.group,be32_to_cpu(p->sync_group));
 
-	/* should be removed ?
-	if(be64_to_cpu(param.protocol)!=mdev->lo_usize) {
-		printk(KERN_ERR DEVICE_NAME"%d: Size hints inconsistent \n",
-		       minor);
-		set_cstate(mdev,StandAlone);
-		mdev->receiver.t_state = Exiting;
-		return FALSE;
-	}
-	*/
-
-	mdev->p_size=p_size;
 	if( mdev->lo_usize != be64_to_cpu(p->u_size) ) {
 		mdev->lo_usize = be64_to_cpu(p->u_size);
 		INFO("Peer sets u_size to %ld KB\n",mdev->lo_usize);
 	}
 
-	if(p_size) clear_bit(PARTNER_DISKLESS, &mdev->flags);
-	else set_bit(PARTNER_DISKLESS, &mdev->flags);
-
-	no_sync=drbd_determin_dev_size(mdev);
-
-	if( drbd_get_capacity(mdev->this_bdev) == 0) {
-		set_cstate(mdev,StandAlone);
-		mdev->receiver.t_state = Exiting;
-		return FALSE;
+	if(!p_size) {
+		set_bit(PARTNER_DISKLESS, &mdev->flags);
+		if(mdev->cstate >= Connected ) {
+			if(mdev->state == Primary) tl_clear(mdev);
+			if(mdev->state == Primary || 
+			   be32_to_cpu(p->state) == Primary ) {
+				drbd_md_inc(mdev,ConnectedCnt);
+			}
+		}
+		if(mdev->cstate > Connected ) {
+			WARN("Resync aborted.\n");
+			if(mdev->cstate == SyncTarget)
+				set_bit(STOP_SYNC_TIMER,&mdev->flags);
+			set_cstate(mdev,Connected);
+		}
 	}
+	else clear_bit(PARTNER_DISKLESS, &mdev->flags);
 
 	if (mdev->cstate == WFReportParams) {
-		int have_good,sync;
 		INFO("Connection established.\n");
+	}
+
+	if (consider_sync) {
+		int have_good,sync;
 
 		have_good=drbd_md_compare(mdev,p);
 
@@ -1148,7 +1155,7 @@
 
 		//INFO("have_good=%d sync=%d\n", have_good, sync);
 
-		if ( mdev->sync_conf.skip && sync && !no_sync ) {
+		if ( mdev->sync_conf.skip && sync ) {
 			if (have_good == 1)
 				set_cstate(mdev,SkippedSyncS);
 			else // have_good == -1
@@ -1156,14 +1163,14 @@
 			goto skipped;
 		}
 
-		if( sync && !no_sync ) {
+		if( sync ) {
 			if(have_good == 1) {
 				drbd_send_bitmap(mdev);
 				set_cstate(mdev,WFBitMapS);
 			} else { // have_good == -1
 				mdev->gen_cnt[Flags] &= ~MDF_Consistent;
 				set_cstate(mdev,WFBitMapT);
-			}
+			} 
 		} else set_cstate(mdev,Connected);
 
 		if (have_good == -1) {
@@ -1174,18 +1181,19 @@
 			}
 		}
 	}
-	drbd_md_write(mdev); // update connected indicator, la_size, ...
 
-	// do not adopt gen counts when sync was skipped ...
-skipped:
+	if (mdev->cstate == WFReportParams) set_cstate(mdev,Connected);
+
+skipped:	// do not adopt gen counts when sync was skipped ...
 
 	oo_state = mdev->o_state;
 	mdev->o_state = be32_to_cpu(p->state);
 	if(oo_state == Secondary && mdev->o_state == Primary) {
 		drbd_md_inc(mdev,ConnectedCnt);
-		drbd_md_write(mdev);
 	}
 
+	drbd_md_write(mdev); // update connected indicator, la_size, ...
+
 	return TRUE;
 }
 
@@ -1418,7 +1426,7 @@
 	}
 }
 
-void drbd_disconnect(drbd_dev *mdev)
+STATIC void drbd_disconnect(drbd_dev *mdev)
 {
 	mdev->o_state = Unknown;
 	drbd_thread_stop_nowait(&mdev->worker);
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_req-2.4.c,v
retrieving revision 1.33.2.50
retrieving revision 1.33.2.51
diff -u -3 -r1.33.2.50 -r1.33.2.51
--- drbd_req-2.4.c	5 Feb 2004 15:17:36 -0000	1.33.2.50
+++ drbd_req-2.4.c	7 Feb 2004 16:37:49 -0000	1.33.2.51
@@ -131,8 +131,8 @@
 	drbd_send_drequest(mdev, DataRequest, bio->b_rsector, bio->b_size,
 			   (unsigned long)pr);
 #else
-	//WORK_HERE
-	//#warning "FIXME make 2.6.x clean"
+	drbd_send_drequest(mdev, DataRequest, bio->bi_sector, bio->bi_size,
+			   (unsigned long)pr);
 #endif
 }