[DRBD-cvs] drbd by phil; Various micro fixes by LGE

drbd-user@lists.linbit.com drbd-user@lists.linbit.com
Wed, 12 May 2004 12:00:52 +0200 (CEST)


DRBD CVS committal

Author  : phil
Module  : drbd

Dir     : drbd/drbd


Modified Files:
      Tag: rel-0_7-branch
	drbd_compat_wrappers.h drbd_dsender.c drbd_int.h drbd_main.c 
	drbd_receiver.c drbd_req-2.4.c 


Log Message:
Various micro fixes by LGE

===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_compat_wrappers.h,v
retrieving revision 1.1.2.40
retrieving revision 1.1.2.41
diff -u -3 -r1.1.2.40 -r1.1.2.41
--- drbd_compat_wrappers.h	30 Apr 2004 09:46:57 -0000	1.1.2.40
+++ drbd_compat_wrappers.h	12 May 2004 10:00:47 -0000	1.1.2.41
@@ -341,6 +341,8 @@
 
 static inline unsigned short drbd_req_get_size(struct drbd_request *req)
 {
+	drbd_dev* mdev = req->private_bio.bi_private;
+	D_ASSERT(req->master_bio->bi_size);
 	return req->master_bio->bi_size;
 }
 
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_dsender.c,v
retrieving revision 1.1.2.106
retrieving revision 1.1.2.107
diff -u -3 -r1.1.2.106 -r1.1.2.107
--- drbd_dsender.c	11 May 2004 13:14:49 -0000	1.1.2.106
+++ drbd_dsender.c	12 May 2004 10:00:47 -0000	1.1.2.107
@@ -882,11 +882,12 @@
 
 	drbd_wait_ee(mdev,&mdev->read_ee);
 
+	i = 0;
 	spin_lock_irq(&mdev->req_lock);
+  again:
 	list_splice_init(&mdev->data.work.q,&work_list);
 	spin_unlock_irq(&mdev->req_lock);
 
-	i = 0;
 	while(!list_empty(&work_list)) {
 		w = list_entry(work_list.next, struct drbd_work,list);
 		list_del_init(&w->list);
@@ -895,7 +896,8 @@
 	}
 
 	spin_lock_irq(&mdev->req_lock);
-	D_ASSERT(list_empty(&mdev->data.work.q));
+	ERR_IF(!list_empty(&mdev->data.work.q))
+		goto again;
 	sema_init(&mdev->data.work.s,0);
 	spin_unlock_irq(&mdev->req_lock);
 
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_int.h,v
retrieving revision 1.58.2.160
retrieving revision 1.58.2.161
diff -u -3 -r1.58.2.160 -r1.58.2.161
--- drbd_int.h	11 May 2004 13:14:49 -0000	1.58.2.160
+++ drbd_int.h	12 May 2004 10:00:47 -0000	1.58.2.161
@@ -164,7 +164,7 @@
 // to debug dec_*(), while we still have the <0!! issue
 // to debug dec_*(), while we still have the <0!! issue
 #include <linux/stringify.h>
-#define HERE __stringify(__FUNCTION__ __LINE__) // __FUNCTION__
+#define HERE __stringify(__FILE__ __LINE__) // __FUNCTION__
 
 #if 1
 #define C_DBG(r,x...)
@@ -1194,6 +1194,7 @@
 static inline void drbd_set_out_of_sync(drbd_dev* mdev,
 					sector_t sector, int blk_size)
 {
+	D_ASSERT(blk_size);
 	mdev->rs_total +=
 		bm_set_bit(mdev, sector, blk_size, SS_OUT_OF_SYNC);
 }
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_main.c,v
retrieving revision 1.73.2.170
retrieving revision 1.73.2.171
diff -u -3 -r1.73.2.170 -r1.73.2.171
--- drbd_main.c	11 May 2004 13:14:49 -0000	1.73.2.170
+++ drbd_main.c	12 May 2004 10:00:47 -0000	1.73.2.171
@@ -294,6 +294,8 @@
 	struct list_head *le,*tle;
 	struct drbd_barrier *b,*f,*new_first;
 	struct drbd_request *r;
+	sector_t sector;
+	unsigned int size;
 
 	new_first=kmalloc(sizeof(struct drbd_barrier),GFP_KERNEL);
 	INIT_LIST_HEAD(&new_first->requests);
@@ -314,25 +316,25 @@
 	while ( b ) {
 		list_for_each_safe(le, tle, &b->requests) {
 			r = list_entry(le, struct drbd_request,w.list);
-			if( (r->rq_status&0xfffe) != RQ_DRBD_SENT ) {
+			// bi_size and bi_sector are modified in bio_endio!
+			sector = drbd_req_get_sector(r);
+			size   = drbd_req_get_size(r);
+			if( !(r->rq_status & RQ_DRBD_SENT) ) {
 				if(mdev->conf.wire_protocol != DRBD_PROT_A )
 					dec_ap_pending(mdev,HERE);
-				drbd_end_req(r,RQ_DRBD_SENT,ERF_NOTLD|1,
-					     drbd_req_get_sector(r));
+				drbd_end_req(r,RQ_DRBD_SENT,ERF_NOTLD|1, sector);
 				goto mark;
 			}
 			if(mdev->conf.wire_protocol != DRBD_PROT_C ) {
 			mark:
-				drbd_set_out_of_sync(mdev
-				,	drbd_req_get_sector(r)
-				,	drbd_req_get_size(r));
+				drbd_set_out_of_sync(mdev, sector, size);
 			}
 		}
 		f=b;
 		b=b->next;
 		list_del(&f->requests);
 		kfree(f);
-		dec_ap_pending(mdev,HERE);
+		dec_ap_pending(mdev,HERE); // for the barrier
 	}
 }
 
