[DRBD-cvs] drbd by phil; Preparing everything for the device_mute...
drbd-user@lists.linbit.com
drbd-user@lists.linbit.com
Fri, 7 May 2004 15:14:39 +0200 (CEST)
DRBD CVS committal
Author : phil
Module : drbd
Dir : drbd/drbd
Modified Files:
Tag: rel-0_7-branch
drbd_main.c drbd_req-2.4.c
Log Message:
Preparing everything for the device_mutex change...
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_main.c,v
retrieving revision 1.73.2.165
retrieving revision 1.73.2.166
diff -u -3 -r1.73.2.165 -r1.73.2.166
--- drbd_main.c 7 May 2004 09:32:44 -0000 1.73.2.165
+++ drbd_main.c 7 May 2004 13:14:34 -0000 1.73.2.166
@@ -200,6 +200,20 @@
spin_unlock_irq(&mdev->tl_lock);
}
+STATIC void tl_cancel(drbd_dev *mdev, drbd_request_t * item)
+{
+ struct drbd_barrier *b;
+
+ spin_lock_irq(&mdev->tl_lock);
+
+ b=item->barrier;
+ b->n_req--;
+
+ list_del(&item->w.list);
+
+ spin_unlock_irq(&mdev->tl_lock);
+}
+
STATIC unsigned int tl_add_barrier(drbd_dev *mdev)
{
unsigned int bnr;
@@ -824,7 +838,7 @@
// Used to send write requests: bh->b_rsector !!
int drbd_send_dblock(drbd_dev *mdev, drbd_request_t *req)
{
- int ok;
+ int ok=1;
sigset_t old_blocked;
Drbd_Data_Packet p;
@@ -869,16 +883,22 @@
spin_unlock(&mdev->send_task_lock);
if(test_and_clear_bit(ISSUE_BARRIER,&mdev->flags))
- _drbd_send_barrier(mdev);
- tl_add(mdev,req);
- req->rq_status |= RQ_DRBD_IN_TL;
-
- ok = (drbd_send(mdev,mdev->data.socket,&p,sizeof(p),MSG_MORE) == sizeof(p))
- && _drbd_send_zc_bio(mdev,&req->private_bio);
+ ok = _drbd_send_barrier(mdev);
+ if(ok) {
+ tl_add(mdev,req);
+ req->rq_status |= RQ_DRBD_IN_TL;
+
+ ok = (drbd_send(mdev,mdev->data.socket,&p,sizeof(p),MSG_MORE) == sizeof(p));
+ if(ok) {
+ ok = _drbd_send_zc_bio(mdev,&req->private_bio);
+ }
+ if(!ok) tl_cancel(mdev,req);
+ }
spin_lock(&mdev->send_task_lock);
mdev->send_task=NULL;
spin_unlock(&mdev->send_task_lock);
+
up(&mdev->data.mutex);
restore_old_sigset(old_blocked);
return ok;
@@ -1373,22 +1393,21 @@
if (mdev->mbds_id) bm_cleanup(mdev->mbds_id);
if (mdev->resync) lc_free(mdev->resync);
+ D_ASSERT(mdev->ee_in_use==0);
drbd_release_ee(mdev,&mdev->free_ee);
rr = drbd_release_ee(mdev,&mdev->active_ee);
- if(rr) printk(KERN_ERR DEVICE_NAME
- "%d: %d EEs in active list found!\n",i,rr);
+ if(rr) ERR("%d: %d EEs in active list found!\n",i,rr);
rr = drbd_release_ee(mdev,&mdev->sync_ee);
- if(rr) printk(KERN_ERR DEVICE_NAME
- "%d: %d EEs in sync list found!\n",i,rr);
+ if(rr) ERR("%d: %d EEs in sync list found!\n",i,rr);
rr = drbd_release_ee(mdev,&mdev->done_ee);
- if(rr) printk(KERN_ERR DEVICE_NAME
- "%d: %d EEs in done list found!\n",i,rr);
+ if(rr) ERR("%d: %d EEs in done list found!\n",i,rr);
rr = drbd_release_ee(mdev,&mdev->read_ee);
- if(rr) printk(KERN_ERR DEVICE_NAME
- "%d: %d EEs in read list found!\n",i,rr);
+ if(rr) ERR("%d: %d EEs in read list found!\n",i,rr);
+
+ D_ASSERT(mdev->ee_vacant==0);
if (mdev->md_io_page)
__free_page(mdev->md_io_page);
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_req-2.4.c,v
retrieving revision 1.33.2.72
retrieving revision 1.33.2.73
diff -u -3 -r1.33.2.72 -r1.33.2.73
--- drbd_req-2.4.c 7 May 2004 10:13:39 -0000 1.33.2.72
+++ drbd_req-2.4.c 7 May 2004 13:14:34 -0000 1.33.2.73
@@ -248,6 +248,10 @@
} else {
remote = 1;
}
+
+ if (rw == WRITE && local)
+ drbd_al_begin_io(mdev, sector);
+
remote = remote && (mdev->cstate >= Connected)
&& !test_bit(PARTNER_DISKLESS,&mdev->flags);
@@ -266,21 +270,8 @@
if (!remote)
req->rq_status |= RQ_DRBD_SENT;
- /* THINK
- * maybe we need to
- * if (rw == WRITE) drbd_al_begin_io(mdev, sector);
- * right here already?
- */
-
/* we need to plug ALWAYS since we possibly need to kick lo_dev */
drbd_plug_device(mdev);
- if (rw == WRITE && local)
- drbd_al_begin_io(mdev, sector);
-
- /* since we possibly waited, we have a race: mdev may have
- * changed underneath us. Thats why I want to have a read lock
- * on it, and every state change of mdev needs to be done with a
- * write lock on it! */
if (remote) {
/* either WRITE and Connected,
@@ -294,10 +285,7 @@
if(mdev->conf.wire_protocol != DRBD_PROT_A) {
inc_ap_pending(mdev);
}
- /* THINK drbd_send_dblock has a return value,
- * but we ignore it here. Is it actually void,
- * because error handling takes place elsewhere?
- */
+
if (!drbd_send_dblock(mdev,req)) {
if (mdev->cstate >= Connected)
set_cstate(mdev,NetworkFailure);