[DRBD-cvs] r1634 - trunk/drbd

svn at svn.drbd.org svn at svn.drbd.org
Wed Nov 10 23:13:11 CET 2004


Author: phil
Date: 2004-11-10 23:13:08 +0100 (Wed, 10 Nov 2004)
New Revision: 1634

Modified:
   trunk/drbd/drbd_fs.c
   trunk/drbd/drbd_int.h
   trunk/drbd/drbd_main.c
   trunk/drbd/drbd_receiver.c
   trunk/drbd/drbd_worker.c
Log:
Now _drbd_set_state() can print state change errors by itself.
-> Because calling print_st_err() correctly was next to impossible.


Modified: trunk/drbd/drbd_fs.c
===================================================================
--- trunk/drbd/drbd_fs.c	2004-11-08 19:46:04 UTC (rev 1633)
+++ trunk/drbd/drbd_fs.c	2004-11-10 22:13:08 UTC (rev 1634)
@@ -434,15 +434,10 @@
 
 	drbd_set_blocksize(mdev,INITIAL_BLOCK_SIZE);
 
-	if((i=drbd_request_state(mdev,NS(disk,
-					 drbd_md_test_flag(mdev,MDF_Consistent)
-					 ? Consistent : Inconsistent ))) > 0) {
+	if(drbd_request_state(mdev,NS(disk,
+				      drbd_md_test_flag(mdev,MDF_Consistent)
+				      ? Consistent : Inconsistent )) > 0) {
 		drbd_thread_start(&mdev->worker);
-	} else {
-		print_st_err(mdev,
-			     mdev->state,
-			     _NS(disk,drbd_md_test_flag(mdev,MDF_Consistent)
-				? Consistent : Inconsistent ),i);
 	}
 
 // FIXME EXPLAIN:
@@ -569,9 +564,7 @@
 	mdev->recv_cnt = 0;
 
 	drbd_thread_start(&mdev->worker);
-	if( (i=drbd_request_state(mdev,NS(conn,Unconnected))) <= 0) {
-		print_st_err(mdev,mdev->state,_NS(conn,Unconnected),i);
-	} else {
+	if( drbd_request_state(mdev,NS(conn,Unconnected)) > 0) {
 		drbd_thread_start(&mdev->receiver);
 	}
 
@@ -585,6 +578,7 @@
 int drbd_set_state(drbd_dev *mdev,drbd_role_t newstate)
 {
 	int r,forced = 0;
+	drbd_state_t os,ns;
 
 	D_ASSERT(semaphore_is_locked(&mdev->device_mutex));
 
@@ -606,7 +600,13 @@
 			return -EBUSY;
 	}
 
-	r = drbd_request_state(mdev,NS(role,newstate & 0x3));
+	spin_lock_irq(&mdev->req_lock);
+	os = mdev->state;
+	r = _drbd_set_state(mdev, _NS(role,newstate & 0x3), 0);
+	ns = mdev->state;
+	spin_unlock_irq(&mdev->req_lock);
+	after_state_ch(mdev,os,ns);
+
 	if ( r == 2 ) { return 0; }
 	if ( r == -2 ) {
 		/* request state does not like the new state. */
@@ -619,17 +619,13 @@
 			WARN("Forcefully set consistent!");
 			r = drbd_request_state(mdev,NS2(role,newstate & 0x3,
 							disk,Consistent));
-			if(r<=0) {
-				print_st_err(mdev,mdev->state,
-					     _NS2(role,newstate & 0x3,
-						 disk,Consistent),r);
-				return -EIO;
-			}
+			if(r<=0) return -EIO;
+
 			forced = 1;
 		}
 	}
 	if ( r <= 0) { 
-		print_st_err(mdev,mdev->state,_NS(role,newstate & 0x3),r);
+		print_st_err(mdev,os,ns,r);
 		return -EACCES; 
 	}
 
@@ -775,13 +771,12 @@
 
 	spin_lock_irq(&mdev->req_lock);
 	os = mdev->state;
-	r = _drbd_set_state(mdev,_NS(disk,Diskless),0);
+	r = _drbd_set_state(mdev,_NS(disk,Diskless),ChgStateVerbose);
 	ns = mdev->state;
 	spin_unlock_irq(&mdev->req_lock);
 
 	if( r == 2 ) { return 0; }
 	if( r <= 0 ) { 
-		print_st_err(mdev,os,ns,r);
 		return -ENETRESET; 
 	}
 
@@ -926,7 +921,6 @@
 		r = drbd_request_state(mdev,NS(conn,StandAlone));
 		if( r == 2 ) { break; }
 		if( r <= 0 ) {
-			print_st_err(mdev,mdev->state,_NS(conn,StandAlone),r);
 			err=-ENODATA;
 			break;
 		} 
@@ -1025,8 +1019,6 @@
 
 		if( r == 2 ) { break; }
 		if( r <= 0 ) {
-			print_st_err(mdev,mdev->state,_NS2(disk,Inconsistent,
-							   conn,WFBitMapT),r);
 			err = -EINPROGRESS;
 			break;
 		} 
@@ -1066,8 +1058,6 @@
 
 		if( r == 2 ) { break; }
 		if( r <= 0 ) {
-			print_st_err(mdev,mdev->state,_NS2(pdsk,Inconsistent,
-							   conn,WFBitMapS),r);
 			err = -EINPROGRESS;
 			break;
 		} 

Modified: trunk/drbd/drbd_int.h
===================================================================
--- trunk/drbd/drbd_int.h	2004-11-08 19:46:04 UTC (rev 1633)
+++ trunk/drbd/drbd_int.h	2004-11-10 22:13:08 UTC (rev 1634)
@@ -743,7 +743,13 @@
  *************************/
 
 // drbd_main.c
-extern int _drbd_set_state(drbd_dev* mdev, drbd_state_t ns, int hard);
+
+enum chg_state_flags {
+	ChgStateHard    = 1,
+	ChgStateVerbose = 2,
+};
+
+extern int _drbd_set_state(drbd_dev*, drbd_state_t, enum chg_state_flags );
 extern void print_st_err(drbd_dev*, drbd_state_t, drbd_state_t, int );
 extern void after_state_ch(drbd_dev* mdev, drbd_state_t os, drbd_state_t ns);
 extern void drbd_thread_start(struct Drbd_thread *thi);
@@ -1031,38 +1037,34 @@
                 ({drbd_state_t ns; ns.i = mdev->state.i; ns.s.T1 = (S1); \
                 ns.s.T2 = (S2); ns.s.T3 = (S3); ns;})
 
-
-static inline void drbd_force_state(drbd_dev* mdev, 
+static inline int drbd_change_state(drbd_dev* mdev, enum chg_state_flags f,
 				    drbd_state_t mask, drbd_state_t val)
 {
 	unsigned long flags;
 	drbd_state_t os,ns;
+	int rv;
 
 	spin_lock_irqsave(&mdev->req_lock,flags);
 	os = mdev->state;
 	ns.i = (os.i & ~mask.i) | val.i;
-	_drbd_set_state(mdev, ns, 1);
+	rv = _drbd_set_state(mdev, ns, f);
 	ns = mdev->state;
 	spin_unlock_irqrestore(&mdev->req_lock,flags);
 	after_state_ch(mdev,os,ns);
+
+	return rv;
 }
 
+static inline void drbd_force_state(drbd_dev* mdev, 
+				    drbd_state_t mask, drbd_state_t val)
+{
+	drbd_change_state(mdev,ChgStateHard,mask,val);
+}
+
 static inline int drbd_request_state(drbd_dev* mdev, 
-				     drbd_state_t mask, drbd_state_t val)
+				    drbd_state_t mask, drbd_state_t val)
 {
-	unsigned long flags;
-	drbd_state_t os,ns;
-	int rv;
-
-	spin_lock_irqsave(&mdev->req_lock,flags);
-	os = mdev->state;
-	ns.i = (os.i & ~mask.i) | val.i;
-	rv = _drbd_set_state(mdev, ns, 0);
-	ns = mdev->state;
-	spin_unlock_irqrestore(&mdev->req_lock,flags);
-	after_state_ch(mdev,os,ns);
-
-	return rv;
+	return drbd_change_state(mdev,ChgStateVerbose,mask,val);
 }
 
 /**

Modified: trunk/drbd/drbd_main.c
===================================================================
--- trunk/drbd/drbd_main.c	2004-11-08 19:46:04 UTC (rev 1633)
+++ trunk/drbd/drbd_main.c	2004-11-10 22:13:08 UTC (rev 1634)
@@ -338,7 +338,7 @@
 
 	spin_lock_irqsave(&mdev->req_lock,flags);
 	if( (send = (mdev->state.s.disk == Failed)) ) {
-		_drbd_set_state(mdev,_NS(disk,Diskless),1);
+		_drbd_set_state(mdev,_NS(disk,Diskless),ChgStateHard);
 	}
 	D_ASSERT(mdev->state.s.disk <= Failed);
 	spin_unlock_irqrestore(&mdev->req_lock,flags);
@@ -407,34 +407,34 @@
 
 
 /* PRE TODO: Should return ernno numbers from the pre-state-change checks. */
-int _drbd_set_state(drbd_dev* mdev, drbd_state_t ns, int hard)
+int _drbd_set_state(drbd_dev* mdev, drbd_state_t ns,enum chg_state_flags flags)
 {
 	drbd_state_t os;
 	char pb[160], *pbp;
+	int rv=1;
 
 	os = mdev->state;
 
 	if( ns.i == os.i ) return 2;
 
-	if( !hard ) {
+	if( !(flags & ChgStateHard) ) {
 		/*  pre-state-change checks ; only look at ns  */
 		/* See drbd_state_sw_errors in drbd_strings.c */
+
 		if( !ns.s.mult && 
-		    ns.s.role == Primary && ns.s.peer == Primary ) return -1;
+		    ns.s.role == Primary && ns.s.peer == Primary ) rv=-1;
 
 		if( ns.s.role == Primary && ns.s.disk <= Inconsistent && 
-		    ns.s.conn < Connected ) return -2;
+		    ns.s.conn < Connected ) rv=-2;
 
 		if( ns.s.peer == Primary && ns.s.pdsk <= Inconsistent && 
-		    ns.s.conn < Connected ) return -3;
+		    ns.s.conn < Connected ) rv=-3;
 
 		if( ns.s.conn > Connected && 
-		    ns.s.disk < Consistent && ns.s.pdsk < Consistent )
-			return -4;
+		    ns.s.disk < Consistent && ns.s.pdsk < Consistent ) rv=-4;
 
 		if( ns.s.conn > Connected && 
-		    (ns.s.disk == Diskless || ns.s.pdsk == Diskless ) )
-			return -5;
+		    (ns.s.disk == Diskless || ns.s.pdsk == Diskless ) ) rv=-5;
 	}
 
 	/*  State sanitising  */
