[DRBD-cvs] drbd by phil; * list_add_tail() <- list_add() for done...

drbd-user@lists.linbit.com drbd-user@lists.linbit.com
Tue, 4 May 2004 12:26:17 +0200 (CEST)


DRBD CVS committal

Author  : phil
Module  : drbd

Dir     : drbd/drbd


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


Log Message:
* list_add_tail() <- list_add()    for   done_ee
* Increasing of a device's sync group was not working right. FIXED.
* Worker runs now as long as we have a backing device or a socket.

===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_dsender.c,v
retrieving revision 1.1.2.97
retrieving revision 1.1.2.98
diff -u -3 -r1.1.2.97 -r1.1.2.98
--- drbd_dsender.c	4 May 2004 08:44:15 -0000	1.1.2.97
+++ drbd_dsender.c	4 May 2004 10:26:12 -0000	1.1.2.98
@@ -120,7 +120,7 @@
 	smp_mb__after_clear_bit();
 
 	list_del(&e->w.list);
-	list_add(&e->w.list,&mdev->done_ee);
+	list_add_tail(&e->w.list,&mdev->done_ee);
 
 	if (waitqueue_active(&mdev->ee_wait) &&
 	    (list_empty(&mdev->active_ee) ||
@@ -253,7 +253,7 @@
 
 	spin_lock_irqsave(&mdev->ee_lock,flags);
 	list_del(&e->w.list);
-	list_add(&e->w.list,&mdev->done_ee);
+	list_add_tail(&e->w.list,&mdev->done_ee);
 
 	if (waitqueue_active(&mdev->ee_wait) &&
 	    (list_empty(&mdev->active_ee) ||
@@ -700,6 +700,24 @@
 	return rv;
 }
 
+STATIC int _drbd_resume_lower_sg(drbd_dev *mdev)
+{
+	drbd_dev *odev;
+	int i,rv=0;
+
+	for (i=0; i < minor_count; i++) {
+		odev = drbd_conf + i;
+		if ( odev->sync_conf.group < mdev->sync_conf.group
+		     && ( odev->cstate == PausedSyncS || 
+			  odev->cstate == PausedSyncT ) ) {
+			_drbd_rs_resume(odev);
+			rv = 1;
+		}
+	}
+
+	return rv;
+}
+
 int w_resume_next_sg(drbd_dev* mdev, struct drbd_work* w, int unused)
 {
 	drbd_dev *odev;
@@ -745,7 +763,7 @@
 
 void drbd_alter_sg(drbd_dev *mdev, int ng)
 {
-	int c = 0;
+	int c = 0, p = 0;
 	int d = (ng - mdev->sync_conf.group);
 
 	drbd_global_lock();
@@ -760,8 +778,9 @@
 
 	if( ( mdev->cstate == SyncSource || 
 	      mdev->cstate == SyncTarget ) && ( d > 0 ) ) {
-		if(_drbd_lower_sg_running(mdev)) c=1;
-		if(c) _drbd_rs_pause(mdev);
+		if(_drbd_resume_lower_sg(mdev)) p=1;
+		else if(_drbd_lower_sg_running(mdev)) p=1;
+		if(p) _drbd_rs_pause(mdev);
 	}
 	drbd_global_unlock();
 }
@@ -850,7 +869,6 @@
 	if(0) {
 	err:
 		ERR("A work callback returned not ok!\n");
-		// ?? drbd_thread_restart_nowait(&mdev->asender);
 		drbd_thread_restart_nowait(&mdev->receiver);
 	}
 
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_fs.c,v
retrieving revision 1.28.2.82
retrieving revision 1.28.2.83
diff -u -3 -r1.28.2.82 -r1.28.2.83
--- drbd_fs.c	29 Apr 2004 14:43:26 -0000	1.28.2.82
+++ drbd_fs.c	4 May 2004 10:26:12 -0000	1.28.2.83
@@ -364,7 +364,10 @@
 
 	drbd_set_blocksize(mdev,INITIAL_BLOCK_SIZE);
 
-	if(mdev->cstate == Unconfigured ) set_cstate(mdev,StandAlone);
+	if(mdev->cstate == Unconfigured ) {
+		drbd_thread_start(&mdev->worker);
+		set_cstate(mdev,StandAlone);
+	}
 	if(mdev->cstate >= Connected ) {
 		drbd_send_param(mdev,1);
 	} else {
@@ -465,7 +468,6 @@
 	*/
 
 	drbd_sync_me(mdev);
-	drbd_thread_stop(&mdev->worker);
 	drbd_thread_stop(&mdev->asender);
 	drbd_thread_stop(&mdev->receiver);
 	drbd_free_sock(mdev);
@@ -501,7 +503,8 @@
 	mdev->send_cnt = 0;
 	mdev->recv_cnt = 0;
 
-	set_cstate(&drbd_conf[minor],Unconnected);
+	drbd_thread_start(&mdev->worker);
+	set_cstate(mdev,Unconnected);
 	drbd_thread_start(&mdev->receiver);
 
 	return 0;
@@ -775,12 +778,13 @@
 		/* FIXME what if fsync returns error */
 		drbd_sync_me(mdev);
 		set_bit(DO_NOT_INC_CONCNT,&mdev->flags);
-		drbd_thread_stop(&mdev->worker);
 		drbd_thread_stop(&mdev->asender);
 		drbd_thread_stop(&mdev->receiver);
 
-		if (test_bit(DISKLESS,&mdev->flags)) set_cstate(mdev,Unconfigured);
-		else set_cstate(mdev,StandAlone);
+		if (test_bit(DISKLESS,&mdev->flags)) {
+			set_cstate(mdev,Unconfigured);
+			drbd_mdev_cleanup(mdev);
+		} else set_cstate(mdev,StandAlone);
 
 		break;
 
@@ -822,7 +826,10 @@
 /* FIXME race with sync start
  */
 		if (mdev->cstate == Connected) drbd_send_param(mdev,0);
-		if (mdev->cstate == StandAlone) set_cstate(mdev,Unconfigured);
+		if (mdev->cstate == StandAlone) {
+			set_cstate(mdev,Unconfigured);
+			drbd_mdev_cleanup(mdev);
+		}
 
 		break;
 
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_int.h,v
retrieving revision 1.58.2.152
retrieving revision 1.58.2.153
diff -u -3 -r1.58.2.152 -r1.58.2.153
--- drbd_int.h	4 May 2004 08:44:15 -0000	1.58.2.152
+++ drbd_int.h	4 May 2004 10:26:12 -0000	1.58.2.153
@@ -952,8 +952,6 @@
 	spin_lock_irqsave(&mdev->req_lock,flags);
 	_set_cstate(mdev,ns);
 	spin_unlock_irqrestore(&mdev->req_lock,flags);
-	if (ns == Unconfigured)
-		drbd_mdev_cleanup(mdev);
 }
 
 /**
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_main.c,v
retrieving revision 1.73.2.159
retrieving revision 1.73.2.160
diff -u -3 -r1.73.2.159 -r1.73.2.160
--- drbd_main.c	4 May 2004 08:44:15 -0000	1.73.2.159
+++ drbd_main.c	4 May 2004 10:26:12 -0000	1.73.2.160
@@ -1189,6 +1189,8 @@
 	 * oldest_barrier
 	 */
 
+	drbd_thread_stop(&mdev->worker);
+
 	if (   mdev->ee_in_use  !=  0
 	    || mdev->ee_vacant  != 32 /* EE_MININUM */
 	    || mdev->epoch_size !=  0)
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_receiver.c,v
retrieving revision 1.97.2.136
retrieving revision 1.97.2.137
diff -u -3 -r1.97.2.136 -r1.97.2.137
--- drbd_receiver.c	30 Apr 2004 09:46:57 -0000	1.97.2.136
+++ drbd_receiver.c	4 May 2004 10:26:12 -0000	1.97.2.137
@@ -661,7 +661,6 @@
 	D_ASSERT(mdev->worker.task == NULL);
 
 	drbd_thread_start(&mdev->asender);
-	drbd_thread_start(&mdev->worker);
 
 	drbd_send_param(mdev,0);
 
@@ -1123,6 +1122,7 @@
 	if(p_size == 0 && test_bit(DISKLESS,&mdev->flags)) {
 		ERR("some backing storage is needed\n");
 		set_cstate(mdev,Unconfigured);
+		drbd_mdev_cleanup(mdev); // FIXME. Is this valid here ?
 		mdev->receiver.t_state = Exiting;
 		return FALSE;
 	}
@@ -1483,6 +1483,7 @@
 	up(&mdev->data.mutex);
 
 	drbd_thread_stop(&mdev->worker);
+	drbd_thread_start(&mdev->worker);
 
 	if(mdev->cstate != StandAlone)
 		set_cstate(mdev,Unconnected);
@@ -1533,12 +1534,6 @@
 		if (thi->t_state == Exiting) break;
 		drbdd(mdev);
 		drbd_disconnect(mdev);
-
-		// worker was stopped..., ev. w_resume_next_sg()
-		if(mdev->resync_work.cb == w_resume_next_sg) {
-			w_resume_next_sg(mdev,&mdev->resync_work,0);
-		}
-
 		if (thi->t_state == Exiting) break;
 		else {
 			if (signal_pending(current)) {