[DRBD-cvs] svn commit by phil - r2264 - in trunk/drbd: . linux -
Imlemented item 34 of the ROADMAP
drbd-cvs at lists.linbit.com
drbd-cvs at lists.linbit.com
Thu Jul 6 16:29:54 CEST 2006
Author: phil
Date: 2006-07-06 16:29:52 +0200 (Thu, 06 Jul 2006)
New Revision: 2264
Modified:
trunk/drbd/drbd_int.h
trunk/drbd/drbd_main.c
trunk/drbd/drbd_receiver.c
trunk/drbd/linux/drbd_config.h
Log:
Imlemented item 34 of the ROADMAP
Modified: trunk/drbd/drbd_int.h
===================================================================
--- trunk/drbd/drbd_int.h 2006-07-05 11:51:12 UTC (rev 2263)
+++ trunk/drbd/drbd_int.h 2006-07-06 14:29:52 UTC (rev 2264)
@@ -315,7 +315,9 @@
MayIgnore = 0x100, // Flag only to test if (cmd > MayIgnore) ...
MAX_OPT_CMD,
- HandShake = 0xfffe // FIXED for the next century!
+ HandShakeM = 0xfff1, // First Packet on the MetaSock
+ HandShakeS = 0xfff2, // First Packet on the Socket
+ HandShake = 0xfffe // FIXED for the next century!
} Drbd_Packet_Cmd;
static inline const char* cmdname(Drbd_Packet_Cmd cmd)
Modified: trunk/drbd/drbd_main.c
===================================================================
--- trunk/drbd/drbd_main.c 2006-07-05 11:51:12 UTC (rev 2263)
+++ trunk/drbd/drbd_main.c 2006-07-06 14:29:52 UTC (rev 2264)
@@ -1823,7 +1823,6 @@
int rv,sent=0;
if (!sock) return -1000;
- if ((volatile int)mdev->state.conn < WFReportParams) return -1001;
// THINK if (signal_pending) return ... ?
Modified: trunk/drbd/drbd_receiver.c
===================================================================
--- trunk/drbd/drbd_receiver.c 2006-07-05 11:51:12 UTC (rev 2263)
+++ trunk/drbd/drbd_receiver.c 2006-07-06 14:29:52 UTC (rev 2264)
@@ -448,7 +448,8 @@
return 0;
}
-STATIC int drbd_recv_short(drbd_dev *mdev, void *buf, size_t size)
+STATIC int drbd_recv_short(drbd_dev *mdev, struct socket *sock,
+ void *buf, size_t size)
{
mm_segment_t oldfs;
struct iovec iov;
@@ -472,7 +473,7 @@
oldfs = get_fs();
set_fs(KERNEL_DS);
- rv = sock_recvmsg(mdev->meta.socket, &msg, size, msg.msg_flags);
+ rv = sock_recvmsg(sock, &msg, size, msg.msg_flags);
set_fs(oldfs);
@@ -628,6 +629,27 @@
STATIC int drbd_do_handshake(drbd_dev *mdev);
STATIC int drbd_do_auth(drbd_dev *mdev);
+STATIC int drbd_send_fp(drbd_dev *mdev,struct socket *sock,Drbd_Packet_Cmd cmd)
+{
+ Drbd_Header *h = (Drbd_Header *) &mdev->data.sbuf.head;
+
+ return _drbd_send_cmd(mdev,sock,cmd,h,sizeof(*h),0);
+}
+
+STATIC Drbd_Packet_Cmd drbd_recv_fp(drbd_dev *mdev,struct socket *sock)
+{
+ Drbd_Header *h = (Drbd_Header *) &mdev->data.sbuf.head;
+ int rr;
+
+ rr = drbd_recv_short(mdev, sock, h, sizeof(*h));
+
+ if( rr==sizeof(*h) && h->magic==BE_DRBD_MAGIC ) {
+ return be16_to_cpu(h->command);
+ }
+
+ return 0xffff;
+}
+
/*
* return values:
* 1 yess, we have a valid connection
@@ -637,55 +659,80 @@
*/
int drbd_connect(drbd_dev *mdev)
{
- struct socket *sock,*msock;
- int h;
+ struct socket *s, *sock,*msock;
+ int try,h;
D_ASSERT(mdev->state.conn > StandAlone);
D_ASSERT(!mdev->data.socket);
if(drbd_request_state(mdev,NS(conn,WFConnection)) < SS_Success ) return 0;
-
clear_bit(UNIQUE, &mdev->flags);
- /* Break out of unknown connect loops by random wait here. */
- set_current_state(TASK_INTERRUPTIBLE);
- schedule_timeout(net_random()%((mdev->net_conf->try_connect_int*HZ)/4));
+ sock = NULL;
+ msock = NULL;
- while(1) {
- sock=drbd_try_connect(mdev);
- if(sock) {
- msock=drbd_wait_for_connect(mdev);
- if(msock) {
- set_bit(UNIQUE, &mdev->flags);
- break;
- }
- else sock_release(sock);
- } else {
- sock=drbd_wait_for_connect(mdev);
- if(sock) {
- int retry;
- for (retry=1; retry <= 10; retry++) {
- // give the other side time to call
- // bind() & listen()
- set_current_state(TASK_INTERRUPTIBLE);
- schedule_timeout(HZ / 10);
- msock=drbd_try_connect(mdev);
- if(msock) goto connected;
- ERR("msock try_connect %d\n",retry);
+ do {
+ for(try=0;;) { // 3 tries, this should take less than a second!
+ s=drbd_try_connect(mdev);
+ if(s || ++try >= 3 ) break;
+ // give the other side time to call bind() & listen()
+ set_current_state(TASK_INTERRUPTIBLE);
+ schedule_timeout(HZ / 10);
+ }
+
+ if(s) {
+ if( !sock ) {
+ if( drbd_send_fp(mdev, s, HandShakeS) ) {
+ sock = s;
+ s = NULL;
}
- sock_release(sock);
+ } else if( !msock ) {
+ if( drbd_send_fp(mdev, s, HandShakeM) ) {
+ msock = s;
+ s = NULL;
+ }
+ } else {
+ ERR("Logic error in drbd_connect()\n");
+ return -1;
}
+ if(s) {
+ ERR("Error during sending initial packet.\n");
+ sock_release(s);
+ }
}
+
+ if(sock && msock) break;
+
+ s=drbd_wait_for_connect(mdev);
+ if(s) {
+ switch(drbd_recv_fp(mdev,s)) {
+ case HandShakeS:
+ if(sock) sock_release(sock);
+ sock = s;
+ break;
+ case HandShakeM:
+ if(msock) sock_release(msock);
+ msock = s;
+ if(sock) set_bit(UNIQUE, &mdev->flags);
+ break;
+ default:
+ WARN("Error receiving initial packet\n");
+ sock_release(s);
+ }
+ }
+
if(mdev->state.conn == Unconnected) return -1;
if(signal_pending(current)) {
flush_signals(current);
smp_rmb();
- if (get_t_state(&mdev->receiver) == Exiting)
+ if (get_t_state(&mdev->receiver) == Exiting) {
+ if(sock) sock_release(sock);
+ if(msock) sock_release(msock);
return -1;
+ }
}
- }
- connected:
+ } while( !sock || !msock );
msock->sk->sk_reuse=1; /* SO_REUSEADDR */
sock->sk->sk_reuse=1; /* SO_REUSEADDR */
@@ -3057,7 +3104,8 @@
if (!drbd_process_done_ee(mdev)) goto err;
set_bit(SIGNAL_ASENDER, &mdev->flags);
- rv = drbd_recv_short(mdev,buf,expect-received);
+ rv = drbd_recv_short(mdev, mdev->meta.socket,
+ buf,expect-received);
clear_bit(SIGNAL_ASENDER, &mdev->flags);
flush_signals(current);
Modified: trunk/drbd/linux/drbd_config.h
===================================================================
--- trunk/drbd/linux/drbd_config.h 2006-07-05 11:51:12 UTC (rev 2263)
+++ trunk/drbd/linux/drbd_config.h 2006-07-06 14:29:52 UTC (rev 2264)
@@ -24,7 +24,7 @@
#define REL_VERSION "8.0pre3"
#define API_VERSION 82
-#define PRO_VERSION 80
+#define PRO_VERSION 81
// undef if you need the workaround in drbd_receiver
#define HAVE_UML_TO_VIRT 1
More information about the drbd-cvs
mailing list