[DRBD-cvs] drbd by phil; * Fix to drbd_ee_bh_prepare(). Now it wo...

drbd-user@lists.linbit.com drbd-user@lists.linbit.com
Sun, 1 Feb 2004 21:01:46 +0100 (CET)


DRBD CVS committal

Author  : phil
Module  : drbd

Dir     : drbd/drbd


Modified Files:
      Tag: rel-0_7-branch
	drbd_compat_wrappers.h drbd_receiver.c 


Log Message:
* Fix to drbd_ee_bh_prepare(). Now it works on Linux-2.4 again.
* removed the socket parameters from all drbd_recv() functions.
  drbd_recv_short() is (and should) only be used by asender/msocket
  drbd_recv() and drbd_recv_header() is (and should) only be used by
  the receiver thread. [This removes a lot of cruft. It was never
  ever a clever idea to have a common drbd_recv()]
* Altough Ping and PingAck packets worked the actual liveliness check 
  was missing. Added it. -- Detection of dead peers works again.	  

===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_compat_wrappers.h,v
retrieving revision 1.1.2.18
retrieving revision 1.1.2.19
diff -u -3 -r1.1.2.18 -r1.1.2.19
--- drbd_compat_wrappers.h	1 Feb 2004 18:15:08 -0000	1.1.2.18
+++ drbd_compat_wrappers.h	1 Feb 2004 20:01:41 -0000	1.1.2.19
@@ -35,7 +35,7 @@
 	blk_size[MAJOR_NR][(int)(mdev - drbd_conf)] = (size>>1);
 }
 
-#warning "FIXME why don't we care for the return value?"
+//#warning "FIXME why don't we care for the return value?"
 static inline void drbd_set_blocksize(drbd_dev *mdev, int blksize)
 {
 	set_blocksize(MKDEV(MAJOR_NR, (int)(mdev-drbd_conf)), blksize);
@@ -141,6 +141,7 @@
 	bh->b_private  = mdev;
 	bh->b_state    = (1 << BH_Req)
 			|(1 << BH_Launder)
+	                |(1 << BH_Mapped)
 			|(1 << BH_Lock);
 }
 
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_receiver.c,v
retrieving revision 1.97.2.99
retrieving revision 1.97.2.100
diff -u -3 -r1.97.2.99 -r1.97.2.100
--- drbd_receiver.c	27 Jan 2004 15:51:36 -0000	1.97.2.99
+++ drbd_receiver.c	1 Feb 2004 20:01:41 -0000	1.97.2.100
@@ -419,8 +419,7 @@
 	return 0;
 }
 
