[DRBD-cvs] drbd by phil; * Removed the drbd_merge_bvec_fn() since...

drbd-user@lists.linbit.com drbd-user@lists.linbit.com
Thu, 13 May 2004 12:02:04 +0200 (CEST)


DRBD CVS committal

Author  : phil
Module  : drbd

Dir     : drbd/drbd


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


Log Message:
* Removed the drbd_merge_bvec_fn() since we must accest at least PAGE_SIZEd
  bios...
* Implemented splitting of BIOs in the make_request function.

XFS seems to work now on top of DRBD...

===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_compat_wrappers.h,v
retrieving revision 1.1.2.41
retrieving revision 1.1.2.42
diff -u -3 -r1.1.2.41 -r1.1.2.42
--- drbd_compat_wrappers.h	12 May 2004 10:00:47 -0000	1.1.2.41
+++ drbd_compat_wrappers.h	13 May 2004 10:01:58 -0000	1.1.2.42
@@ -289,9 +289,6 @@
 extern int drbd_dio_end            (struct bio *bio, unsigned int bytes_done, int error);
 extern int drbd_read_bi_end_io     (struct bio *bio, unsigned int bytes_done, int error);
 
-// we should not accept bios crossing our extent boundaries!
-extern int drbd_merge_bvec_fn(request_queue_t *q, struct bio *bio, struct bio_vec *bv);
-
 /* Returns the number of 512 byte sectors of the device */
 static inline sector_t drbd_get_capacity(struct block_device *bdev)
 {
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_fs.c,v
retrieving revision 1.28.2.87
retrieving revision 1.28.2.88
diff -u -3 -r1.28.2.87 -r1.28.2.88
--- drbd_fs.c	11 May 2004 13:14:49 -0000	1.28.2.87
+++ drbd_fs.c	13 May 2004 10:01:58 -0000	1.28.2.88
@@ -315,7 +315,6 @@
 	q->max_segment_size  = min((unsigned)PAGE_SIZE,b->max_segment_size);
 	q->hardsect_size     = max((unsigned short)512,b->hardsect_size);
 	q->seg_boundary_mask = b->seg_boundary_mask;
-	q->merge_bvec_fn     = drbd_merge_bvec_fn;
 	D_ASSERT(q->hardsect_size <= PAGE_SIZE); // or we are really screwed ;-)
 })
 #undef min_not_zero
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_main.c,v
retrieving revision 1.73.2.171
retrieving revision 1.73.2.172
diff -u -3 -r1.73.2.171 -r1.73.2.172
--- drbd_main.c	12 May 2004 10:00:47 -0000	1.73.2.171
+++ drbd_main.c	13 May 2004 10:01:58 -0000	1.73.2.172
@@ -1417,6 +1417,7 @@
 			if(rr) ERR("%d: %d EEs in read list found!\n",i,rr);
 
 			D_ASSERT(mdev->ee_vacant==0);
+			D_ASSERT(list_empty(&mdev->data.work.q));
 
 			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.75
retrieving revision 1.33.2.76
diff -u -3 -r1.33.2.75 -r1.33.2.76
--- drbd_req-2.4.c	12 May 2004 10:00:47 -0000	1.33.2.75
+++ drbd_req-2.4.c	13 May 2004 10:01:58 -0000	1.33.2.76
@@ -132,29 +132,6 @@
 	return rv;
 }
 
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-int drbd_merge_bvec_fn(request_queue_t *q, struct bio *bio, struct bio_vec *bv)
-{
-	drbd_dev * const mdev = q->queuedata;
-	sector_t sector = bio->bi_sector;
-	int lo_max = PAGE_SIZE, max = PAGE_SIZE;
-	const unsigned long chunk_sectors = AL_EXTENT_SIZE >> 9;
-
-	D_ASSERT(bio->bi_size == 0);
-
-	if (mdev->backing_bdev) {
-		request_queue_t * const b = mdev->backing_bdev->bd_disk->queue;
-		if (b->merge_bvec_fn)
-			lo_max = b->merge_bvec_fn(b,bio,bv);
-	}
-	max = (chunk_sectors - (sector & (chunk_sectors - 1))) << 9;
-	max = min(lo_max,max);
-	// if (max < 0) max = 0; /* bio_add cannot handle a negative return */
-	return min((int)PAGE_SIZE,max);
-}
-#endif
-
 STATIC int
 drbd_make_request_common(drbd_dev *mdev, int rw, int size,
 			 sector_t sector, drbd_bio_t *bio)
@@ -332,11 +309,31 @@
 #else
 int drbd_make_request_26(request_queue_t *q, struct bio *bio)
 {
+	unsigned int s_enr,e_enr;
 	struct Drbd_Conf* mdev = (drbd_dev*) q->queuedata;
 	if (mdev->cstate < StandAlone) {
 		drbd_bio_IO_error(bio);
 		return 0;
 	}
-	return drbd_make_request_common(mdev,bio_rw(bio),bio->bi_size,bio->bi_sector,bio);
+
+	s_enr = bio->bi_sector >> (AL_EXTENT_SIZE_B-9);
+	e_enr = (bio->bi_sector+(bio->bi_size>>9)-1) >> (AL_EXTENT_SIZE_B-9);
+	D_ASSERT(e_enr >= s_enr);
+
+	if(unlikely(s_enr != e_enr)) {
+		/* This bio crosses an AL_EXTENT boundary, so we have to
+		 * split it. [So far, only XFS is known to do this...]
+		 */
+		struct bio_pair *bp;
+		bp = bio_split(bio, bio_split_pool, 
+			       (e_enr<<(AL_EXTENT_SIZE_B-9)) - bio->bi_sector);
+		drbd_make_request_26(q,&bp->bio1);
+		drbd_make_request_26(q,&bp->bio2);
+		bio_pair_release(bp);
+		return 0;
+	}
+
+	return drbd_make_request_common(mdev,bio_rw(bio),bio->bi_size,
+					bio->bi_sector,bio);
 }
 #endif