@@ -446,6 +446,11 @@
 		ns.s.conn = Connected;
 	}
 
+	if(rv <= 0) {
+		if( flags & ChgStateVerbose ) print_st_err(mdev,os,ns,rv);
+		return rv;
+	}
+
 #if DUMP_MD >= 2
 	pbp = pb;
 	PSC(role);
@@ -482,7 +487,7 @@
 		drbd_panic("No access to good data anymore.\n");
 	}
 
-	return 1;
+	return rv;
 }
 
 void after_state_ch(drbd_dev* mdev, drbd_state_t os, drbd_state_t ns)

Modified: trunk/drbd/drbd_receiver.c
===================================================================
--- trunk/drbd/drbd_receiver.c	2004-11-08 19:46:04 UTC (rev 1633)
+++ trunk/drbd/drbd_receiver.c	2004-11-10 22:13:08 UTC (rev 1634)
@@ -1413,11 +1413,10 @@
 	ns.s.conn = nconn;
 	ns.s.peer = be32_to_cpu(p->state);
 	ns.s.pdsk = npdsk;
-	rv = _drbd_set_state(mdev,ns,0);
+	rv = _drbd_set_state(mdev,ns,ChgStateVerbose);
 	spin_unlock_irq(&mdev->req_lock);
 
 	if(rv <= 0) {
-		print_st_err(mdev,mdev->state,ns,rv);
 		drbd_force_state(mdev,NS(conn,StandAlone));
 		drbd_thread_stop_nowait(&mdev->receiver);
 		return FALSE;

Modified: trunk/drbd/drbd_worker.c
===================================================================
--- trunk/drbd/drbd_worker.c	2004-11-08 19:46:04 UTC (rev 1633)
+++ trunk/drbd/drbd_worker.c	2004-11-10 22:13:08 UTC (rev 1634)
@@ -545,7 +545,7 @@
 
 	INFO("Syncer continues.\n");
 	mdev->rs_paused += (long)jiffies-(long)mdev->rs_mark_time;
-	_drbd_set_state(mdev,_NS(conn,ncs),1);
+	_drbd_set_state(mdev,_NS(conn,ncs),ChgStateHard);
 
 	if(mdev->state.s.conn == SyncTarget) {
 		ERR_IF(test_bit(STOP_SYNC_TIMER,&mdev->flags)) {
@@ -575,7 +575,7 @@
 
 	mdev->rs_mark_time = jiffies;
 	// mdev->rs_mark_left = drbd_bm_total_weight(mdev); // I don't care...
-	_drbd_set_state(mdev,_NS(conn,ncs),1);
+	_drbd_set_state(mdev,_NS(conn,ncs),ChgStateHard);
 
 	INFO("Syncer waits for sync group.\n");
 }
@@ -721,12 +721,7 @@
 		}
 	}
 
-	if(r != 1) {
-		ERR("%s\n",set_st_err_name(r));
-		ERR("Error in drbd_start_resync! (side == %s)\n",
-		    conns_to_name(side));
-		return;
-	}
+	if(r != 1) return;
 
 	drbd_md_write(mdev);
 



More information about the drbd-cvs mailing list