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

www-data www-data at garcon.linbit.com
Tue Jun 28 13:15:02 CEST 2005


Author: phil
Date: 2005-06-28 13:14:59 +0200 (Tue, 28 Jun 2005)
New Revision: 1809

Modified:
   trunk/drbd/drbd_fs.c
   trunk/drbd/drbd_int.h
   trunk/drbd/drbd_main.c
   trunk/drbd/drbd_receiver.c
   trunk/drbd/drbd_strings.c
   trunk/drbd/linux/drbd.h
Log:
This implements item 18 of the roadmap. I found out that it made more
sense to implement an "Outdate" packet rather than a "TearDown"
packet. But there was a new connectionStatus "TearDown" necessary.
All this just to have "drbdadm disconnect res" working on a primary
node....


Modified: trunk/drbd/drbd_fs.c
===================================================================
--- trunk/drbd/drbd_fs.c	2005-06-20 05:58:05 UTC (rev 1808)
+++ trunk/drbd/drbd_fs.c	2005-06-28 11:14:59 UTC (rev 1809)
@@ -1002,7 +1002,44 @@
 	return 0;
 }
 
+STATIC int drbd_ioctl_unconfig_net(struct Drbd_Conf *mdev)
+{
+	drbd_state_t os,ns;
+	int r;
 
+	// Request state silently:
+	spin_lock_irq(&mdev->req_lock);
+	os = mdev->state;
+	r = _drbd_set_state(mdev, _NS(conn,StandAlone), 0);
+	ns = mdev->state;
+	spin_unlock_irq(&mdev->req_lock);
+	after_state_ch(mdev,os,ns);
+
+	if ( r == 2 )  return 0;
+	if ( r == -7 ) {
+		drbd_send_short_cmd(mdev, OutdateRequest);
+		wait_event(mdev->cstate_wait,
+			   mdev->state.s.pdsk <= Outdated || 
+			   mdev->state.s.conn < TearDown );
+		if( mdev->state.s.conn < TearDown ) return 0;
+
+		r = drbd_request_state(mdev,NS(conn,StandAlone));
+	}
+
+	if( r <= 0 ) return -ENODATA;
+
+	if ( mdev->cram_hmac_tfm ) {
+		crypto_free_tfm(mdev->cram_hmac_tfm);
+		mdev->cram_hmac_tfm = NULL;
+	}
+
+	drbd_sync_me(mdev); /* FIXME what if fsync returns error */
+	drbd_thread_stop(&mdev->receiver);
+	
+	return 0;
+}
+
+
 int drbd_ioctl(struct inode *inode, struct file *file,
 			   unsigned int cmd, unsigned long arg)
 {
@@ -1117,25 +1154,7 @@
 		break;
 
 	case DRBD_IOCTL_UNCONFIG_NET:
-		if ( mdev->state.s.conn == StandAlone) break;
-
-		r = drbd_request_state(mdev,NS(conn,StandAlone));
-		if( r == 2 ) { break; }
-		if( r <= 0 ) {
-			err=-ENODATA;
-			break;
-		} 
-		/* r == 1 which means that we changed the state... */
-
-		if ( mdev->cram_hmac_tfm ) {
-			crypto_free_tfm(mdev->cram_hmac_tfm);
-			mdev->cram_hmac_tfm = NULL;
-		}
-
-		drbd_sync_me(mdev); /* FIXME what if fsync returns error */
-
-		drbd_thread_stop(&mdev->receiver);
-
+		err = drbd_ioctl_unconfig_net(mdev);
 		break;
 
 	case DRBD_IOCTL_UNCONFIG_DISK:

Modified: trunk/drbd/drbd_int.h
===================================================================
--- trunk/drbd/drbd_int.h	2005-06-20 05:58:05 UTC (rev 1808)
+++ trunk/drbd/drbd_int.h	2005-06-28 11:14:59 UTC (rev 1809)
@@ -298,6 +298,8 @@
 	ReportState,
 	AuthChallenge,
 	AuthResponse,
+	OutdateRequest,
+	OutdatedReply,
 
 	Ping,         // These are sent on the meta socket...
 	PingAck,
@@ -334,11 +336,13 @@
 		[RSDataRequest]    = "RSDataRequest",
 		[SyncParam]        = "SyncParam",
 		[ReportProtocol]   = "ReportProtocol",
-		[ReportUUIDs]     = "ReportUUIDs",
+		[ReportUUIDs]      = "ReportUUIDs",
 		[ReportSizes]      = "ReportSizes",
 		[ReportState]      = "ReportState",
 		[AuthChallenge]    = "AuthChallenge",
 		[AuthResponse]     = "AuthResponse",
+		[OutdateRequest]   = "OutdateRequest",
+		[OutdatedReply]    = "OutdatedReply",
 		[Ping]             = "Ping",
 		[PingAck]          = "PingAck",
 		[RecvAck]          = "RecvAck",
@@ -347,7 +351,7 @@
 		[NegDReply]        = "NegDReply",
 		[NegRSDReply]      = "NegRSDReply",
 		[BarrierAck]       = "BarrierAck",
-		[DiscardNote]      = "DiscardNote"
+		[DiscardNote]      = "DiscardNote",
 	};
 
 	if (cmd == HandShake) return "HandShake";

Modified: trunk/drbd/drbd_main.c
===================================================================
--- trunk/drbd/drbd_main.c	2005-06-20 05:58:05 UTC (rev 1808)
+++ trunk/drbd/drbd_main.c	2005-06-28 11:14:59 UTC (rev 1809)
@@ -564,7 +564,8 @@
 		ns.s.conn = Connected;
 	}
 
