[DRBD-cvs] svn commit by phil - r2132 - in trunk: . drbd drbd/linux user - Implemented the IO freezing for "fencing = stonith"

drbd-cvs at lists.linbit.com drbd-cvs at lists.linbit.com
Wed Apr 5 20:01:14 CEST 2006


Author: phil
Date: 2006-04-05 20:01:11 +0200 (Wed, 05 Apr 2006)
New Revision: 2132

Modified:
   trunk/ROADMAP
   trunk/drbd/drbd_fs.c
   trunk/drbd/drbd_int.h
   trunk/drbd/drbd_main.c
   trunk/drbd/drbd_receiver.c
   trunk/drbd/drbd_req.c
   trunk/drbd/linux/drbd.h
   trunk/user/drbdadm_scanner.fl
   trunk/user/drbdmeta.c
   trunk/user/drbdsetup.c
   trunk/user/drbdtool_common.c
Log:
Implemented the IO freezing for "fencing = stonith"



Modified: trunk/ROADMAP
===================================================================
--- trunk/ROADMAP	2006-04-05 10:17:57 UTC (rev 2131)
+++ trunk/ROADMAP	2006-04-05 18:01:11 UTC (rev 2132)
@@ -195,7 +195,9 @@
   * We need to store the fact that the peer is outdated/inconsistent
     in the meta-data. To allow an stand allone primary to be rebooted.
 
-  50% DONE / TODO: IO freezing is not done yet.
+  80% DONE
+       The only missing thing is a fallback mechanism to unfreeze
+       IO in case the script failed.
 
 8 New command drbdmeta
 

Modified: trunk/drbd/drbd_fs.c
===================================================================
--- trunk/drbd/drbd_fs.c	2006-04-05 10:17:57 UTC (rev 2131)
+++ trunk/drbd/drbd_fs.c	2006-04-05 18:01:11 UTC (rev 2132)
@@ -308,7 +308,8 @@
 	struct drbd_backing_dev* nbc; // new_backing_conf
 	struct inode *inode, *inode2;
 	struct lru_cache* resync_lru = NULL;
-	drbd_disks_t nds;
+	drbd_state_t ns,os;
+	int rv;
 
 	minor=(int)(mdev-drbd_conf);
 
@@ -436,6 +437,7 @@
 	nbc->md_index = new_conf.meta_index;
 	nbc->u_size = new_conf.disk_size;
 	nbc->on_io_error = new_conf.on_io_error;
+	nbc->fencing = new_conf.fencing;
 	drbd_md_set_sector_offsets(mdev,nbc);
 
 	retcode = drbd_md_read(mdev,nbc);
@@ -462,9 +464,6 @@
 	mdev->bc = nbc;
 	mdev->resync = resync_lru;
 
-	if (new_conf.split_brain_fix) set_bit(SPLIT_BRAIN_FIX,&mdev->flags);
-	else clear_bit(SPLIT_BRAIN_FIX,&mdev->flags);
-
 	mdev->send_cnt = 0;
 	mdev->recv_cnt = 0;
 	mdev->read_cnt = 0;