@@ -718,7 +720,8 @@
 
 	inc_ap_pending(mdev);
 	ok = _drbd_send_cmd(mdev,mdev->data.socket,Barrier,(Drbd_Header*)&p,sizeof(p),0);
-	if (!ok) dec_ap_pending(mdev,HERE);
+
+//	if (!ok) dec_ap_pending(mdev,HERE); // is done in tl_clear()
 	return ok;
 }
 
@@ -898,7 +901,7 @@
 		drbd_set_out_of_sync(mdev,
 				     drbd_req_get_sector(req),
 				     drbd_req_get_size(req));
-		drbd_end_req(req,RQ_DRBD_SENT,ERF_NOTLD|1, 
+		drbd_end_req(req,RQ_DRBD_SENT,ERF_NOTLD|1,
 			     drbd_req_get_sector(req));
 	}
 	spin_lock(&mdev->send_task_lock);
@@ -1814,13 +1817,18 @@
 	int ret=0;
 	unsigned long flags;
 
+	if (size <= 0 || (size & 0x1ff) != 0 || size > PAGE_SIZE) {
+		DUMPI(size);
+		return 0;
+	}
+
 	if(sbm == NULL) {
 		printk(KERN_ERR DEVICE_NAME"X: No BitMap !?\n");
 		return 0;
 	}
 
 	if(sector >= sbm->dev_size<<1) return 0;
-	if(esector >= sbm->dev_size<<1) esector = (sbm->dev_size<<1) - 1;
+	ERR_IF(esector >= sbm->dev_size<<1) esector = (sbm->dev_size<<1) - 1;
 
 	sbnr = sector >> BM_SS;
 	ebnr = esector >> BM_SS;
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_receiver.c,v
retrieving revision 1.97.2.153
retrieving revision 1.97.2.154
diff -u -3 -r1.97.2.153 -r1.97.2.154
--- drbd_receiver.c	12 May 2004 07:38:16 -0000	1.97.2.153
+++ drbd_receiver.c	12 May 2004 10:00:47 -0000	1.97.2.154
@@ -899,10 +899,10 @@
 	data_size   = h->length  - header_size;
 
 	/* I expect a block to be a multiple of 512 byte, and
-	 * no more than 4K (8K). is this too restrictive?
+	 * no more than 4K (PAGE_SIZE). is this too restrictive?
 	 */
 	ERR_IF(data_size == 0) return FALSE;
-	ERR_IF(data_size &  0xff) return FALSE;
+	ERR_IF(data_size &  0x1ff) return FALSE;
 	ERR_IF(data_size >  PAGE_SIZE) return FALSE;
 
 	if (drbd_recv(mdev, h->payload, header_size) != header_size)
@@ -936,10 +936,10 @@
 	data_size   = h->length  - header_size;
 
 	/* I expect a block to be a multiple of 512 byte, and
-	 * no more than 4K (8K). is this too restrictive?
+	 * no more than 4K (PAGE_SIZE). is this too restrictive?
 	 */
 	ERR_IF(data_size == 0) return FALSE;
-	ERR_IF(data_size &  0xff) return FALSE;
+	ERR_IF(data_size &  0x1ff) return FALSE;
 	ERR_IF(data_size >  PAGE_SIZE) return FALSE;
 
 	if (drbd_recv(mdev, h->payload, header_size) != header_size)
@@ -994,10 +994,10 @@
 	data_size   = h->length  - header_size;
 
 	/* I expect a block to be a multiple of 512 byte, and
-	 * no more than 4K (8K). is this too restrictive?
+	 * no more than 4K (PAGE_SIZE). is this too restrictive?
 	 */
 	ERR_IF(data_size == 0) return FALSE;
-	ERR_IF(data_size &  0xff) return FALSE;
+	ERR_IF(data_size &  0x1ff) return FALSE;
 	ERR_IF(data_size >  PAGE_SIZE) return FALSE;
 
 	if (drbd_recv(mdev, h->payload, header_size) != header_size)
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_req-2.4.c,v
retrieving revision 1.33.2.74
retrieving revision 1.33.2.75
diff -u -3 -r1.33.2.74 -r1.33.2.75
--- drbd_req-2.4.c	7 May 2004 15:18:28 -0000	1.33.2.74
+++ drbd_req-2.4.c	12 May 2004 10:00:47 -0000	1.33.2.75
@@ -282,10 +282,11 @@
 			if (!drbd_send_dblock(mdev,req)) {
 				if (mdev->cstate >= Connected)
 					set_cstate(mdev,NetworkFailure);
-				drbd_thread_restart_nowait(&mdev->receiver);
 				dec_ap_pending(mdev,HERE);
+				drbd_thread_restart_nowait(&mdev->receiver);
 			} else if(mdev->conf.wire_protocol == DRBD_PROT_A) {
 				dec_ap_pending(mdev,HERE);
+				drbd_end_req(req, RQ_DRBD_SENT, 1, sector);
 			}
 		} else if (target_area_out_of_sync) {
 			drbd_read_remote(mdev,req);