[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