@@ -526,6 +525,9 @@
 		drbd_send_state(mdev);
 		drbd_thread_start(&mdev->worker);
 	} else {
+		spin_lock_irq(&mdev->req_lock);
+		os = mdev->state;
+		ns.i = os.i;
 		/* If MDF_Consistent is not set go into inconsistent state, 
 		   otherwise investige MDF_WasUpToDate...
 		   If MDF_WasUpToDate is not set go into Outdated disk state, 
@@ -533,20 +535,33 @@
 		*/
 		if(drbd_md_test_flag(mdev->bc,MDF_Consistent)) {
 			if(drbd_md_test_flag(mdev->bc,MDF_WasUpToDate)) {
-				nds = Consistent;
+				ns.disk = Consistent;
 			} else {
-				nds = Outdated;
+				ns.disk = Outdated;
 			}
 		} else {
-			nds = Inconsistent;
+			ns.disk = Inconsistent;
 		}
 
+		if(drbd_md_test_flag(mdev->bc,MDF_PeerOutDated)) {
+			ns.pdsk = Outdated;
+		}
+		
 		/* All tests on MDF_PrimaryInd, MDF_ConnectedInd, 
 		   MDF_Consistent and MDF_WasUpToDate must happen before 
 		   this point, because drbd_request_state() modifies these
 		   flags. */
-		if(drbd_request_state(mdev,NS(disk,nds)) >= SS_Success ) {
+
+		rv = _drbd_set_state(mdev, ns, ChgStateVerbose);
+		ns = mdev->state;
+		spin_unlock_irq(&mdev->req_lock);
+		after_state_ch(mdev,os,ns);
+
+		if(rv >= SS_Success ) {
 			drbd_thread_start(&mdev->worker);
+		} else {
+			drbd_bm_unlock(mdev);
+			goto  release_bdev3_fail_ioctl;
 		}
 	}
 
@@ -557,6 +572,7 @@
 
  release_bdev3_fail_ioctl:
 	drbd_force_state(mdev,NS(disk,Diskless));
+	drbd_md_sync(mdev);
  release_bdev2_fail_ioctl:
 	bd_release(nbc->md_bdev);
  release_bdev_fail_ioctl:
@@ -785,9 +801,16 @@
 {
 	int r;
 	drbd_disks_t nps;
+	enum fencing_policy fp;
 
 	D_ASSERT(mdev->state.pdsk == DUnknown);
 
+	fp = DontCare;
+	if(inc_local(mdev)) {
+		fp = mdev->bc->fencing;
+		dec_local(mdev);
+	}
+
 	r=drbd_khelper(mdev,"outdate-peer");
 
 	switch( (r>>8) & 0xff ) {
@@ -806,10 +829,15 @@
 		nps = DUnknown;
 		drbd_request_state(mdev,NS(disk,Outdated));
 		break;
+	case 7:
+		if( fp != Stonith ) {
+			ERR("outdate-peer() = 7 && fencing != Stonith !!!\n");
+		}
+		nps = Outdated;
+		break;
 	default:
 		/* The script is broken ... */
 		nps = DUnknown;
-		drbd_request_state(mdev,NS(disk,Outdated));
 		ERR("outdate-peer helper broken, returned %d \n",(r>>8)&0xff);
 		return nps;
 	}
@@ -1063,13 +1091,15 @@
 	}
 	ns = mdev->state;
 	spin_unlock_irq(&mdev->req_lock);
+	after_state_ch(mdev,os,ns);
 
 	if( r == SS_NothingToDo ) return 0;
 	if( r == -999 ) {
 		return -EINVAL;
 	}
-	after_state_ch(mdev,os,ns);
 
+	drbd_md_sync(mdev);
+	
 	if( r < SS_Success ) {
 		err = put_user(r, reason);
 		if(!err) err=-EIO;

Modified: trunk/drbd/drbd_int.h
===================================================================
--- trunk/drbd/drbd_int.h	2006-04-05 10:17:57 UTC (rev 2131)
+++ trunk/drbd/drbd_int.h	2006-04-05 18:01:11 UTC (rev 2132)
@@ -649,7 +649,6 @@
 	MD_DIRTY,		// current gen counts and flags not yet on disk
 	SYNC_STARTED,		// Needed to agree on the exact point in time..
 	UNIQUE,                 // Set on one node, cleared on the peer!
-	SPLIT_BRAIN_FIX,        // Set if split-brain-fix is configured
 	USE_DEGR_WFC_T		// Use degr-wfc-timeout instead of wfc-timeout.
 };
 
@@ -714,6 +713,7 @@
 	struct file *md_file;
 	int md_index;
 	enum io_error_handler on_io_error;
+	enum fencing_policy fencing;
 	sector_t u_size;   /* user provided size */
 	struct drbd_md md;
 };
@@ -1164,6 +1164,7 @@
 
 #define peer_mask role_mask
 #define pdsk_mask disk_mask
+#define susp_mask 1
 
 #define NS(T,S) ({drbd_state_t mask; mask.i=0; mask.T = T##_mask; mask;}), \
                 ({drbd_state_t val; val.i=0; val.T = (S); val;})

Modified: trunk/drbd/drbd_main.c
===================================================================
--- trunk/drbd/drbd_main.c	2006-04-05 10:17:57 UTC (rev 2131)
+++ trunk/drbd/drbd_main.c	2006-04-05 18:01:11 UTC (rev 2132)
@@ -566,12 +566,61 @@
 		              A##s_to_name(ns.A)); \
 	} })
 
