[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