-	if( ns.s.conn >= Connected && ns.s.disk == Consistent ) {
+	if( ns.s.conn >= Connected && 
+	    ( ns.s.disk == Consistent || ns.s.disk == Outdated ) ) {
 		switch(ns.s.conn) {
 		case SkippedSyncT:
 		case WFBitMapT:
@@ -583,9 +584,13 @@
 			WARN("Implicit set disk state Inconsistent!\n");
 			break;
 		}
+		if( os.s.disk == Outdated && ns.s.disk == UpToDate ) {
+			WARN("Implicit set disk from Outdate to UpToDate\n");
+		}
 	}
 
-	if( ns.s.conn >= Connected && ns.s.pdsk == Consistent ) {
+	if( ns.s.conn >= Connected && 
+	    ( ns.s.pdsk == Consistent || ns.s.pdsk == Outdated ) ) {
 		switch(ns.s.conn) {
 		case Connected:
 		case SkippedSyncT:
@@ -604,6 +609,9 @@
 			WARN("Implicit set pdsk Inconsistent!\n");
 			break;
 		}
+		if( os.s.pdsk == Outdated && ns.s.pdsk == UpToDate ) {
+			WARN("Implicit set pdsk from Outdate to UpToDate\n");
+		}
 	}
 
 

Modified: trunk/drbd/drbd_receiver.c
===================================================================
--- trunk/drbd/drbd_receiver.c	2005-06-20 05:58:05 UTC (rev 1808)
+++ trunk/drbd/drbd_receiver.c	2005-06-28 11:14:59 UTC (rev 1809)
@@ -1713,6 +1713,50 @@
 	return TRUE; // cannot fail.
 }
 
+STATIC int receive_outdate(drbd_dev *mdev, Drbd_Header *h)
+{
+	drbd_state_t os,ns;
+	int r;
+
+	WARN("OutdateRequest\n");
+
+	spin_lock_irq(&mdev->req_lock);
+	os = mdev->state;
+	if( os.s.disk < Outdated ) { 
+		r=-999;
+	} else {
+		r = _drbd_set_state(mdev, _NS2(disk,Outdated,conn,TearDown),
+				    ChgStateVerbose);
+	}
+	ns = mdev->state;
+	spin_unlock_irq(&mdev->req_lock);
+	after_state_ch(mdev,os,ns);
+
+	if( r >= 0 ) {
+		drbd_md_write(mdev);
+		drbd_send_short_cmd(mdev, OutdatedReply);
+		return TRUE;
+	}
+	
+	return FALSE;
+}
+
+STATIC int receive_outdated(drbd_dev *mdev, Drbd_Header *h)
+{
+	int r;
+
+	WARN("OutdatedReply\n");
+
+	drbd_uuid_new_current(mdev);
+	drbd_md_write(mdev);
+
+	r = drbd_request_state(mdev,NS2(pdsk,Outdated,conn,TearDown));
+	WARN("r=%d\n",r);
+	D_ASSERT(r >= 0);
+
+	return TRUE;
+}
+
 typedef int (*drbd_cmd_handler_f)(drbd_dev*,Drbd_Header*);
 
 static drbd_cmd_handler_f drbd_default_handler[] = {
@@ -1736,6 +1780,8 @@
 	[ReportUUIDs]      = receive_uuids,
 	[ReportSizes]      = receive_sizes,
 	[ReportState]      = receive_state,
+	[OutdateRequest]   = receive_outdate,
+	[OutdatedReply]    = receive_outdated,
 };
 
 static drbd_cmd_handler_f *drbd_cmd_handler = drbd_default_handler;
@@ -1890,7 +1936,8 @@
 			*/
 			drbd_uuid_new_current(mdev);
 		}
-		if ( test_bit(SPLIT_BRAIN_FIX,&mdev->flags) ) {
+		if ( test_bit(SPLIT_BRAIN_FIX,&mdev->flags) &&
+		     mdev->state.s.pdsk >= DUnknown ) {
 			drbd_disks_t nps = drbd_try_outdate_peer(mdev);
 			drbd_request_state(mdev,NS(pdsk,nps));
 		}

Modified: trunk/drbd/drbd_strings.c
===================================================================
--- trunk/drbd/drbd_strings.c	2005-06-20 05:58:05 UTC (rev 1808)
+++ trunk/drbd/drbd_strings.c	2005-06-28 11:14:59 UTC (rev 1809)
@@ -30,6 +30,7 @@
 	[NetworkFailure] = "NetworkFailure",
 	[WFConnection]   = "WFConnection",
 	[WFReportParams] = "WFReportParams",
+	[TearDown]       = "TearDown",
 	[Connected]      = "Connected",
 	[SkippedSyncS]   = "SkippedSyncS",
 	[SkippedSyncT]   = "SkippedSyncT",

Modified: trunk/drbd/linux/drbd.h
===================================================================
--- trunk/drbd/linux/drbd.h	2005-06-20 05:58:05 UTC (rev 1808)
+++ trunk/drbd/linux/drbd.h	2005-06-28 11:14:59 UTC (rev 1809)
@@ -195,6 +195,7 @@
 	NetworkFailure,
 	WFConnection,
 	WFReportParams, // we have a socket
+	TearDown, 
 	Connected,      // we have introduced each other
 	SkippedSyncS,   // we should have synced, but user said no
 	SkippedSyncT,



More information about the drbd-cvs mailing list