[DRBD-cvs] r1637 - in trunk: drbd user
svn at svn.drbd.org
svn at svn.drbd.org
Sat Nov 13 19:11:57 CET 2004
Author: phil
Date: 2004-11-13 19:11:55 +0100 (Sat, 13 Nov 2004)
New Revision: 1637
Modified:
trunk/drbd/drbd_fs.c
trunk/drbd/drbd_main.c
trunk/drbd/drbd_strings.c
trunk/user/drbdmeta.c
Log:
* Allow "drbdsetup outdate" only to downgrade from UpToDate.
[No Upgrades!!]
* Make use of The UpToDate Flag in the metadata comparison step.
* Rearranged drbdmeta to display the UpToDate flag in the right
position.
Modified: trunk/drbd/drbd_fs.c
===================================================================
--- trunk/drbd/drbd_fs.c 2004-11-12 11:51:55 UTC (rev 1636)
+++ trunk/drbd/drbd_fs.c 2004-11-13 18:11:55 UTC (rev 1637)
@@ -630,7 +630,7 @@
/* --do-what-I-say*/
if (mdev->state.s.disk < UpToDate) {
- WARN("Forcefully set to UpToDate!");
+ WARN("Forcefully set to UpToDate!\n");
r = drbd_request_state(mdev,NS2(role,newstate & 0x3,
disk,UpToDate));
if(r<=0) return -EIO;
@@ -816,6 +816,37 @@
return 0;
}
+STATIC int drbd_outdate_ioctl(drbd_dev *mdev)
+{
+ drbd_state_t os,ns;
+ int r;
+
+ spin_lock_irq(&mdev->req_lock);
+ os = mdev->state;
+ if( mdev->state.s.disk != UpToDate ) {
+ r=-999;
+ } else {
+ r = _drbd_set_state(mdev, _NS(role,Outdated), 0);
+ }
+ ns = mdev->state;
+ spin_unlock_irq(&mdev->req_lock);
+
+ if( r == 2 ) return 0;
+ if( r == -999 ) {
+ return -EBADMSG; // TODO better errnos.
+ }
+ after_state_ch(mdev,os,ns); // TODO decide if neccesarry.
+
+ if( r <= 0 ) {
+ return -EISCONN;
+ }
+
+ drbd_md_write(mdev);
+
+ return 0;
+}
+
+
int drbd_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg)
{
@@ -1100,15 +1131,7 @@
break;
case DRBD_IOCTL_OUTDATE_DISK:
- r = drbd_request_state(mdev,NS(disk,Outdated));
- if( r == 2 ) break;
- if( r <= 0 ) {
- err = -EISCONN;
- break;
- }
-
- drbd_md_write(mdev);
-
+ err = drbd_outdate_ioctl(mdev);
break;
default:
Modified: trunk/drbd/drbd_main.c
===================================================================
--- trunk/drbd/drbd_main.c 2004-11-12 11:51:55 UTC (rev 1636)
+++ trunk/drbd/drbd_main.c 2004-11-13 18:11:55 UTC (rev 1637)
@@ -411,42 +411,18 @@
{
drbd_state_t os;
char pb[160], *pbp;
- int rv=1;
+ int rv=1,warn_sync_abort=0;
os = mdev->state;
if( ns.i == os.i ) return 2;
- 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 ) rv=-1;
-
- if( ns.s.role == Primary && ns.s.disk <= Inconsistent &&
- ns.s.conn < Connected ) rv=-2;
-
- if( ns.s.peer == Primary && ns.s.pdsk <= Inconsistent &&
- ns.s.conn < Connected ) rv=-3;
-
- if( ns.s.conn > Connected &&
- ns.s.disk < UpToDate && ns.s.pdsk < UpToDate ) rv=-4;
-
- if( ns.s.conn > Connected &&
- (ns.s.disk == Diskless || ns.s.pdsk == Diskless ) ) rv=-5;
-
- if( (ns.s.conn >= Connected && ns.s.conn != PausedSyncT) &&
- ns.s.disk == Outdated ) rv=-6;
-
- }
-
/* State sanitising */
if( ns.s.conn < Connected ) ns.s.peer = Unknown;
if( ns.s.conn < Connected ) ns.s.pdsk = DUnknown;
if( ns.s.disk <= Failed && ns.s.conn > Connected) {
- WARN("Resync aborted.\n");
+ warn_sync_abort=1;
ns.s.conn = Connected;
}
@@ -492,11 +468,42 @@
}
}
+ 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 ) rv=-1;
+
+ if( ns.s.role == Primary && ns.s.disk < UpToDate &&
+ ns.s.conn < Connected ) rv=-2;
+
+ if( ns.s.peer == Primary && ns.s.pdsk <= Inconsistent &&
+ ns.s.conn < Connected ) rv=-3;
+
+ if( ns.s.conn > Connected &&
+ ns.s.disk < UpToDate && ns.s.pdsk < UpToDate ) rv=-4;
+
+ if( ns.s.conn > Connected &&
+ (ns.s.disk == Diskless || ns.s.pdsk == Diskless ) ) rv=-5;
+
+ if( (ns.s.conn == Connected ||
+ ns.s.conn == SkippedSyncS ||
+ ns.s.conn == WFBitMapS ||
+ ns.s.conn == SyncSource ||
+ ns.s.conn == PausedSyncS) &&
+ ns.s.disk == Outdated ) rv=-6;
+ }
+
if(rv <= 0) {
if( flags & ChgStateVerbose ) print_st_err(mdev,os,ns,rv);
return rv;
}
+ if(warn_sync_abort) {
+ WARN("Resync aborted.\n");
+ }
+
#if DUMP_MD >= 2
pbp = pb;
PSC(role);
@@ -2163,15 +2170,16 @@
int i;
u32 me,other;
- /* FIXME
- * Take the UpToDate flag into account.
- */
-
me=mdev->gen_cnt[Flags] & MDF_Consistent;
other=be32_to_cpu(partner->gen_cnt[Flags]) & MDF_Consistent;
if( me > other ) return 1;
if( me < other ) return -1;
+ me=mdev->gen_cnt[Flags] & MDF_UpToDate;
+ other=be32_to_cpu(partner->gen_cnt[Flags]) & MDF_UpToDate;
+ if( me > other ) return 1;
+ if( me < other ) return -1;
+
for(i=HumanCnt;i<=ArbitraryCnt;i++) {
me=mdev->gen_cnt[i];
other=be32_to_cpu(partner->gen_cnt[i]);
Modified: trunk/drbd/drbd_strings.c
===================================================================
--- trunk/drbd/drbd_strings.c 2004-11-12 11:51:55 UTC (rev 1636)
+++ trunk/drbd/drbd_strings.c 2004-11-13 18:11:55 UTC (rev 1637)
@@ -60,8 +60,8 @@
static const char *drbd_state_sw_errors[] = {
[1] = "Multiple primaries now allowed by config",
- [2] = "Refusing to be Primary without consistent data",
- [3] = "Refusing to make peer Primary without data",
+ [2] = "Refusing to be Primary without UpToDate disk",
+ [3] = "Refusing to make peer Primary without disk",
[4] = "Refusing to be inconsistent on both nodes",
[5] = "Refusing to be syncing and diskless",
[6] = "Refusing to be Outdated while Connected",
@@ -86,7 +86,7 @@
}
const char* set_st_err_name(int err) {
- return err < -4 ? "TO_SMALL" :
+ return err < -6 ? "TO_SMALL" :
err > -1 ? "TO_LARGE"
: drbd_state_sw_errors[-err];
}
Modified: trunk/user/drbdmeta.c
===================================================================
--- trunk/user/drbdmeta.c 2004-11-12 11:51:55 UTC (rev 1636)
+++ trunk/user/drbdmeta.c 2004-11-13 18:11:55 UTC (rev 1637)
@@ -635,14 +635,14 @@
{
printf("%d:%d:%d:%d:%d:%d:%d:%d:%d\n",
md->gc[Flags] & MDF_Consistent ? 1 : 0,
+ md->gc[Flags] & MDF_UpToDate ? 1 : 0,
md->gc[HumanCnt],
md->gc[TimeoutCnt],
md->gc[ConnectedCnt],
md->gc[ArbitraryCnt],
md->gc[Flags] & MDF_PrimaryInd ? 1 : 0,
md->gc[Flags] & MDF_ConnectedInd ? 1 : 0,
- md->gc[Flags] & MDF_FullSync ? 1 : 0,
- md->gc[Flags] & MDF_UpToDate ? 1 : 0);
+ md->gc[Flags] & MDF_FullSync ? 1 : 0);
}
/******************************************
@@ -1091,29 +1091,28 @@
return -1;
printf("\n"
- " UpToDate |\n"
- " WantFullSync | |\n"
- " ConnectedInd | | |\n"
- " lastState | | | |\n"
- " ArbitraryCnt | | | | |\n"
- " ConnectedCnt | | | | | |\n"
- " TimeoutCnt | | | | | | |\n"
- " HumanCnt | | | | | | | |\n"
+ " WantFullSync |\n"
+ " ConnectedInd | |\n"
+ " lastState | | |\n"
+ " ArbitraryCnt | | | |\n"
+ " ConnectedCnt | | | | |\n"
+ " TimeoutCnt | | | | | |\n"
+ " HumanCnt | | | | | | |\n"
+ " UpToDate | | | | | | | |\n"
"Consistent | | | | | | | | |\n"
" --------+-----+-----+-----+-----+-----+-----+-----+-----+\n"
- " %3s | %3d | %3d | %3d | %3d | %3s | %3s | %3s | %3s \n"
+ " %3s | %3s | %3d | %3d | %3d | %3d | %3s | %3s | %3s \n"
"\n",
cfg->md.gc[Flags] & MDF_Consistent ? "1/c" : "0/i",
+ cfg->md.gc[Flags] & MDF_UpToDate ? "1/y" : "0/n",
cfg->md.gc[HumanCnt],
cfg->md.gc[TimeoutCnt],
cfg->md.gc[ConnectedCnt],
cfg->md.gc[ArbitraryCnt],
cfg->md.gc[Flags] & MDF_PrimaryInd ? "1/p" : "0/s",
cfg->md.gc[Flags] & MDF_ConnectedInd ? "1/c" : "0/n",
- cfg->md.gc[Flags] & MDF_FullSync ? "1/y" : "0/n",
- cfg->md.gc[Flags] & MDF_UpToDate ? "1/y" : "0/n");
+ cfg->md.gc[Flags] & MDF_FullSync ? "1/y" : "0/n");
-
if (cfg->md.la_sect) {
printf("last agreed size: %s\n",
ppsize(ppb, cfg->md.la_sect >> 1));
@@ -1295,6 +1294,7 @@
do {
if (!m_strsep_b(str, &tmp.gc[Flags], MDF_Consistent)) break;
+ if (!m_strsep_b(str, &tmp.gc[Flags], MDF_UpToDate)) break;
if (!m_strsep(str, &tmp.gc[HumanCnt])) break;
if (!m_strsep(str, &tmp.gc[TimeoutCnt])) break;
if (!m_strsep(str, &tmp.gc[ConnectedCnt])) break;
More information about the drbd-cvs
mailing list