[DRBD-cvs] r1762 - in trunk: . drbd
svn at svn.drbd.org
svn at svn.drbd.org
Mon Feb 14 21:08:47 CET 2005
Author: phil
Date: 2005-02-14 21:08:40 +0100 (Mon, 14 Feb 2005)
New Revision: 1762
Modified:
trunk/ROADMAP
trunk/drbd/drbd_main.c
trunk/drbd/drbd_receiver.c
Log:
Well, it seems that all code pathes of the item 9 code,
work fine. I need to check our OCFS2...
Modified: trunk/ROADMAP
===================================================================
--- trunk/ROADMAP 2005-02-14 16:01:02 UTC (rev 1761)
+++ trunk/ROADMAP 2005-02-14 20:08:40 UTC (rev 1762)
@@ -86,7 +86,9 @@
Note: The actual key to the hash should be (sector & ~0x7).
See item 9 for more details.
- 99% DONE
+ 80% DONE ; There are more places where we case an block_id
+ to an req pointer, need to make sure that we
+ cover all of these places.
7 Handle split brain situations; Support IO fencing;
@@ -321,8 +323,7 @@
to find IO operations starting in the same 4k block of
data quickly. -> With two lookups the hash table we can
find any concurrent access.
- 70% DONE ; Implement discard info packets. Code an equivalent
- hash table for EEs, to solve example case 5.
+ 99% DONE
10 Change Sync-groups to sync-after
Modified: trunk/drbd/drbd_main.c
===================================================================
--- trunk/drbd/drbd_main.c 2005-02-14 16:01:02 UTC (rev 1761)
+++ trunk/drbd/drbd_main.c 2005-02-14 20:08:40 UTC (rev 1762)
@@ -1343,10 +1343,6 @@
atomic_add_return(1,&mdev->packet_seq) );
dump_packet(mdev,mdev->data.socket,0,(void*)&p, __FILE__, __LINE__);
- // Instrumentation
- set_current_state(TASK_INTERRUPTIBLE);
- schedule_timeout(HZ);
-
set_bit(UNPLUG_REMOTE,&mdev->flags);
ok = sizeof(p) == drbd_send(mdev,mdev->data.socket,&p,sizeof(p),MSG_MORE);
if(ok) {
@@ -1389,7 +1385,7 @@
p.sector = cpu_to_be64(drbd_ee_get_sector(e));
p.block_id = e->block_id;
- p.seq_num = cpu_to_be32(atomic_add_return(1,&mdev->packet_seq));
+ /* p.seq_num = 0; No sequence numbers here.. */
/* Only called by our kernel thread.
* This one may be interupted by DRBD_SIG and/or DRBD_SIGKILL
Modified: trunk/drbd/drbd_receiver.c
===================================================================
--- trunk/drbd/drbd_receiver.c 2005-02-14 16:01:02 UTC (rev 1761)
+++ trunk/drbd/drbd_receiver.c 2005-02-14 20:08:40 UTC (rev 1762)
@@ -1044,7 +1044,7 @@
struct Tl_epoch_entry *e;
drbd_request_t * req;
Drbd_Data_Packet *p = (Drbd_Data_Packet*)h;
- int header_size, data_size, packet_seq, discard;
+ int header_size, data_size, packet_seq, discard, rv;
// FIXME merge this code dups into some helper function
header_size = sizeof(*p) - sizeof(*h);
@@ -1068,10 +1068,8 @@
if (DRBD_ratelimit(5*HZ,5))
ERR("Can not write mirrored data block to local disk.\n");
drbd_send_ack(mdev,NegAck,e);
- spin_lock_irq(&mdev->ee_lock);
- drbd_put_ee(mdev,e);
- spin_unlock_irq(&mdev->ee_lock);
- return TRUE;
+ rv = TRUE;
+ goto out1;
}
e->block_id = p->block_id; // no meaning on this side, e* on partner
@@ -1085,13 +1083,15 @@
*/
if (mdev->conf.two_primaries) {
packet_seq = be32_to_cpu(p->seq_num);
- if( packet_seq > peer_seq(mdev)+1 ) {
+ /* if( packet_seq > peer_seq(mdev)+1 ) {
WARN(" will wait till (packet_seq) %d <= %d\n",
packet_seq,peer_seq(mdev)+1);
- }
+ } */
if( wait_event_interruptible(mdev->cstate_wait,
- packet_seq <= peer_seq(mdev)+1) )
- return FALSE;
+ packet_seq <= peer_seq(mdev)+1)) {
+ rv = FALSE;
+ goto out2;
+ }
spin_lock(&mdev->peer_seq_lock);
mdev->peer_seq = max(mdev->peer_seq, packet_seq);
@@ -1100,14 +1100,10 @@
spin_unlock(&mdev->peer_seq_lock);
if(discard) {
- spin_lock_irq(&mdev->ee_lock);
- drbd_put_ee(mdev,e);
- spin_unlock_irq(&mdev->ee_lock);
- atomic_inc(&mdev->epoch_size);
- dec_local(mdev);
WARN("Concurrent write! [DISCARD BY LIST] sec=%lu\n",
(unsigned long)sector);
- return TRUE;
+ rv = TRUE;
+ goto out2;
}
req = req_have_write(mdev, e);
@@ -1120,34 +1116,27 @@
"sec=%lu\n",(unsigned long)sector);
if( wait_event_interruptible(mdev->cstate_wait,
!req_have_write(mdev,e))) {
- spin_lock_irq(&mdev->ee_lock);
- drbd_put_ee(mdev,e);
- spin_unlock_irq(&mdev->ee_lock);
- return FALSE;
+ rv = FALSE;
+ goto out2;
}
} else {
/* Conflicting write, no ACK by now*/
if (test_bit(UNIQUE,&mdev->flags)) {
- spin_lock_irq(&mdev->ee_lock);
- drbd_put_ee(mdev,e);
- spin_unlock_irq(&mdev->ee_lock);
- atomic_inc(&mdev->epoch_size);
- dec_local(mdev);
WARN("Concurrent write! [DISCARD BY FLAG] sec=%lu\n",
(unsigned long)sector);
- return TRUE;
+ rv = TRUE;
+ goto out2;
} else {
/* write afterwards do not exp ACK */
WARN("Concurrent write! [W AFTERWARDS2] sec=%lu\n",
(unsigned long)sector);
drbd_send_discard(mdev,req);
drbd_end_req(req, RQ_DRBD_SENT, 1, sector);
+ dec_ap_pending(mdev);
if( wait_event_interruptible(mdev->cstate_wait,
!req_have_write(mdev,e))) {
- spin_lock_irq(&mdev->ee_lock);
- drbd_put_ee(mdev,e);
- spin_unlock_irq(&mdev->ee_lock);
- return FALSE;
+ rv = FALSE;
+ goto out2;
}
}
}
@@ -1170,14 +1159,19 @@
break;
}
- // Instrumentation
- set_current_state(TASK_INTERRUPTIBLE);
- schedule_timeout(HZ);
-
drbd_generic_make_request(WRITE,&e->private_bio);
receive_data_tail(mdev,data_size);
return TRUE;
+
+ out2:
+ atomic_inc(&mdev->epoch_size);
+ dec_local(mdev);
+ out1:
+ spin_lock_irq(&mdev->ee_lock);
+ drbd_put_ee(mdev,e);
+ spin_unlock_irq(&mdev->ee_lock);
+ return rv;
}
STATIC int receive_DataRequest(drbd_dev *mdev,Drbd_Header *h)
@@ -2191,7 +2185,7 @@
drbd_set_in_sync(mdev,sector,blksize);
__set_bit(SYNC_STARTED,&mdev->flags);
} else {
- req=(drbd_request_t*)(long)p->block_id;
+ req=(drbd_request_t*)(unsigned long)p->block_id;
if (unlikely(!tl_verify(mdev,req,sector))) {
ERR("Got a corrupt block_id/sector pair.\n");
@@ -2239,7 +2233,7 @@
drbd_request_t *req;
Drbd_BlockAck_Packet *p = (Drbd_BlockAck_Packet*)h;
- req = (drbd_request_t *)(long)p->block_id;
+ req = (drbd_request_t *)(unsigned long)p->block_id;
D_ASSERT(req->w.cb == w_is_app_read);
spin_lock(&mdev->pr_lock);
@@ -2299,7 +2293,7 @@
return FALSE;
}
- dn->block_id = (long)p->block_id;
+ dn->block_id = p->block_id;
dn->seq_num = be32_to_cpu(p->seq_num);
spin_lock(&mdev->peer_seq_lock);
More information about the drbd-cvs
mailing list