[DRBD-cvs] drbd by phil; Removed drbd_try_send_barrier() from ase...

drbd-user@lists.linbit.com drbd-user@lists.linbit.com
Tue, 6 Apr 2004 16:07:05 +0200 (CEST)


DRBD CVS committal

Author  : phil
Module  : drbd

Dir     : drbd/drbd


Modified Files:
      Tag: rel-0_7-branch
	drbd_dsender.c drbd_int.h drbd_main.c drbd_receiver.c 
	drbd_req-2.4.c 


Log Message:
Removed drbd_try_send_barrier() from asener's context. Now we do
the same thing from worker's context.

Before it could happen that we block in sock_sendmsg on the data_sock
and get a signal from wake_asender() in.

Fixed now.

===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_dsender.c,v
retrieving revision 1.1.2.89
retrieving revision 1.1.2.90
diff -u -3 -r1.1.2.89 -r1.1.2.90
--- drbd_dsender.c	26 Mar 2004 09:07:41 -0000	1.1.2.89
+++ drbd_dsender.c	6 Apr 2004 14:07:00 -0000	1.1.2.90
@@ -579,6 +579,20 @@
 	return ok;
 }
 
+int w_try_send_barrier(drbd_dev *mdev, struct drbd_work *w, int cancel)
+{
+	int ok=1;
+
+	if(unlikely(cancel)) return ok;
+
+	down(&mdev->data.mutex);
+	if(test_and_clear_bit(ISSUE_BARRIER,&mdev->flags)) {
+		ok = _drbd_send_barrier(mdev);
+	}
+	up(&mdev->data.mutex);
+
+	return ok;
+}
 
 STATIC void drbd_global_lock(void)
 {
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_int.h,v
retrieving revision 1.58.2.142
retrieving revision 1.58.2.143
diff -u -3 -r1.58.2.142 -r1.58.2.143
--- drbd_int.h	24 Mar 2004 13:28:11 -0000	1.58.2.142
+++ drbd_int.h	6 Apr 2004 14:07:00 -0000	1.58.2.143
@@ -620,7 +620,7 @@
 	struct drbd_socket data; // for data/barrier/cstate/parameter packets
 	struct drbd_socket meta; // for ping/ack (metadata) packets
 	volatile unsigned long last_received; // in jiffies, either socket
-	struct drbd_work  resync_work;
+	struct drbd_work  resync_work,barrier_work;
 	struct timer_list resync_timer;
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
 	kdev_t backing_bdev;  // backing device
@@ -842,6 +842,7 @@
 extern int w_resync_inactive     (drbd_dev *, struct drbd_work *, int);
 extern int w_resume_next_sg      (drbd_dev *, struct drbd_work *, int);
 extern int w_io_error            (drbd_dev *, struct drbd_work *, int);
+extern int w_try_send_barrier    (drbd_dev *, struct drbd_work *, int);
 
 // drbd_receiver.c
 extern int drbd_release_ee(drbd_dev* mdev,struct list_head* list);
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_main.c,v
retrieving revision 1.73.2.148
retrieving revision 1.73.2.149
diff -u -3 -r1.73.2.148 -r1.73.2.149
--- drbd_main.c	30 Mar 2004 11:46:51 -0000	1.73.2.148
+++ drbd_main.c	6 Apr 2004 14:07:00 -0000	1.73.2.149
@@ -939,6 +939,12 @@
 				break;
 		}
 		D_ASSERT(rv != 0);
+		if (rv == -EINTR ) {
+			ERR("Got a signal in drbd_send()!\n");
+			dump_stack();
+			drbd_flush_signals(current);
+			rv = 0;
+		}
 		if (rv < 0) break;
 		sent += rv;
 		iov.iov_base += rv;
@@ -1115,7 +1121,9 @@
 	INIT_LIST_HEAD(&mdev->data.work.q);
 	INIT_LIST_HEAD(&mdev->meta.work.q);
 	INIT_LIST_HEAD(&mdev->resync_work.list);
+	INIT_LIST_HEAD(&mdev->barrier_work.list);
 	mdev->resync_work.cb = w_resync_inactive;
+	mdev->barrier_work.cb = w_try_send_barrier;
 	init_timer(&mdev->resync_timer);
 
 	init_waitqueue_head(&mdev->cstate_wait);
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_receiver.c,v
retrieving revision 1.97.2.127
retrieving revision 1.97.2.128
diff -u -3 -r1.97.2.127 -r1.97.2.128
--- drbd_receiver.c	6 Apr 2004 12:05:32 -0000	1.97.2.127
+++ drbd_receiver.c	6 Apr 2004 14:07:00 -0000	1.97.2.128
@@ -1513,18 +1513,6 @@
 
 /* ********* acknowledge sender ******** */
 
-STATIC int drbd_try_send_barrier(drbd_dev *mdev)
-{
-	int rv=TRUE;
-	if(down_trylock(&mdev->data.mutex)==0) {
-		if(test_and_clear_bit(ISSUE_BARRIER,&mdev->flags)) {
-			if(! _drbd_send_barrier(mdev)) rv=FALSE;
-		}
-		up(&mdev->data.mutex);
-	}
-	return rv;
-}
-
 STATIC int got_Ping(drbd_dev *mdev, Drbd_Header* h)
 {
 	return drbd_send_ping_ack(mdev);
@@ -1687,10 +1675,6 @@
 			// since sendmsg waited the other half already
 			mdev->meta.socket->sk->SK_(rcvtimeo) =
 				mdev->conf.timeout*HZ/20;
-		}
-
-		if (mdev->state == Primary) {
-			if(!drbd_try_send_barrier(mdev)) goto err;
 		}
 
 		if (!drbd_process_ee(mdev,&mdev->done_ee)) goto err;
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_req-2.4.c,v
retrieving revision 1.33.2.62
retrieving revision 1.33.2.63
diff -u -3 -r1.33.2.62 -r1.33.2.63
--- drbd_req-2.4.c	24 Mar 2004 13:14:06 -0000	1.33.2.62
+++ drbd_req-2.4.c	6 Apr 2004 14:07:00 -0000	1.33.2.63
@@ -110,8 +110,13 @@
 	mempool_free(req,drbd_request_mempool);
 
  out:
-	if (test_bit(ISSUE_BARRIER,&mdev->flags))
-		wake_asender(mdev);
+	if (test_bit(ISSUE_BARRIER,&mdev->flags)) {
+		spin_lock_irqsave(&mdev->req_lock,flags);
+		if(list_empty(&mdev->barrier_work.list)) {
+			_drbd_queue_work(&mdev->data.work,&mdev->barrier_work);
+		}
+		spin_unlock_irqrestore(&mdev->req_lock,flags);
+	}
 }
 
 int drbd_read_remote(drbd_dev *mdev, drbd_request_t *req)