[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