-STATIC int drbd_recv_short(drbd_dev *mdev, struct socket* sock,
-		    void *buf, size_t size)
+STATIC int drbd_recv_short(drbd_dev *mdev, void *buf, size_t size)
 {
 	mm_segment_t oldfs;
 	struct iovec iov;
@@ -440,7 +439,7 @@
 	oldfs = get_fs();
 	set_fs(KERNEL_DS);
 
-	rv = sock_recvmsg(sock, &msg, size, msg.msg_flags);
+	rv = sock_recvmsg(mdev->meta.socket, &msg, size, msg.msg_flags);
 
 	set_fs(oldfs);
 
@@ -453,13 +452,11 @@
 # define SK_(x)		sk_ ## x
 #endif
 
-int drbd_recv(drbd_dev *mdev, struct socket* sock,
-	      void *buf, size_t size)
+int drbd_recv(drbd_dev *mdev,void *buf, size_t size)
 {
 	mm_segment_t oldfs;
 	struct iovec iov;
 	struct msghdr msg;
-	char * sockname = (sock == mdev->meta.socket ? "msock" : "sock");
 	int rv;
 
 	msg.msg_control = NULL;
@@ -476,64 +473,28 @@
 	set_fs(KERNEL_DS);
 
 	for(;;) {
-		rv = sock_recvmsg(sock, &msg, size, msg.msg_flags);
+		rv = sock_recvmsg(mdev->data.socket,&msg,size,msg.msg_flags);
 		if (rv == size) break;
 
 		/* Note:
 		 * ECONNRESET   other side closed the connection
 		 * ERESTARTSYS  (on  sock) we got a signal
-		 * EINTR        (on msock) we got a signal
-		 * EAGAIN       (on msock) rcvtimeo expired
 		 */
-		if (rv == -EAGAIN) {
-			D_ASSERT(sock == mdev->meta.socket);
-			D_ASSERT(current == mdev->asender.task);
-
-			// FIXME decide this more elegantly
-			if ( mdev->meta.socket->sk->SK_(rcvtimeo) == mdev->conf.ping_int*HZ) {
-				C_DBG(0,"recv_header timed out, sending ping\n");
-				// goto do_ping;
-			} else {
-				ERR("PingAck did not arrive\n");
-				break;
-			}
-		} else if (rv == -EINTR) {
-			unsigned long flags = 0;
-
-			D_ASSERT(sock == mdev->meta.socket);
-			D_ASSERT(current == mdev->asender.task);
 
-			LOCK_SIGMASK(current,flags);
-			if (sigismember(&current->pending.signal, DRBD_SIG)) {
-				// should only trigger for wake_asender
-				sigdelset(&current->pending.signal, DRBD_SIG);
-				RECALC_SIGPENDING(current);
-			}
-			UNLOCK_SIGMASK(current,flags);
-			break;
-		} else if (rv < 0) {
+		if (rv < 0) {
 			if (rv == -ECONNRESET)
-				INFO("%s was reset by peer\n",sockname);
+				INFO("sock was reset by peer\n");
 			else if (rv != -ERESTARTSYS)
-				ERR("%s_recvmsg returned %d\n",sockname,rv);
+				ERR("sock_recvmsg returned %d\n",rv);
 			break;
 		} else if (rv == 0) {
-			INFO("%s was shut down by peer\n",sockname);
+			INFO("sock was shut down by peer\n");
 			break;
 		} else {
 			// if data comes in bytewise, this might trigger ...
-			ERR("logic error: %s_recvmsg returned %d\n",
-			    sockname, rv);
+			ERR("logic error: sock_recvmsg returned %d\n",rv);
 			break;
 		}
-
-		// actually no goto needed, but it makes it more obvious
-		// do_ping:
-		if (!drbd_send_ping(mdev))
-			break;
-		// full ack timeout
-		mdev->meta.socket->sk->SK_(rcvtimeo) = mdev->conf.timeout*HZ/10;
-
 	};
 
 	set_fs(oldfs);
@@ -677,44 +638,14 @@
 	return 1;
 }
 
-STATIC int drbd_recv_header(drbd_dev *mdev,struct socket* sock, Drbd_Header *h)
+STATIC int drbd_recv_header(drbd_dev *mdev, Drbd_Header *h)
 {
 	int r;
 
-	if (signal_pending(current) && current == mdev->asender.task) {
-		// shortcut only, same effect as if we first go up and
-		// down the helper function calls.
-		int still_pending;
-		unsigned long flags = 0;
-		LOCK_SIGMASK(current,flags);
-		if (sigismember(&current->pending.signal, DRBD_SIG)) {
-			sigdelset(&current->pending.signal, DRBD_SIG);
-			RECALC_SIGPENDING(current);
-		}
-		still_pending = signal_pending(current);
-		UNLOCK_SIGMASK(current,flags);
-
-		if (still_pending)
-			DBG("Nonprivate signal pending in %s: 0x%08lx\n",
-			    __func__,current->pending.signal.sig[0]);
-
-		h->command = WakeAsender;
-		h->length  = 0;
-		// fail if it was not our private signal.
-		return !still_pending;
-	}
-
-	r = drbd_recv(mdev,sock,h,sizeof(*h));
-	if (r == -EINTR && sock == mdev->meta.socket) {
-		h->command = WakeAsender;
-		h->length  = 0;
-		return TRUE;
-	}
+	r = drbd_recv(mdev,h,sizeof(*h));
 
 	if (unlikely( r != sizeof(*h) )) {
-		ERR("short read expecting header on %s: r=%d\n",
-		    sock == mdev->meta.socket ? "msock" : "sock",
-		    r);
+		ERR("short read expecting header on sock: r=%d\n",r);
 		return FALSE;
 	};
 	h->command = be16_to_cpu(h->command);
@@ -726,13 +657,7 @@
 		return FALSE;
 	}
 	mdev->last_received = jiffies;
-	if (sock == mdev->meta.socket) {
-		// restore idle timeout
-		mdev->meta.socket->sk->SK_(rcvtimeo) = mdev->conf.ping_int*HZ;
-	}
-	C_DBG(5,"on %s <<< %s l: %d\n",
-	    sock == mdev->meta.socket ? "msock" : "sock",
-	    cmdname(h->command), h->length);
+
 	return TRUE;
 }
 
@@ -745,7 +670,7 @@
 	ERR_IF(mdev->state != Secondary) return FALSE;
 	ERR_IF(h->length != (sizeof(*p)-sizeof(*h))) return FALSE;
 
-	rv = drbd_recv(mdev, mdev->data.socket, h->payload, h->length);
+	rv = drbd_recv(mdev, h->payload, h->length);
 	ERR_IF(rv != h->length) return FALSE;
 
 	inc_unacked(mdev);
@@ -785,7 +710,7 @@
 
 	bio = &e->private_bio;
 
-	rr=drbd_recv(mdev,mdev->data.socket, drbd_bio_kmap(bio), data_size);
+	rr=drbd_recv(mdev, drbd_bio_kmap(bio), data_size);
 	drbd_bio_kunmap(bio);
 
 	if ( rr != data_size) {
@@ -828,7 +753,7 @@
 
 	D_ASSERT( sector == drbd_pr_get_sector(pr) );
 
-	rr=drbd_recv(mdev,mdev->data.socket,drbd_bio_kmap(bio),data_size);
+	rr=drbd_recv(mdev,drbd_bio_kmap(bio),data_size);
 	drbd_bio_kunmap(bio);
 
 	ok=(rr==data_size);
@@ -953,7 +878,7 @@
 	ERR_IF(data_size &  0xff) return FALSE;
 	ERR_IF(data_size >  PAGE_SIZE) return FALSE;
 
-	if (drbd_recv(mdev, mdev->data.socket, h->payload, header_size) != header_size)
+	if (drbd_recv(mdev, h->payload, header_size) != header_size)
 		return FALSE;
 
 	sector = be64_to_cpu(p->sector);
@@ -1021,7 +946,7 @@
 	ERR_IF(data_size &  0xff) return FALSE;
 	ERR_IF(data_size >  PAGE_SIZE) return FALSE;
 
-	if (drbd_recv(mdev, mdev->data.socket, h->payload, header_size) != header_size)
+	if (drbd_recv(mdev, h->payload, header_size) != header_size)
 		return FALSE;
 
 	sector = be64_to_cpu(p->sector);
@@ -1064,7 +989,7 @@
 
 	ERR_IF(h->length != (sizeof(*p)-sizeof(*h))) return FALSE;
 
-	if (drbd_recv(mdev, mdev->data.socket, h->payload, h->length) != h->length)
+	if (drbd_recv(mdev, h->payload, h->length) != h->length)
 		return FALSE;
 
 	sector    = be64_to_cpu(p->sector);
@@ -1112,7 +1037,7 @@
 	// FIXME move into helper
 	ERR_IF(h->length != (sizeof(*p)-sizeof(*h))) return FALSE;
 
-	if (drbd_recv(mdev, mdev->data.socket, h->payload, h->length) != h->length)
+	if (drbd_recv(mdev, h->payload, h->length) != h->length)
 		return FALSE;
 
 	// XXX harmless race with ioctl ...
@@ -1140,7 +1065,7 @@
 
 	ERR_IF(h->length != (sizeof(*p)-sizeof(*h))) return FALSE;
 
-	if (drbd_recv(mdev, mdev->data.socket, h->payload, h->length) != h->length)
+	if (drbd_recv(mdev, h->payload, h->length) != h->length)
 		return FALSE;
 
 	if(be32_to_cpu(p->state) == Primary && mdev->state == Primary ) {
@@ -1278,14 +1203,14 @@
 		want=min_t(int,MBDS_PACKET_SIZE,(bm_words-bm_i)*sizeof(word));
 		ERR_IF(want != h->length) goto out;
 		if (want==0) break;
-		if (drbd_recv(mdev, mdev->data.socket, buffer, want) != want)
+		if (drbd_recv(mdev, buffer, want) != want)
 			goto out;
 		for(buf_i=0;buf_i<want/sizeof(unsigned long);buf_i++) {
 			word = lel_to_cpu(buffer[buf_i]) | bm[bm_i];
 			bits += hweight_long(word);
 			bm[bm_i++] = word;
 		}
-		if (!drbd_recv_header(mdev,mdev->data.socket,h))
+		if (!drbd_recv_header(mdev,h))
 			goto out;
 		D_ASSERT(h->command == ReportBitMap);
 	}
@@ -1388,7 +1313,7 @@
 	size = h->length;
 	while (size > 0) {
 		want = min_t(int,size,sizeof(sink));
-		r = drbd_recv(mdev,mdev->data.socket,sink,want);
+		r = drbd_recv(mdev,sink,want);
 		D_ASSERT(r >= 0);
 		if (r < 0) break;
 		size -= r;
@@ -1461,7 +1386,7 @@
 
 	for (;;) {
 		drbd_collect_zombies(mdev); // in case a syncer exited.
-		if (!drbd_recv_header(mdev,mdev->data.socket,header))
+		if (!drbd_recv_header(mdev,header))
 			break;
 
 		if (header->command < MAX_CMD)
@@ -1697,8 +1622,7 @@
 
 		if (!drbd_process_ee(mdev,&mdev->done_ee)) goto err;
 
-		rv = drbd_recv_short(mdev,mdev->meta.socket,buf,
-				     expect-received);
+		rv = drbd_recv_short(mdev,buf,expect-received);
 
 		/* Note:
 		 * -EINTR        (on meta) we got a signal
@@ -1717,6 +1641,11 @@
 			ERR("meta connection shut down by peer.\n");
 			goto err;
 		} else if (rv == -EAGAIN) {
+			if( mdev->meta.socket->sk->SK_(rcvtimeo) ==
+			    mdev->conf.timeout*HZ/20) {
+				ERR("PingAck did not arrive in time.\n");
+				goto err;
+			}
 			set_bit(SEND_PING,&mdev->flags);
 			continue;
 		} else if (rv == -EINTR) {