[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