[DRBD-cvs] r1757 - trunk/drbd
svn at svn.drbd.org
svn at svn.drbd.org
Fri Feb 11 16:59:11 CET 2005
Author: phil
Date: 2005-02-11 16:59:06 +0100 (Fri, 11 Feb 2005)
New Revision: 1757
Modified:
trunk/drbd/drbd_fs.c
trunk/drbd/drbd_main.c
trunk/drbd/drbd_receiver.c
trunk/drbd/drbd_req.c
trunk/drbd/drbd_worker.c
Log:
Slowly bringing the work on item 9 [two primaries] into
shape...
Modified: trunk/drbd/drbd_fs.c
===================================================================
--- trunk/drbd/drbd_fs.c 2005-02-06 08:52:22 UTC (rev 1756)
+++ trunk/drbd/drbd_fs.c 2005-02-11 15:59:06 UTC (rev 1757)
@@ -577,7 +577,8 @@
}
}
- if (mdev->ee_hash_s != new_conf.max_buffers/8 ) {
+ if (mdev->conf.two_primaries &&
+ ( mdev->ee_hash_s != new_conf.max_buffers/8 ) ) {
new_ee_hash = kmalloc(mdev->ee_hash_s * sizeof(void*),
GFP_KERNEL);
if(!new_ee_hash) {
Modified: trunk/drbd/drbd_main.c
===================================================================
--- trunk/drbd/drbd_main.c 2005-02-06 08:52:22 UTC (rev 1756)
+++ trunk/drbd/drbd_main.c 2005-02-11 15:59:06 UTC (rev 1757)
@@ -168,12 +168,10 @@
}
-STATIC void tl_add(drbd_dev *mdev, drbd_request_t * new_item)
+STATIC void _tl_add(drbd_dev *mdev, drbd_request_t * new_item)
{
struct drbd_barrier *b;
- spin_lock_irq(&mdev->tl_lock);
-
b=mdev->newest_barrier;
new_item->barrier = b;
@@ -187,7 +185,12 @@
INIT_HLIST_NODE(&new_item->colision);
hlist_add_head( &new_item->colision, mdev->tl_hash +
tl_hash_fn(mdev, drbd_req_get_sector(new_item) ));
+}
+STATIC void tl_add(drbd_dev *mdev, drbd_request_t * new_item)
+{
+ spin_lock_irq(&mdev->tl_lock);
+ _tl_add(mdev,new_item);
spin_unlock_irq(&mdev->tl_lock);
}
@@ -422,10 +425,39 @@
return rv;
}
-int ee_have_write(drbd_dev *mdev, drbd_request_t * req)
+STATIC int ee_have_write(drbd_dev *mdev, drbd_request_t * req)
{
- // PRE TODO: same as above for a request agains our acive EEs.
- return 0;
+ struct hlist_head *slot;
+ struct hlist_node *n;
+ struct Tl_epoch_entry *ee;
+ sector_t sector = drbd_req_get_sector(req);
+ int size = drbd_req_get_size(req);
+ int i, rv=0;
+
+ D_ASSERT(size <= 1<<(HT_SHIFT+9) );
+
+ spin_lock_irq(&mdev->tl_lock);
+
+ for(i=-1;i<=1;i++ ) {
+ slot = mdev->tl_hash + ee_hash_fn(mdev,
+ sector + i*(1<<(HT_SHIFT)));
+ hlist_for_each_entry(ee, n, slot, colision) {
+ if( overlaps(drbd_ee_get_sector(ee),
+ drbd_ee_get_size(ee),
+ sector,
+ size) ) {
+ rv=1;
+ goto out;
+ } //overlaps()
+ } // hlist_for_each_entry()
+ }
+
+ // Good, no conflict found
+ _tl_add(mdev,req);
+ out:
+ spin_unlock_irq(&mdev->tl_lock);
+
+ return rv;
}
/**
@@ -1308,7 +1340,11 @@
if(test_and_clear_bit(ISSUE_BARRIER,&mdev->flags))
ok = _drbd_send_barrier(mdev);
if(ok) {
- tl_add(mdev,req);
+ if (mdev->conf.two_primaries) {
+ if(ee_have_write(mdev,req)) return -1;
+ } else {
+ tl_add(mdev,req);
+ }
dump_packet(mdev,mdev->data.socket,0,(void*)&p, __FILE__, __LINE__);
set_bit(UNPLUG_REMOTE,&mdev->flags);
ok = sizeof(p) == drbd_send(mdev,mdev->data.socket,&p,sizeof(p),MSG_MORE);
Modified: trunk/drbd/drbd_receiver.c
===================================================================
--- trunk/drbd/drbd_receiver.c 2005-02-06 08:52:22 UTC (rev 1756)
+++ trunk/drbd/drbd_receiver.c 2005-02-11 15:59:06 UTC (rev 1757)
@@ -1036,7 +1036,7 @@
sector_t sector;
struct Tl_epoch_entry *e;
Drbd_Data_Packet *p = (Drbd_Data_Packet*)h;
- int header_size,data_size, packet_seq,discard;
+ int header_size,data_size, packet_seq,discard=0;
// FIXME merge this code dups into some helper function
header_size = sizeof(*p) - sizeof(*h);
@@ -1057,16 +1057,18 @@
traveling on msock
PRE TODO: Wrap around of seq_num !!!
*/
- packet_seq = be32_to_cpu(p->seq_num);
- if( wait_event_interruptible(mdev->cstate_wait,
- packet_seq <= peer_seq(mdev)+1) )
- return FALSE;
+ if (mdev->conf.two_primaries) {
+ packet_seq = be32_to_cpu(p->seq_num);
+ if( wait_event_interruptible(mdev->cstate_wait,
+ packet_seq <= peer_seq(mdev)+1) )
+ return FALSE;
- spin_lock(&mdev->peer_seq_lock);
- mdev->peer_seq = max(mdev->peer_seq, packet_seq);
- /* is update_peer_seq(mdev,packet_seq); */
- discard = drbd_chk_discard(mdev,p->block_id,packet_seq);
- spin_unlock(&mdev->peer_seq_lock);
+ spin_lock(&mdev->peer_seq_lock);
+ mdev->peer_seq = max(mdev->peer_seq, packet_seq);
+ /* is update_peer_seq(mdev,packet_seq); */
+ discard = drbd_chk_discard(mdev,p->block_id,packet_seq);
+ spin_unlock(&mdev->peer_seq_lock);
+ }
sector = be64_to_cpu(p->sector);
e = read_in_block(mdev,data_size);
Modified: trunk/drbd/drbd_req.c
===================================================================
--- trunk/drbd/drbd_req.c 2005-02-06 08:52:22 UTC (rev 1756)
+++ trunk/drbd/drbd_req.c 2005-02-11 15:59:06 UTC (rev 1757)
@@ -307,6 +307,25 @@
*/
inc_ap_pending(mdev);
if (rw == WRITE) {
+ switch(drbd_send_dblock(mdev,req)) {
+ case 0: /* sending failed */
+ if (mdev->state.s.conn >= Connected)
+ drbd_force_state(mdev,NS(conn,NetworkFailure));
+ dec_ap_pending(mdev);
+ drbd_thread_restart_nowait(&mdev->receiver);
+ break;
+ case -1: /* concurrent write */
+ WARN("Concurrent write! [DISCARD L] sec=%lu\n",
+ (unsigned long)sector);
+ local=0;
+ drbd_end_req(req, RQ_DRBD_DONE, 1, sector);
+ break;
+ default: /* block was sent */
+ if(mdev->conf.wire_protocol == DRBD_PROT_A) {
+ dec_ap_pending(mdev);
+ drbd_end_req(req, RQ_DRBD_SENT, 1, sector);
+ }
+ }
if (!drbd_send_dblock(mdev,req)) {
if (mdev->state.s.conn >= Connected)
drbd_force_state(mdev,NS(conn,NetworkFailure));
Modified: trunk/drbd/drbd_worker.c
===================================================================
--- trunk/drbd/drbd_worker.c 2005-02-06 08:52:22 UTC (rev 1756)
+++ trunk/drbd/drbd_worker.c 2005-02-11 15:59:06 UTC (rev 1757)
@@ -125,6 +125,12 @@
spin_unlock_irqrestore(&mdev->ee_lock,flags);
+ if( !hlist_unhashed(&e->colision) ) {
+ spin_lock_irqsave(&mdev->tl_lock,flags);
+ hlist_del_init(&e->colision);
+ spin_unlock_irqrestore(&mdev->tl_lock,flags);
+ }
+
drbd_chk_io_error(mdev,error);
wake_asender(mdev);
dec_local(mdev);
More information about the drbd-cvs
mailing list