[DRBD-cvs] r1629 - in trunk/drbd: . linux

svn at svn.drbd.org svn at svn.drbd.org
Fri Nov 5 13:58:40 CET 2004


Author: phil
Date: 2004-11-05 13:58:36 +0100 (Fri, 05 Nov 2004)
New Revision: 1629

Modified:
   trunk/drbd/drbd_fs.c
   trunk/drbd/drbd_int.h
   trunk/drbd/drbd_main.c
   trunk/drbd/drbd_proc.c
   trunk/drbd/drbd_receiver.c
   trunk/drbd/drbd_req.c
   trunk/drbd/drbd_strings.c
   trunk/drbd/drbd_worker.c
   trunk/drbd/linux/drbd.h
Log:
Basic operations like attach/connect/primary/resync
now seems to work with the new state switching code.

* Improved error reporting a lot.


Modified: trunk/drbd/drbd_fs.c
===================================================================
--- trunk/drbd/drbd_fs.c	2004-11-05 11:47:50 UTC (rev 1628)
+++ trunk/drbd/drbd_fs.c	2004-11-05 12:58:36 UTC (rev 1629)
@@ -439,7 +439,10 @@
 					 ? Consistent : Inconsistent ))) > 0) {
 		drbd_thread_start(&mdev->worker);
 	} else {
-		ERR("%s\n",set_st_err_name(i));
+		print_st_err(mdev,
+			     mdev->state,
+			     _NS(disk,drbd_md_test_flag(mdev,MDF_Consistent)
+				? Consistent : Inconsistent ),i);
 	}
 
 // FIXME EXPLAIN:
@@ -567,7 +570,7 @@
 
 	drbd_thread_start(&mdev->worker);
 	if( (i=drbd_request_state(mdev,NS(conn,Unconnected))) <= 0) {
-		ERR("%s\n",set_st_err_name(i));
+		print_st_err(mdev,mdev->state,_NS(conn,Unconnected),i);
 	} else {
 		drbd_thread_start(&mdev->receiver);
 	}