+STATIC int pre_state_checks(drbd_dev* mdev, drbd_state_t ns)
+{
+	/* See drbd_state_sw_errors in drbd_strings.c */
 
-/* PRE TODO: Should return ernno numbers from the pre-state-change checks. */
+	enum fencing_policy fp;
+	int rv=SS_Success;
+
+	fp = DontCare;
+	if(inc_local(mdev)) {
+		fp = mdev->bc->fencing;
+		dec_local(mdev);
+	}
+
+	if(inc_net(mdev)) {
+		if( !mdev->net_conf->two_primaries &&
+		    ns.role == Primary && ns.peer == Primary ) 
+			rv=SS_TowPrimaries;
+		dec_net(mdev);
+	}
+
+	if( rv <= 0 ) /* already found a reason to abort */;
+	else if( ns.role == Primary && ns.conn < Connected &&
+		 ns.disk <= Outdated ) rv=SS_NoConsistnetDisk;
+
+	else if( fp >= Resource &&
+		 ns.role == Primary && ns.conn < Connected &&
+		 ns.pdsk >= DUnknown ) rv=SS_PrimaryNOP;
+
+	else if( ns.role == Primary && ns.disk <= Inconsistent &&
+		 ns.pdsk <= Inconsistent ) rv=SS_NoConsistnetDisk;
+	
+	else if( ns.conn > Connected &&
+		 ns.disk < UpToDate && ns.pdsk < UpToDate ) 
+		rv=SS_BothInconsistent;
+
+	else if( ns.conn > Connected &&
+		 (ns.disk == Diskless || ns.pdsk == Diskless ) )
+		rv=SS_SyncingDiskless;
+
+	else if( (ns.conn == Connected ||
+		  ns.conn == SkippedSyncS ||
+		  ns.conn == WFBitMapS ||
+		  ns.conn == SyncSource ||
+		  ns.conn == PausedSyncS) &&
+		 ns.disk == Outdated ) rv=SS_ConnectedOutdates;
+
+	return rv;
+}
+
+
 int _drbd_set_state(drbd_dev* mdev, drbd_state_t ns,enum chg_state_flags flags)
 {
 	drbd_state_t os;
 	int rv=SS_Success, warn_sync_abort=0;
+	enum fencing_policy fp;
 
 	MUST_HOLD(&mdev->req_lock);
 
@@ -579,6 +628,12 @@
 
 	if( ns.i == os.i ) return SS_NothingToDo;
 
+	fp = DontCare;
+	if(inc_local(mdev)) {
+		fp = mdev->bc->fencing;
+		dec_local(mdev);
+	}
+
 	/*  State sanitising  */
 	if( ns.conn < Connected ) {
 		ns.peer = Unknown;
@@ -644,43 +699,33 @@
 		}
 	}
 
