[DRBD-cvs] drbd by phil; * It could happen that we lost one of ou...
drbd-user@lists.linbit.com
drbd-user@lists.linbit.com
Fri, 7 May 2004 17:18:34 +0200 (CEST)
DRBD CVS committal
Author : phil
Module : drbd
Dir : drbd/drbd
Modified Files:
Tag: rel-0_7-branch
drbd_fs.c drbd_main.c drbd_receiver.c drbd_req-2.4.c
Log Message:
* It could happen that we lost one of our requests in the process of
a disconnect. -- Fixed that. -> look at tl_cancel()
* In drbd_disconnect() we wait until everyone who sleeps in drbd_send_dblock()
has actually exited.
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_fs.c,v
retrieving revision 1.28.2.85
retrieving revision 1.28.2.86
diff -u -3 -r1.28.2.85 -r1.28.2.86
--- drbd_fs.c 5 May 2004 13:25:15 -0000 1.28.2.85
+++ drbd_fs.c 7 May 2004 15:18:28 -0000 1.28.2.86
@@ -570,6 +570,12 @@
return -EINTR;
}
+ /* FIXME RACE here: if our direct user is not using bd_claim (i.e.
+ * not a filesystem) since cstate might still be >= Connected, new
+ * ap requests may come in and increase ap_pending_cnt again!
+ * but that means someone is misusing DRBD...
+ * */
+
mdev->state = (Drbd_State) newstate & 0x03;
if(newstate & Primary) {
NOT_IN_26( set_device_ro(MKDEV(MAJOR_NR, minor), FALSE ); )
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_main.c,v
retrieving revision 1.73.2.166
retrieving revision 1.73.2.167
diff -u -3 -r1.73.2.166 -r1.73.2.167
--- drbd_main.c 7 May 2004 13:14:34 -0000 1.73.2.166
+++ drbd_main.c 7 May 2004 15:18:28 -0000 1.73.2.167
@@ -210,8 +210,13 @@
b->n_req--;
list_del(&item->w.list);
+ item->rq_status &= ~RQ_DRBD_IN_TL;
spin_unlock_irq(&mdev->tl_lock);
+ drbd_end_req(item,RQ_DRBD_SENT,ERF_NOTLD|1, drbd_req_get_sector(item));
+ drbd_set_out_of_sync(mdev,
+ drbd_req_get_sector(item),
+ drbd_req_get_size(item));
}
STATIC unsigned int tl_add_barrier(drbd_dev *mdev)
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_receiver.c,v
retrieving revision 1.97.2.149
retrieving revision 1.97.2.150
diff -u -3 -r1.97.2.149 -r1.97.2.150
--- drbd_receiver.c 7 May 2004 09:32:44 -0000 1.97.2.149
+++ drbd_receiver.c 7 May 2004 15:18:28 -0000 1.97.2.150
@@ -1484,16 +1484,20 @@
drbd_free_sock(mdev);
up(&mdev->data.mutex);
- drbd_thread_stop(&mdev->worker);
-
drbd_fail_pending_reads(mdev);
+ drbd_thread_stop(&mdev->worker);
drbd_rs_cancel_all(mdev);
- tl_clear(mdev);
- clear_bit(ISSUE_BARRIER,&mdev->flags);
+ // secondary
drbd_wait_ee(mdev,&mdev->active_ee);
drbd_wait_ee(mdev,&mdev->sync_ee);
drbd_clear_done_ee(mdev);
+
+ // primary
+ tl_clear(mdev);
+ clear_bit(ISSUE_BARRIER,&mdev->flags);
+ wait_event( mdev->cstate_wait, atomic_read(&mdev->ap_pending_cnt) == 0 );
+ D_ASSERT(mdev->oldest_barrier->n_req == 0);
D_ASSERT(mdev->ee_in_use == 0);
D_ASSERT(list_empty(&mdev->read_ee)); // done by termination of worker
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_req-2.4.c,v
retrieving revision 1.33.2.73
retrieving revision 1.33.2.74
diff -u -3 -r1.33.2.73 -r1.33.2.74
--- drbd_req-2.4.c 7 May 2004 13:14:34 -0000 1.33.2.73
+++ drbd_req-2.4.c 7 May 2004 15:18:28 -0000 1.33.2.74
@@ -122,7 +122,6 @@
spin_lock(&mdev->pr_lock);
list_add(&req->w.list,&mdev->app_reads);
spin_unlock(&mdev->pr_lock);
- inc_ap_pending(mdev);
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
rv=drbd_send_drequest(mdev, DataRequest, bio->b_rsector, bio->b_size,
(unsigned long)req);
@@ -278,21 +277,15 @@
* or READ, and no local disk,
* or READ, but not in sync.
*/
+ inc_ap_pending(mdev);
if (rw == WRITE) {
- /* Syncronization with the syncer is done
- * via drbd_[rs|al]_[begin|end]_io()
- */
- if(mdev->conf.wire_protocol != DRBD_PROT_A) {
- inc_ap_pending(mdev);
- }
-
if (!drbd_send_dblock(mdev,req)) {
if (mdev->cstate >= Connected)
set_cstate(mdev,NetworkFailure);
drbd_thread_restart_nowait(&mdev->receiver);
- if(mdev->conf.wire_protocol != DRBD_PROT_A) {
- dec_ap_pending(mdev,HERE);
- }
+ dec_ap_pending(mdev,HERE);
+ } else if(mdev->conf.wire_protocol == DRBD_PROT_A) {
+ dec_ap_pending(mdev,HERE);
}
} else if (target_area_out_of_sync) {
drbd_read_remote(mdev,req);