[DRBD-cvs] drbd by phil; * Added missing inc_local() / dec_local(...
drbd-user@lists.linbit.com
drbd-user@lists.linbit.com
Wed, 18 Feb 2004 13:21:23 +0100 (CET)
DRBD CVS committal
Author : phil
Module : drbd
Dir : drbd/drbd
Modified Files:
Tag: rel-0_7-branch
drbd_actlog.c drbd_dsender.c drbd_int.h drbd_main.c
drbd_req-2.4.c
Log Message:
* Added missing inc_local() / dec_local() in drbd_al_to_on_disk_bm()
* fixed bio_endio() in drbd_read_bi_end_io()
* added missing dec_locl()
[ Basically debugged LGE's last patch. Now everything works (at least
on Linux-2.6.x) ]
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_actlog.c,v
retrieving revision 1.1.2.71
retrieving revision 1.1.2.72
diff -u -3 -r1.1.2.71 -r1.1.2.72
--- drbd_actlog.c 15 Feb 2004 14:40:10 -0000 1.1.2.71
+++ drbd_actlog.c 18 Feb 2004 12:21:17 -0000 1.1.2.72
@@ -382,6 +382,10 @@
wait_event(mdev->al_wait, lc_try_lock(mdev->act_log));
+ i=inc_local_md_only(mdev);
+ D_ASSERT( i ); // Assertions should not have side effects.
+ // I do not want to have D_ASSERT( inc_local_md_only(mdev) );
+
for(i=0;i<mdev->act_log->nr_elements;i++) {
enr = lc_entry(mdev->act_log,i)->lc_number;
if(enr == LC_FREE) continue;
@@ -390,6 +394,7 @@
lc_unlock(mdev->act_log);
wake_up(&mdev->al_wait);
+ dec_local(mdev);
}
/**
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_dsender.c,v
retrieving revision 1.1.2.76
retrieving revision 1.1.2.77
diff -u -3 -r1.1.2.76 -r1.1.2.77
--- drbd_dsender.c 16 Feb 2004 20:39:00 -0000 1.1.2.76
+++ drbd_dsender.c 18 Feb 2004 12:21:17 -0000 1.1.2.77
@@ -175,7 +175,7 @@
req->w.cb = w_read_retry_remote;
drbd_queue_work(mdev,&mdev->data.work,&req->w);
} else {
- bh->b_end_io(bh,uptodate);
+ bh->b_end_io(req->master_bio,uptodate);
INVALIDATE_MAGIC(req);
mempool_free(req,drbd_request_mempool);
@@ -329,11 +329,13 @@
req->w.cb = w_read_retry_remote;
drbd_queue_work(mdev,&mdev->data.work,&req->w);
} else {
- bio_endio(bio,bio->bi_size,error);
+ bio_endio(req->master_bio,req->master_bio->bi_size,error);
INVALIDATE_MAGIC(req);
mempool_free(req,drbd_request_mempool);
}
+
+ dec_local(mdev);
return 0;
}
#endif
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_int.h,v
retrieving revision 1.58.2.127
retrieving revision 1.58.2.128
diff -u -3 -r1.58.2.127 -r1.58.2.128
--- drbd_int.h 17 Feb 2004 09:10:35 -0000 1.58.2.127
+++ drbd_int.h 18 Feb 2004 12:21:17 -0000 1.58.2.128
@@ -235,6 +235,7 @@
#define RQ_DRBD_SENT 0x0010
#define RQ_DRBD_LOCAL 0x0020
#define RQ_DRBD_DONE 0x0030
+#define RQ_DRBD_IN_TL 0x0040
enum MetaDataFlags {
MDF_Consistent = 1,
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_main.c,v
retrieving revision 1.73.2.131
retrieving revision 1.73.2.132
diff -u -3 -r1.73.2.131 -r1.73.2.132
--- drbd_main.c 17 Feb 2004 09:10:35 -0000 1.73.2.131
+++ drbd_main.c 18 Feb 2004 12:21:18 -0000 1.73.2.132
@@ -811,6 +811,7 @@
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);
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_req-2.4.c,v
retrieving revision 1.33.2.55
retrieving revision 1.33.2.56
diff -u -3 -r1.33.2.55 -r1.33.2.56
--- drbd_req-2.4.c 16 Feb 2004 20:39:00 -0000 1.33.2.55
+++ drbd_req-2.4.c 18 Feb 2004 12:21:18 -0000 1.33.2.56
@@ -69,13 +69,16 @@
end_it:
spin_unlock_irqrestore(&mdev->req_lock,flags);
- if( ! ( er_flags & ERF_NOTLD ) ) {
- /*If this call is from tl_clear() we may not call tl_dependene,
- otherwhise we have a homegrown spinlock deadlock. */
- if(tl_dependence(mdev,req))
- set_bit(ISSUE_BARRIER,&mdev->flags);
- } else {
- list_del(&req->w.list); // we have the tl_lock...
+ if( req->rq_status & RQ_DRBD_IN_TL ) {
+ if( ! ( er_flags & ERF_NOTLD ) ) {
+ /*If this call is from tl_clear() we may not call
+ tl_dependene, otherwhise we have a homegrown
+ spinlock deadlock. */
+ if(tl_dependence(mdev,req))
+ set_bit(ISSUE_BARRIER,&mdev->flags);
+ } else {
+ list_del(&req->w.list); // we have the tl_lock...
+ }
}
if(mdev->conf.wire_protocol==DRBD_PROT_C && mdev->cstate > Connected) {