@@ -581,7 +584,7 @@
 
 int drbd_set_state(drbd_dev *mdev,drbd_role_t newstate)
 {
-	int r;
+	int r,forced = 0;
 
 	D_ASSERT(semaphore_is_locked(&mdev->device_mutex));
 
@@ -605,7 +608,7 @@
 
 	r = drbd_request_state(mdev,NS(role,newstate & 0x3));
 	if ( r == 2 ) { return 0; }
-	if ( r <= 0 ) {
+	if ( r == -2 ) {
 		/* request state does not like the new state. */
 		if (! (newstate & DontBlameDrbd)) {
 			return -EIO;
@@ -617,12 +620,20 @@
 			r = drbd_request_state(mdev,NS2(role,newstate & 0x3,
 							disk,Consistent));
 			if(r<=0) {
-				ERR("%s\n",set_st_err_name(r));
+				print_st_err(mdev,mdev->state,
+					     _NS2(role,newstate & 0x3,
+						 disk,Consistent),r);
 				return -EIO;
 			}
+			forced = 1;
 		}
 	}
+	if ( r <= 0) { 
+		print_st_err(mdev,mdev->state,_NS(role,newstate & 0x3),r);
+		return -EACCES; 
+	}
 
+
 	if (mdev->state.s.conn >= Connected) {
 		/* do NOT increase the Human count if we are connected,
 		 * and there is no reason for it.  See
@@ -687,6 +698,11 @@
 	/* Primary indicator has changed in any case. */
 	drbd_md_write(mdev);
 
+	if (mdev->state.s.conn >= WFReportParams) {
+		/* if this was forced, we should consider sync */
+		drbd_send_param(mdev,forced);
+	}
+
 	return 0;
 }
 
@@ -765,7 +781,7 @@
 
 	if( r == 2 ) { return 0; }
 	if( r <= 0 ) { 
-		ERR("%s\n",set_st_err_name(r));
+		print_st_err(mdev,os,ns,r);
 		return -ENETRESET; 
 	}
 
@@ -910,7 +926,7 @@
 		r = drbd_request_state(mdev,NS(conn,StandAlone));
 		if( r == 2 ) { break; }
 		if( r <= 0 ) {
-			ERR("%s\n",set_st_err_name(r));
+			print_st_err(mdev,mdev->state,_NS(conn,StandAlone),r);
 			err=-ENODATA;
 			break;
 		} 
@@ -1009,7 +1025,8 @@
 
 		if( r == 2 ) { break; }
 		if( r <= 0 ) {
-			ERR("%s\n",set_st_err_name(r));
+			print_st_err(mdev,mdev->state,_NS2(disk,Inconsistent,
+							   conn,WFBitMapT),r);
 			err = -EINPROGRESS;
 			break;
 		} 
@@ -1044,12 +1061,13 @@
 
 		/* PRE TODO disallow invalidate if we peer is primary */
 		/* remove EINVAL from error output... */
-		r = drbd_request_state(mdev,NS2(pedi,Inconsistent,
+		r = drbd_request_state(mdev,NS2(pdsk,Inconsistent,
 					        conn,WFBitMapS));
 
 		if( r == 2 ) { break; }
 		if( r <= 0 ) {
-			ERR("%s\n",set_st_err_name(r));
+			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-05 11:47:50 UTC (rev 1628)
+++ trunk/drbd/drbd_int.h	2004-11-05 12:58:36 UTC (rev 1629)
@@ -744,6 +744,7 @@
 
 // drbd_main.c
 extern int _drbd_set_state(drbd_dev* mdev, drbd_state_t ns, int hard);
+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);
 extern void _drbd_thread_stop(struct Drbd_thread *thi, int restart, int wait);
@@ -1007,7 +1008,7 @@
 #include "drbd_compat_wrappers.h"
 
 #define peer_mask role_mask
-#define pedi_mask disk_mask
+#define pdsk_mask disk_mask
 
 #define NS(T,S) ({drbd_state_t mask; mask.i=0; mask.s.T = T##_mask; mask;}), \
                 ({drbd_state_t val; val.i=0; val.s.T = (S); val;})
@@ -1023,7 +1024,14 @@
                   val.s.T2 = (S2); val.s.T3 = (S3); val;})
 
 #define _NS(T,S) ({drbd_state_t ns; ns.i = mdev->state.i; ns.s.T = (S); ns;})
+#define _NS2(T1,S1,T2,S2) \
+                ({drbd_state_t ns; ns.i = mdev->state.i; ns.s.T1 = (S1); \
+                ns.s.T2 = (S2); ns;})
+#define _NS3(T1,S1,T2,S2,T3,S3) \
+                ({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, 
 				    drbd_state_t mask, drbd_state_t val)
 {

Modified: trunk/drbd/drbd_main.c
===================================================================
--- trunk/drbd/drbd_main.c	2004-11-05 11:47:50 UTC (rev 1628)
+++ trunk/drbd/drbd_main.c	2004-11-05 12:58:36 UTC (rev 1629)
@@ -374,8 +374,29 @@
 	return ok;
 }
 
+
+static void print_st(drbd_dev* mdev, char *name, drbd_state_t ns)
+{
+	ERR(" %s = { cs:%s st:%s/%s ds:%s/%s m:%d }\n",
+	    name,
+	    conns_to_name(ns.s.conn),
+	    roles_to_name(ns.s.role),
+	    roles_to_name(ns.s.peer),
+	    disks_to_name(ns.s.disk),
+	    disks_to_name(ns.s.pdsk),
+	    ns.s.mult);
+}
+
+void print_st_err(drbd_dev* mdev, drbd_state_t os, drbd_state_t ns, int err)
+{
+	ERR("State change failed: %s\n",set_st_err_name(err));
+	print_st(mdev," state",os);
+	print_st(mdev,"wanted",ns);
+}
+
+
 #define peers_to_name roles_to_name
-#define pedis_to_name disks_to_name
+#define pdsks_to_name disks_to_name
 
 #define PSC(A) \
 	({ if( ns.s.A != os.s.A ) { \
@@ -404,17 +425,21 @@
 		if( ns.s.role == Primary && ns.s.disk <= Inconsistent && 
 		    ns.s.conn < Connected ) return -2;
 
-		if( ns.s.peer == Primary && ns.s.pedi <= Inconsistent && 
+		if( ns.s.peer == Primary && ns.s.pdsk <= Inconsistent && 
 		    ns.s.conn < Connected ) return -3;
 
 		if( ns.s.conn > Connected && 
-		    (ns.s.disk < Consistent || ns.s.pedi < Consistent ) )
+		    ns.s.disk < Consistent && ns.s.pdsk < Consistent )
 			return -4;
+
+		if( ns.s.conn > Connected && 
+		    (ns.s.disk == Diskless || ns.s.pdsk == Diskless ) )
+			return -5;
 	}
 
 	/*  State sanitising  */
 	if( ns.s.conn < Connected ) ns.s.peer = Unknown;
-	if( ns.s.conn < Connected ) ns.s.pedi = DUnknown;
+	if( ns.s.conn < Connected ) ns.s.pdsk = DUnknown;
 
 	if( ns.s.disk <= Failed && ns.s.conn > Connected) {
 		WARN("Resync aborted.\n");
@@ -427,7 +452,7 @@
 	PSC(peer);
 	PSC(conn);
 	PSC(disk);
-	PSC(pedi);
+	PSC(pdsk);
 	if( ns.s.mult != os.s.mult ) {
 		sprintf(pbp, "mult( %d -> %d)", os.s.mult,ns.s.mult);
 	}
@@ -1304,7 +1329,7 @@
 
 	/* only if connected */
 	spin_lock_irq(&mdev->req_lock);
-	if (mdev->state.s.pedi >= Inconsistent) /* implies cs >= Connected */ {
+	if (mdev->state.s.pdsk >= Inconsistent) /* implies cs >= Connected */ {
 		D_ASSERT(mdev->state.s.role == Primary);
 		if (test_and_clear_bit(UNPLUG_REMOTE,&mdev->flags)) {
 			/* add to the front of the data.work queue,

Modified: trunk/drbd/drbd_proc.c
===================================================================
--- trunk/drbd/drbd_proc.c	2004-11-05 11:47:50 UTC (rev 1628)
+++ trunk/drbd/drbd_proc.c	2004-11-05 12:58:36 UTC (rev 1629)
@@ -194,7 +194,7 @@
 			   roles_to_name(drbd_conf[i].state.s.role),
 			   roles_to_name(drbd_conf[i].state.s.peer),
 			   disks_to_name(drbd_conf[i].state.s.disk),
-			   disks_to_name(drbd_conf[i].state.s.pedi),
+			   disks_to_name(drbd_conf[i].state.s.pdsk),
 			   drbd_conf[i].send_cnt/2,
 			   drbd_conf[i].recv_cnt/2,
 			   drbd_conf[i].writ_cnt/2,

Modified: trunk/drbd/drbd_receiver.c
===================================================================
--- trunk/drbd/drbd_receiver.c	2004-11-05 11:47:50 UTC (rev 1628)
+++ trunk/drbd/drbd_receiver.c	2004-11-05 12:58:36 UTC (rev 1629)
@@ -843,7 +843,7 @@
 	drbd_rs_complete_io(mdev,sector); // before set_in_sync() !
 	if (likely( drbd_bio_uptodate(&e->private_bio) )) {
 		ok = mdev->state.s.disk >= Inconsistent &&
-			mdev->state.s.pedi >= Inconsistent;
+			mdev->state.s.pdsk >= Inconsistent;
 		if (likely( ok )) {
 			drbd_set_in_sync(mdev, sector, drbd_ee_get_size(e));
 			/* THINK maybe don't send ack either
@@ -1290,7 +1290,7 @@
 {
 	Drbd_Parameter_Packet *p = (Drbd_Parameter_Packet*)h;
 	drbd_conns_t nconn;
-	drbd_disks_t npedi;
+	drbd_disks_t npdsk;
 	drbd_state_t ns;
 	int consider_sync,rv;
 	sector_t p_size;
@@ -1390,12 +1390,12 @@
 
 
 	if(p_size ) {
-		npedi = Inconsistent;
+		npdsk = Inconsistent;
  		if (be32_to_cpu(p->gen_cnt[Flags]) & MDF_Consistent) {
-			npedi = Consistent;
+			npdsk = Consistent;
 		}
 	} else {
-		npedi = Diskless;
+		npdsk = Diskless;
 	}
 
 	if (mdev->state.s.conn == WFReportParams) {
@@ -1412,11 +1412,12 @@
 	ns.i = mdev->state.i;
 	ns.s.conn = nconn;
 	ns.s.peer = be32_to_cpu(p->state);
-	ns.s.pedi = npedi;
+	ns.s.pdsk = npdsk;
 	rv = _drbd_set_state(mdev,ns,0);
 	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;
@@ -1485,7 +1486,7 @@
  *        *doing* it here masks a logic bug elsewhere, I think.
  */
 	D_ASSERT(mdev->state.s.disk >= Inconsistent);
-	D_ASSERT(mdev->state.s.pedi >= Inconsistent);
+	D_ASSERT(mdev->state.s.pdsk >= Inconsistent);
 // EXPLAIN:
 	clear_bit(MD_IO_ALLOWED,&mdev->flags);
 
@@ -1909,7 +1910,7 @@
 	int blksize = be32_to_cpu(p->blksize);
 
 	smp_rmb();
-	if(likely(mdev->state.s.pedi >= Inconsistent )) {
+	if(likely(mdev->state.s.pdsk >= Inconsistent )) {
 		// test_bit(PARTNER_DISKLESS,&mdev->flags)
 		// This happens if one a few IO requests on the peer
 		// failed, and some subsequest completed sucessfull
@@ -2005,7 +2006,7 @@
 	Drbd_BarrierAck_Packet *p = (Drbd_BarrierAck_Packet*)h;
 
 	smp_rmb();
-	if(unlikely(mdev->state.s.pedi <= Diskless)) return TRUE;
+	if(unlikely(mdev->state.s.pdsk <= Diskless)) return TRUE;
 
 	tl_release(mdev,p->barrier,be32_to_cpu(p->set_size));
 	dec_ap_pending(mdev);

Modified: trunk/drbd/drbd_req.c
===================================================================
--- trunk/drbd/drbd_req.c	2004-11-05 11:47:50 UTC (rev 1628)
+++ trunk/drbd/drbd_req.c	2004-11-05 12:58:36 UTC (rev 1629)
@@ -255,7 +255,7 @@
 				dec_local(mdev);
 			}
 		}
-		remote = !local && mdev->state.s.pedi >= Consistent;
+		remote = !local && mdev->state.s.pdsk >= Consistent;
 	} else {
 		remote = 1;
 	}
@@ -276,7 +276,7 @@
 	if (rw == WRITE && local)
 		drbd_al_begin_io(mdev, sector);
 
-	remote = remote && (mdev->state.s.pedi >= Inconsistent);
+	remote = remote && (mdev->state.s.pdsk >= Inconsistent);
 
 	if (!(local || remote)) {
 		ERR("IO ERROR: neither local nor remote disk\n");

Modified: trunk/drbd/drbd_strings.c
===================================================================
--- trunk/drbd/drbd_strings.c	2004-11-05 11:47:50 UTC (rev 1628)
+++ trunk/drbd/drbd_strings.c	2004-11-05 12:58:36 UTC (rev 1629)
@@ -63,6 +63,7 @@
 	[2] = "Refusing to be Primary without consistent data",
 	[3] = "Refusing to make peer Primary without data",
 	[4] = "Refusing to be inconsistent on both nodes",
+	[5] = "Refusing to be syncing and diskless",
 };
 
 const char* conns_to_name(drbd_conns_t s) {

Modified: trunk/drbd/drbd_worker.c
===================================================================
--- trunk/drbd/drbd_worker.c	2004-11-05 11:47:50 UTC (rev 1628)
+++ trunk/drbd/drbd_worker.c	2004-11-05 12:58:36 UTC (rev 1629)
@@ -229,7 +229,7 @@
 	smp_rmb();
 	if ( cancel ||
 	     mdev->state.s.conn < Connected ||
-	     mdev->state.s.pedi < Consistent ) {
+	     mdev->state.s.pdsk < Consistent ) {
 		drbd_panic("WE ARE LOST. Local IO failure, no peer.\n");
 
 		// does not make much sense, but anyways...
@@ -402,7 +402,7 @@
 
 	drbd_request_state(mdev,NS3(conn,Connected,
 				    disk,Consistent,
-				    pedi,Consistent));
+				    pdsk,Consistent));
 
 	drbd_md_write(mdev);
 
@@ -465,7 +465,7 @@
 	drbd_rs_complete_io(mdev,drbd_ee_get_sector(e));
 
 	if(likely(drbd_bio_uptodate(&e->private_bio))) {
-		if (likely( mdev->state.s.pedi >= Inconsistent )) {
+		if (likely( mdev->state.s.pdsk >= Inconsistent )) {
 			inc_rs_pending(mdev);
 			ok=drbd_send_block(mdev, RSDataReply, e);
 		} else {
@@ -710,7 +710,7 @@
 						disk,Inconsistent));
 	} else if (side == SyncSource) {
 		r = drbd_request_state(mdev,NS2(conn,SyncSource,
-						pedi,Inconsistent));
+						pdsk,Inconsistent));
 		/* If we are SyncSource we must be consistent.
 		 * FIXME this should be an assertion only,
 		 * otherwise it masks a logic bug somewhere else...

Modified: trunk/drbd/linux/drbd.h
===================================================================
--- trunk/drbd/linux/drbd.h	2004-11-05 11:47:50 UTC (rev 1628)
+++ trunk/drbd/linux/drbd.h	2004-11-05 12:58:36 UTC (rev 1629)
@@ -216,7 +216,7 @@
 		unsigned peer : 2 ;   // 3/3      primary/secondary/unknown
 		unsigned conn : 5 ;   // 17/32    cstates
 		unsigned disk : 3 ;   // 7/7      from DUnknown to UpToDate
-		unsigned pedi : 3 ;   // 7/7      from DUnknown to UpToDate
+		unsigned pdsk : 3 ;   // 7/7      from DUnknown to UpToDate
 		unsigned mult : 1 ;   // 2/2      multiple primaries allowed
 		unsigned _pad : 16;   // 0        unused
 	} s;



More information about the drbd-cvs mailing list