-
+	if( fp == Stonith ) {
+		if( !(os.role == Primary && os.conn < Connected) &&
+		     (ns.role == Primary && ns.conn < Connected) ) {
+			ns.susp = 1;
+			ERR("ap_pending_cnt = %d while suspending IO.\n",
+			    atomic_read(&mdev->ap_pending_cnt));
+		}
+	}
+	
 	if( !(flags & ChgStateHard) ) {
 		/*  pre-state-change checks ; only look at ns  */
 		/* See drbd_state_sw_errors in drbd_strings.c */
 
-		if(inc_net(mdev)) {
-			if( !mdev->net_conf->two_primaries &&
-			    ns.role == Primary && ns.peer == Primary ) 
-				rv=SS_TowPrimaries;
-			dec_net(mdev);
+		rv = pre_state_checks(mdev,ns);
+		if(rv < SS_Success) {
+			/* If the old state was illegal as well, then let
+			   this happen...*/
+
+			if( pre_state_checks(mdev,os) == rv ) {
+				ERR("State change from bad state. "
+				    "Error would be: '%s'\n", 
+				    set_st_err_name(rv));
+				print_st(mdev,"old",os);
+				print_st(mdev,"new",ns);
+				rv = SS_Success;
+			}
 		}
-
-		if( rv <= 0 ) /* already found a reason to abort */;
-		else if( ns.role == Primary && ns.conn < Connected &&
-			 ns.disk <= Outdated ) rv=SS_NoConsistnetDisk;
-
-		else if( test_bit(SPLIT_BRAIN_FIX,&mdev->flags) &&
-			 ns.role == Primary && ns.conn < Connected &&
-			 ns.pdsk >= DUnknown ) rv=SS_PrimaryNOP;
-
-		else if( ns.role == Primary && ns.disk <= Inconsistent &&
-			 ns.pdsk <= Inconsistent ) rv=SS_NoConsistnetDisk;
-
-		else if( ns.conn > Connected &&
-			 ns.disk < UpToDate && ns.pdsk < UpToDate ) 
-			rv=SS_BothInconsistent;
-
-		else if( ns.conn > Connected &&
-			 (ns.disk == Diskless || ns.pdsk == Diskless ) )
-			rv=SS_SyncingDiskless;
-
-		else if( (ns.conn == Connected ||
-			  ns.conn == SkippedSyncS ||
-			  ns.conn == WFBitMapS ||
-			  ns.conn == SyncSource ||
-			  ns.conn == PausedSyncS) &&
-			 ns.disk == Outdated ) rv=SS_ConnectedOutdates;
 	}
 
 	if(rv < SS_Success) {
@@ -758,15 +803,24 @@
 
 void after_state_ch(drbd_dev* mdev, drbd_state_t os, drbd_state_t ns)
 {
+	enum fencing_policy fp;
 	u32 mdf;
 
+	fp = DontCare;
+	if(inc_local(mdev)) {
+		fp = mdev->bc->fencing;
+		dec_local(mdev);
+	}
+
 	if(mdev->bc) {
 		mdf = mdev->bc->md.flags & ~(MDF_Consistent|MDF_PrimaryInd|
-					     MDF_ConnectedInd|MDF_WasUpToDate);
+					     MDF_ConnectedInd|MDF_WasUpToDate|
+					     MDF_PeerOutDated );
 		if (mdev->state.role == Primary)       mdf |= MDF_PrimaryInd;
 		if (mdev->state.conn > WFReportParams) mdf |= MDF_ConnectedInd;
 		if (mdev->state.disk > Inconsistent)   mdf |= MDF_Consistent;
 		if (mdev->state.disk > Outdated)       mdf |= MDF_WasUpToDate;
+		if (mdev->state.pdsk <= Outdated)      mdf |= MDF_PeerOutDated;
 
 		if( mdf != mdev->bc->md.flags) {
 			mdev->bc->md.flags = mdf;
@@ -777,6 +831,19 @@
 	/* Here we have the actions that are performed after a
 	   state change. This function might sleep */
 
+	if( fp == Stonith && ns.susp && os.susp ) {
+		// case1: The outdate peer handler is successfull:
+		// case2: The connection was established again:
+		if ( (os.pdsk > Outdated  && ns.pdsk <= Outdated) || // case1
+		     (os.conn < Connected && ns.conn >= Connected) ) {
+			tl_clear(mdev);
+			spin_lock_irq(&mdev->req_lock);
+			_drbd_set_state(mdev,_NS(susp,0), 
+					ChgStateVerbose | ScheduleAfter );
+			spin_unlock_irq(&mdev->req_lock);
+		}
+	}
+	// Do not change the order of the if above and below...
 	if (os.conn != WFBitMapS && ns.conn == WFBitMapS) {
 		wait_event(mdev->cstate_wait,!atomic_read(&mdev->ap_bio_cnt));
 		drbd_bm_lock(mdev);   // {

Modified: trunk/drbd/drbd_receiver.c
===================================================================
--- trunk/drbd/drbd_receiver.c	2006-04-05 10:17:57 UTC (rev 2131)
+++ trunk/drbd/drbd_receiver.c	2006-04-05 18:01:11 UTC (rev 2132)
@@ -2334,8 +2334,16 @@
 
 STATIC void drbd_disconnect(drbd_dev *mdev)
 {
+	enum fencing_policy fp;
+
 	D_ASSERT(mdev->state.conn < Connected);
 
+	fp = DontCare;
+	if(inc_local(mdev)) {
+		fp = mdev->bc->fencing;
+		dec_local(mdev);
+	}
+
 	/* in case we have been syncing, and then we drop the connection,
 	 * we need to "w_resume_next_sg", which we try to achieve by
 	 * setting the STOP_SYNC_TIMER bit, and schedulung the timer for
@@ -2397,11 +2405,21 @@
 	spin_unlock_irq(&mdev->ee_lock);
 
 	// primary
-	tl_clear(mdev);
 	clear_bit(ISSUE_BARRIER,&mdev->flags);
-	wait_event( mdev->cstate_wait, atomic_read(&mdev->ap_pending_cnt)==0 );
-	D_ASSERT(mdev->oldest_barrier->n_req == 0);
 
+	if(fp != Stonith ) {
+		tl_clear(mdev);
+		wait_event( mdev->cstate_wait, 
+			    atomic_read(&mdev->ap_pending_cnt)==0 );
+		D_ASSERT(mdev->oldest_barrier->n_req == 0);
+
+		if(atomic_read(&mdev->ap_pending_cnt)) {
+			ERR("ap_pending_cnt = %d\n",
+			    atomic_read(&mdev->ap_pending_cnt));
+			atomic_set(&mdev->ap_pending_cnt,0);
+		}
+	}
+
 	D_ASSERT(atomic_read(&mdev->pp_in_use) == 0);
 	D_ASSERT(list_empty(&mdev->read_ee)); // done by termination of worker
 	D_ASSERT(list_empty(&mdev->active_ee)); // done here
@@ -2427,11 +2445,6 @@
 	   on the fly. */
 	atomic_set(&mdev->rs_pending_cnt,0);
 
-	if(atomic_read(&mdev->ap_pending_cnt)) {
-		ERR("ap_pending_cnt = %d\n",atomic_read(&mdev->ap_pending_cnt));
-		atomic_set(&mdev->ap_pending_cnt,0);
-	}
-
 	wake_up(&mdev->cstate_wait);
 
 	if (get_t_state(&mdev->receiver) == Exiting) {
@@ -2442,9 +2455,9 @@
 		drbd_thread_start(&mdev->worker);
 	}
 
-	if ( mdev->state.role == Primary ) {
-		if ( test_bit(SPLIT_BRAIN_FIX,&mdev->flags) &&
-		     mdev->state.pdsk >= DUnknown ) {
+	if ( mdev->state.role == Primary ) {		
+		if( fp >= Resource &&
+		    mdev->state.pdsk >= DUnknown ) {
 			drbd_disks_t nps = drbd_try_outdate_peer(mdev);
 			drbd_request_state(mdev,NS(pdsk,nps));
 		}

Modified: trunk/drbd/drbd_req.c
===================================================================
--- trunk/drbd/drbd_req.c	2006-04-05 10:17:57 UTC (rev 2131)
+++ trunk/drbd/drbd_req.c	2006-04-05 18:01:11 UTC (rev 2132)
@@ -245,8 +245,9 @@
 	// down_read(mdev->device_lock);
 
 	wait_event( mdev->cstate_wait,
-		    (volatile int)(mdev->state.conn < WFBitMapS ||
-				   mdev->state.conn > WFBitMapT) );
+		    (volatile int)((mdev->state.conn < WFBitMapS ||
+				    mdev->state.conn > WFBitMapT) &&
+				   !mdev->state.susp ) );
 
 	local = inc_local(mdev);
 	if (rw == READ || rw == READA) {
@@ -452,7 +453,6 @@
 		return 0;
 	}
 
-
 	/*
 	 * what we "blindly" assume:
 	 */

Modified: trunk/drbd/linux/drbd.h
===================================================================
--- trunk/drbd/linux/drbd.h	2006-04-05 10:17:57 UTC (rev 2131)
+++ trunk/drbd/linux/drbd.h	2006-04-05 18:01:11 UTC (rev 2132)
@@ -69,6 +69,11 @@
 	Detach
 };
 
+enum fencing_policy {
+	DontCare,
+	Resource,
+	Stonith
+};
 
 struct disk_config {
 	IN __u64    disk_size;
@@ -76,7 +81,7 @@
 	IN enum io_error_handler on_io_error;
 	IN int      meta_device;
 	IN int      meta_index;
-	IN int      split_brain_fix;
+	IN enum fencing_policy fencing;
 	const int   _pad;
 };
 
@@ -299,12 +304,14 @@
 	__MDF_ConnectedInd,
 	__MDF_FullSync,
 	__MDF_WasUpToDate,
+	__MDF_PeerOutDated // or less/lower.
 };
 #define MDF_Consistent      (1<<__MDF_Consistent)
 #define MDF_PrimaryInd      (1<<__MDF_PrimaryInd)
 #define MDF_ConnectedInd    (1<<__MDF_ConnectedInd)
 #define MDF_FullSync        (1<<__MDF_FullSync)
 #define MDF_WasUpToDate     (1<<__MDF_WasUpToDate)
+#define MDF_PeerOutDated    (1<<__MDF_PeerOutDated)
 
 enum UuidIndex {
 	Current,

Modified: trunk/user/drbdadm_scanner.fl
===================================================================
--- trunk/user/drbdadm_scanner.fl	2006-04-05 10:17:57 UTC (rev 2131)
+++ trunk/user/drbdadm_scanner.fl	2006-04-05 18:01:11 UTC (rev 2132)
@@ -68,7 +68,7 @@
 usage-count 		{ DP; return TK_USAGE_COUNT;		}
 size			{ DP; CP; RC(DISK_SIZE); return TK_DISK_OPTION;	}
 on-io-error		{ DP; CP; return TK_DISK_OPTION;	}
-split-brain-fix		{ DP; CP; return TK_DISK_SWITCH;	}
+fencing			{ DP; CP; return TK_DISK_OPTION;	}
 timeout			{ DP; CP; RC(TIMEOUT); return TK_NET_OPTION;	}
 ko-count		{ DP; CP; RC(KO_COUNT); return TK_NET_OPTION;	}
 ping-int		{ DP; CP; RC(PING_INT); return TK_NET_OPTION;	}

Modified: trunk/user/drbdmeta.c
===================================================================
--- trunk/user/drbdmeta.c	2006-04-05 10:17:57 UTC (rev 2131)
+++ trunk/user/drbdmeta.c	2006-04-05 18:01:11 UTC (rev 2132)
@@ -1093,6 +1093,7 @@
 		if (!m_strsep_bit(str, &md->flags, MDF_PrimaryInd)) break;
 		if (!m_strsep_bit(str, &md->flags, MDF_ConnectedInd)) break;
 		if (!m_strsep_bit(str, &md->flags, MDF_FullSync)) break;
+		if (!m_strsep_bit(str, &md->flags, MDF_PeerOutDated)) break;
 	} while (0);
 }
 
@@ -1814,7 +1815,7 @@
 	printf("Converting meta data...\n");
 	cfg->md.magic = DRBD_MD_MAGIC_08;
 
-	// The MDF Flags are the same in 07 and 08
+	// The MDF Flags are (nearly) the same in 07 and 08
 	cfg->md.flags = cfg->md.gc[Flags];
 	/* 
 	 */

Modified: trunk/user/drbdsetup.c
===================================================================
--- trunk/user/drbdsetup.c	2006-04-05 10:17:57 UTC (rev 2131)
+++ trunk/user/drbdsetup.c	2006-04-05 18:01:11 UTC (rev 2132)
@@ -69,6 +69,7 @@
 #define DEF_ON_IO_ERROR         PassOn
 #define DEF_KO_COUNT                 0
 #define DEF_ON_DISCONNECT       Reconnect
+#define DEF_FENCING             DontCare
 #define DEF_TWO_PRIMARIES            0
 #define DEF_AFTER_SB_0P       Disconnect
 #define DEF_AFTER_SB_1P       Disconnect
@@ -179,7 +180,7 @@
    (struct option[]) {
      { "size",       required_argument, 0, 'd' },
      { "on-io-error",required_argument, 0, 'e' },
-     { "split-brain-fix",  no_argument, 0, 'b' },
+     { "fencing",    required_argument, 0, 'f' },
      { 0,            0,                 0, 0 } } },
   {"resize", cmd_disk_size,             0,
    (struct option[]) {
@@ -207,6 +208,12 @@
   // [FreezeIO]    = "freeze_io" // TODO on the kernel side...
 };
 
+const char *fencing_names[] = {
+  [DontCare] = "dont-care",
+  [Resource] = "resource-only",
+  [Stonith]  = "resource-and-stonith" 
+};
+
 const char *asb0p_names[] = {
   [Disconnect]        = "disconnect",
   [DiscardYoungerPri] = "discard-younger-primary",
@@ -410,6 +417,12 @@
     if(i < ARRY_SIZE(dh_names)-1) printf(",");
   }
 
+  printf("\nAvailable fencing policies:");
+  for(i=0;i<ARRY_SIZE(fencing_names);i++) {
+    printf(" %s",fencing_names[i]);
+    if(i < ARRY_SIZE(fencing_names)-1) printf(",");
+  }
+
   printf("\n\nVersion: "REL_VERSION" (api:%d)\n%s\n",
 		  API_VERSION, drbd_buildtag());
   if (addinfo)
@@ -449,7 +462,7 @@
 {
   cn->config.disk_size = 0; /* default not known */
   cn->config.on_io_error = DEF_ON_IO_ERROR;
-  cn->config.split_brain_fix = 0;
+  cn->config.fencing = DEF_FENCING;
 
   if(argc==0) return 0;
 
@@ -475,8 +488,13 @@
 	    return 20;
 	  }
 	  break;
-	case 'b':
-	  cn->config.split_brain_fix = 1;
+	case 'f':
+	  cn->config.fencing = lookup_handler(optarg,fencing_names);
+	  if( cn->config.fencing == -1U ) {
+	    fprintf(stderr,"%s: '%s' is an invalid fency policy.\n",
+		    cmdname,optarg);
+	    return 20;
+	  }
 	  break;
 	case 1:	// non option argument. see getopt_long(3)
 	  fprintf(stderr,"%s: Unexpected nonoption argument '%s'\n",cmdname,optarg);

Modified: trunk/user/drbdtool_common.c
===================================================================
--- trunk/user/drbdtool_common.c	2006-04-05 10:17:57 UTC (rev 2131)
+++ trunk/user/drbdtool_common.c	2006-04-05 18:01:11 UTC (rev 2132)
@@ -326,12 +326,13 @@
 	for ( i=History_start ; i<=History_end ; i++ ) {
 		printf(X64(016)":", uuid[i]);
 	}
-	printf("%d:%d:%d:%d:%d\n",
+	printf("%d:%d:%d:%d:%d:%d\n",
 	       flags & MDF_Consistent ? 1 : 0,
 	       flags & MDF_WasUpToDate ? 1 : 0,
 	       flags & MDF_PrimaryInd ? 1 : 0,
 	       flags & MDF_ConnectedInd ? 1 : 0,
-	       flags & MDF_FullSync ? 1 : 0);
+	       flags & MDF_FullSync ? 1 : 0,
+	       flags & MDF_PeerOutDated ? 1 : 0);
 }
 
 void dt_pretty_print_uuids(const __u64* uuid, unsigned int flags)
@@ -345,12 +346,13 @@
 "       V               V                 V         V\n");               
 	dt_print_uuids(uuid, flags);
 	printf(
-"                                                                    ^ ^ ^ ^ ^\n"
-"                                      -<  Data consistancy flag  >--+ | | | |\n"
-"                             -<  Data was/is currently up-to-date  >--+ | | |\n"
-"                                  -<  Node was/is currently primary  >--+ | |\n"
-"                                  -<  Node was/is currently connected  >--+ |\n"
-"         -<  Node was in the progress of setting all bits in the bitmap  >--+\n"
+"                                                                    ^ ^ ^ ^ ^ ^\n"
+"                                      -<  Data consistancy flag  >--+ | | | | |\n"
+"                             -<  Data was/is currently up-to-date  >--+ | | | |\n"
+"                                  -<  Node was/is currently primary  >--+ | | |\n"
+"                                  -<  Node was/is currently connected  >--+ | |\n"
+"         -<  Node was in the progress of setting all bits in the bitmap  >--+ |\n"
+"                        -<  The peer's disk was out-dated or inconsistent  >--+\n"
 "\n");
 }
 



More information about the drbd-cvs mailing list