[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)