[DRBD-cvs] drbd by phil; Marged Lars' 05-bio.diff.

drbd-user@lists.linbit.com drbd-user@lists.linbit.com
Tue, 27 Jan 2004 10:16:56 +0100 (CET)


DRBD CVS committal

Author  : phil
Module  : drbd

Dir     : drbd/drbd


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


Log Message:
Marged Lars' 05-bio.diff.

===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_actlog.c,v
retrieving revision 1.1.2.61
retrieving revision 1.1.2.62
diff -u -3 -r1.1.2.61 -r1.1.2.62
--- drbd_actlog.c	25 Jan 2004 00:38:09 -0000	1.1.2.61
+++ drbd_actlog.c	27 Jan 2004 09:16:50 -0000	1.1.2.62
@@ -32,6 +32,61 @@
 #define AL_EXTENT_SIZE (1<<AL_EXTENT_SIZE_B)
 #define AL_EXTENTS_PT 61
 
+/* This is what I like so much about the linux kernel:
+ * if you have a close look, you can almost always reuse code by someone else
+ * ;)
+ * this is mostly from drivers/md/md.c
+ */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+int drbd_md_sync_page_io(drbd_dev *mdev, unsigned long sector, int rw)
+{
+	struct buffer_head bh;
+	struct completion event;
+
+	init_completion(&event);
+	init_buffer(&bh, drbd_md_io_complete, &event);
+	bh.b_rdev = mdev->md_device;
+	bh.b_rsector = sector;
+	bh.b_state = (1 << BH_Req) | (1 << BH_Mapped) | (1 << BH_Lock);
+	bh.b_size = 512; // THINK: always? well, we can add an other parameter
+	bh.b_page = mdev->md_io_page;
+	bh.b_reqnext = NULL;
+	bh.b_data = page_address(mdev->md_io_page);
+	generic_make_request(rw, &bh);
+
+	run_task_queue(&tq_disk);
+	wait_for_completion(&event);
+
+	return test_bit(BH_Uptodate, &bh.b_state);
+}
+#else
+int drbd_md_sync_page_io(drbd_dev *mdev, unsigned long sector, int rw)
+{
+	struct bio bio;
+	struct bio_vec vec;
+	struct completion event;
+
+	bio_init(&bio);
+	bio.bi_io_vec = &vec;
+	vec.bv_page = mdev->md_io_page;
+	vec.bv_offset = 0;
+	vec.bv_len =
+	bio.bi_size = 512; // THINK: always? well, we can add an other parameter
+	bio.bi_vcnt = 1;
+	bio.bi_idx = 0;
+	bio.bi_bdev = mdev->md_bdev;
+	bio.bi_sector = sector;
+	init_completion(&event);
+	bio.bi_private = &event;
+	bio.bi_end_io = drbd_md_io_complete;
+	submit_bio(rw, &bio);
+	blk_run_queues();
+	wait_for_completion(&event);
+
+	return test_bit(BIO_UPTODATE, &bio.bi_flags);
+}
+#endif
+
 struct al_transaction {
 	u32       magic;
 	u32       tr_number;
@@ -146,7 +201,7 @@
 	u32 xor_sum=0;
 
 	down(&mdev->md_io_mutex); // protects md_io_buffer, al_tr_cycle, ...
-	buffer = (struct al_transaction*)drbd_bio_kmap(&mdev->md_io_bio);
+	buffer = (struct al_transaction*)kmap(mdev->md_io_page);
 
 	buffer->magic = __constant_cpu_to_be32(DRBD_MAGIC);
 	buffer->tr_number = cpu_to_be32(mdev->al_tr_number);
@@ -181,12 +236,11 @@
 
 	buffer->xor_sum = cpu_to_be32(xor_sum);
 
-	drbd_bio_kunmap(&mdev->md_io_bio);
+	kunmap(mdev->md_io_page);
 
 	sector = drbd_md_ss(mdev) + MD_AL_OFFSET + mdev->al_tr_pos ;
 
-	drbd_md_prepare_write(mdev,sector);
-	drbd_generic_make_request_wait(WRITE,&mdev->md_io_bio);
+	drbd_md_sync_page_io(mdev,sector,WRITE);
 
 	if( ++mdev->al_tr_pos > div_ceil(mdev->act_log->nr_elements,AL_EXTENTS_PT) ) {
 		mdev->al_tr_pos=0;
@@ -197,7 +251,7 @@
 }
 
 /* In case this function returns 1 == success, the caller must do
-		drbd_bio_kunmap(&mdev->md_io_bio);
+		kunmap(mdev->md_io_page);
 		up(&mdev->md_io_mutex);
  */
 STATIC int drbd_al_read_tr(struct Drbd_Conf *mdev,
@@ -212,10 +266,9 @@
 	down(&mdev->md_io_mutex);
 	sector = drbd_md_ss(mdev) + MD_AL_OFFSET + index;
 
-	drbd_md_prepare_read(mdev,sector);
-	drbd_generic_make_request_wait(READ,&mdev->md_io_bio);
+	drbd_md_sync_page_io(mdev,sector,READ);
 
-	buffer = (struct al_transaction*)drbd_bio_kmap(&mdev->md_io_bio);
+	buffer = (struct al_transaction*)kmap(mdev->md_io_page);
 
 	rv = ( be32_to_cpu(buffer->magic) == DRBD_MAGIC );
 
@@ -227,7 +280,7 @@
 	if(rv) {
 		*bp = buffer;
 	} else {
-		drbd_bio_kunmap(&mdev->md_io_bio);
+		kunmap(mdev->md_io_page);
 		up(&mdev->md_io_mutex);
 	}
 
@@ -250,7 +303,7 @@
 		if(!drbd_al_read_tr(mdev,&buffer,i)) continue;
 		cnr = be32_to_cpu(buffer->tr_number);
 		// INFO("index %d valid tnr=%d\n",i,cnr);
-		drbd_bio_kunmap(&mdev->md_io_bio);
+		kunmap(mdev->md_io_page);
 		up(&mdev->md_io_mutex);
 
 		if(cnr == -1) overflow=1;
@@ -298,7 +351,7 @@
 			active_extents++;
 		}
 
-		drbd_bio_kunmap(&mdev->md_io_bio);
+		kunmap(mdev->md_io_page);
 		up(&mdev->md_io_mutex);
 
 		transactions++;
@@ -404,17 +457,16 @@
 		sector = drbd_md_ss(mdev) + MD_BM_OFFSET + so;
 		so++;
 
-		drbd_md_prepare_read(mdev, sector);
-		drbd_generic_make_request_wait(READ,&mdev->md_io_bio);
+		drbd_md_sync_page_io(mdev,sector,READ);
 
-		buffer = (unsigned long *)drbd_bio_kmap(&mdev->md_io_bio);
+		buffer = (unsigned long *)kmap(mdev->md_io_page);
 
 		for(buf_i=0;buf_i<want;buf_i++) {
 			word = lel_to_cpu(buffer[buf_i]);
 			bits += hweight_long(word);
 			bm[bm_i++] = word;
 		}
-		drbd_bio_kunmap(&mdev->md_io_bio);
+		kunmap(mdev->md_io_page);
 	}
 
 	up(&mdev->md_io_mutex);
@@ -450,23 +502,24 @@
 	want=min_t(int,512/sizeof(long),bm_words-bm_i);
 
 	down(&mdev->md_io_mutex); // protects md_io_buffer
-	buffer = (unsigned long *)drbd_bio_kmap(&mdev->md_io_bio);
+	buffer = (unsigned long *)kmap(mdev->md_io_page);
 
 	for(buf_i=0;buf_i<want;buf_i++) {
 		buffer[buf_i] = cpu_to_lel(bm[bm_i++]);
 	}
 
-	drbd_bio_kunmap(&mdev->md_io_bio);
+	kunmap(mdev->md_io_page);
 
 	sector = drbd_md_ss(mdev) + MD_BM_OFFSET + enr/EXTENTS_PER_SECTOR;
 
-	drbd_md_prepare_write(mdev,sector);
 	if(sync) {
-		drbd_generic_make_request_wait(WRITE,&mdev->md_io_bio);
+		drbd_md_sync_page_io(mdev,sector,WRITE);
 		up(&mdev->md_io_mutex);
 	} else {
-		drbd_bio_set_end_io(&mdev->md_io_bio,drbd_async_eio);
-		drbd_generic_make_request(WRITE,&mdev->md_io_bio);
+#warning "FIXME pls remove ;)"
+		BUG(); // or do I miss something, Philipp?
+		// drbd_bio_set_end_io(&mdev->md_io_bio,drbd_async_eio);
+		// drbd_generic_make_request(WRITE,&mdev->md_io_bio);
 	}
 
 	mdev->bm_writ_cnt++;
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_compat_types.h,v
retrieving revision 1.1.2.3
retrieving revision 1.1.2.4
diff -u -3 -r1.1.2.3 -r1.1.2.4
--- drbd_compat_types.h	24 Jan 2004 18:28:26 -0000	1.1.2.3
+++ drbd_compat_types.h	27 Jan 2004 09:16:50 -0000	1.1.2.4
@@ -44,7 +44,7 @@
 
 
 #else // LINUX 2.6
-# warning "FIXME"
+#warning "FIXME"
 
 typedef struct bio drbd_bio_t;
 
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_compat_wrappers.h,v
retrieving revision 1.1.2.10
retrieving revision 1.1.2.11
diff -u -3 -r1.1.2.10 -r1.1.2.11
--- drbd_compat_wrappers.h	26 Jan 2004 20:45:30 -0000	1.1.2.10
+++ drbd_compat_wrappers.h	27 Jan 2004 09:16:50 -0000	1.1.2.11
@@ -8,8 +8,7 @@
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
 
 // b_end_io handlers
-extern void drbd_generic_end_io     (struct buffer_head *bh, int uptodate);
-extern void drbd_async_eio          (struct buffer_head *bh, int uptodate);
+extern void drbd_md_io_complete     (struct buffer_head *bh, int uptodate);
 extern void enslaved_read_bi_end_io (struct buffer_head *bh, int uptodate);
 extern void drbd_dio_end_sec        (struct buffer_head *bh, int uptodate);
 extern void drbd_dio_end            (struct buffer_head *bh, int uptodate);
@@ -40,7 +39,7 @@
 	blk_size[MAJOR_NR][(int)(mdev - drbd_conf)] = (size>>1);
 }
 
-# warning "FIXME why don't we care for the return value?"
+#warning "FIXME why don't we care for the return value?"
 static inline void drbd_set_blocksize(drbd_dev *mdev, int blksize)
 {
 	set_blocksize(MKDEV(MAJOR_NR, (int)(mdev-drbd_conf)), blksize);
@@ -109,14 +108,21 @@
 	bh_kunmap(bh);
 }
 
-static inline void drbd_bio_init(struct buffer_head *bh)
+static inline void drbd_ee_init(struct Tl_epoch_entry *e,struct page *page)
 {
-	memset(bh, 0, sizeof(struct buffer_head));
+	struct buffer_head * const bh = &e->private_bio;
+	memset(e, 0, sizeof(*e));
 
-	bh->b_list = BUF_LOCKED;
+	// BM_BLOCK_SIZE == PAGE_SIZE ! FIXME not necessarily on all arch!!
+	// bh->b_list   = BUF_LOCKED; // does it matter?
+	bh->b_size      = PAGE_SIZE;
+	bh->b_this_page = bh;
+	bh->b_state     = (1 << BH_Mapped);
 	init_waitqueue_head(&bh->b_wait);
+	set_bh_page(bh,page,0);
 	atomic_set(&bh->b_count, 1);
-	bh->b_state = (1 << BH_Mapped);	//has a disk mapping = dev & blocknr
+
+	e->block_id = ID_VACANT;
 }
 
 static inline void drbd_bio_set_pages_dirty(struct buffer_head *bh)
@@ -130,41 +136,9 @@
 }
 
 static inline void
-drbd_md_bh_prepare(drbd_dev *mdev, sector_t sector)
-{
-	struct buffer_head * const bh = &mdev->md_io_bio;
-
-	bh->b_blocknr = sector;	// We abuse b_blocknr here.
-	bh->b_size    = 512;
-	bh->b_private = mdev;
-	bh->b_rdev    = mdev->md_device;
-	bh->b_rsector = sector;
-	bh->b_state   = (1 << BH_Req)
-		       |(1 << BH_Launder)
-		       |(1 << BH_Lock);
-}
-
-static inline void drbd_md_prepare_write(drbd_dev *mdev, sector_t sector)
-{
-	struct buffer_head * const bh = &mdev->md_io_bio;
-
-	drbd_md_bh_prepare(mdev,sector);
-	set_bit(BH_Uptodate, &bh->b_state);
-	set_bit(BH_Dirty, &bh->b_state);
-	mdev->md_io_bio.b_end_io = drbd_generic_end_io;
-}
-
-static inline void drbd_md_prepare_read(drbd_dev *mdev, sector_t sector)
-{
-	drbd_md_bh_prepare(mdev, sector);
-	mdev->md_io_bio.b_end_io = drbd_generic_end_io;
-}
-
-static inline void
-drbd_bh_prepare(drbd_dev *mdev, struct buffer_head *bh,
-		sector_t sector, int size)
+drbd_ee_bh_prepare(drbd_dev *mdev, struct buffer_head *bh,
+		   sector_t sector, int size)
 {
-	// maybe: memset(bh,0,sizeof(*bh));
 	bh->b_blocknr  = sector;	// We abuse b_blocknr here.
 	bh->b_size     = size;
 	bh->b_rsector  = sector;
@@ -181,7 +155,7 @@
 {
 	struct buffer_head * const bh = &e->private_bio;
 
-	drbd_bh_prepare(mdev,bh,sector,size);
+	drbd_ee_bh_prepare(mdev,bh,sector,size);
 	set_bit(BH_Uptodate,&bh->b_state);
 	set_bit(BH_Dirty,&bh->b_state);
 	bh->b_end_io   = drbd_dio_end_sec;
@@ -193,7 +167,7 @@
 {
 	struct buffer_head * const bh = &e->private_bio;
 
-	drbd_bh_prepare(mdev,bh,sector,size);
+	drbd_ee_bh_prepare(mdev,bh,sector,size);
 	bh->b_end_io   = enslaved_read_bi_end_io;
 }
 
@@ -325,7 +299,7 @@
 }
 
 #else
-# warning "FIXME these do nonsense. Currently I only check whether it compiles!"
+#warning "FIXME these do nonsense. Currently I only check whether it compiles!"
 
 #include <linux/buffer_head.h> // for fsync_bdev
 
@@ -336,8 +310,7 @@
 
 // bi_end_io handlers
 // int (bio_end_io_t) (struct bio *, unsigned int, int);
-extern int drbd_generic_end_io     (struct bio *bio, unsigned int bytes_done, int error);
-extern int drbd_async_eio          (struct bio *bio, unsigned int bytes_done, int error);
+extern int drbd_md_io_complete     (struct bio *bio, unsigned int bytes_done, int error);
 extern int enslaved_read_bi_end_io (struct bio *bio, unsigned int bytes_done, int error);
 extern int drbd_dio_end_sec        (struct bio *bio, unsigned int bytes_done, int error);
 extern int drbd_dio_end            (struct bio *bio, unsigned int bytes_done, int error);
@@ -363,7 +336,7 @@
 	set_capacity(mdev->vdisk,size);
 }
 
-# warning "FIXME why don't we care for the return value?"
+#warning "FIXME why don't we care for the return value?"
 static inline void drbd_set_blocksize(drbd_dev *mdev, int blksize)
 {
 	set_blocksize(mdev->this_bdev,blksize);
@@ -476,9 +449,23 @@
 }
 #endif
 
-static inline void drbd_bio_init(struct bio *bio)
+static inline void drbd_ee_init(struct Tl_epoch_entry *e,struct page *page)
 {
-	bio_init(bio);
+	struct bio * const bio = &e->private_bio;
+	struct bio_vec * const vec = &e->ee_bvec;
+	memset(e, 0, sizeof(*e));
+
+	// bio_init(&bio); memset did it for us.
+	bio->bi_io_vec = vec;
+	vec->bv_page   = page;
+	vec->bv_len    =
+	bio->bi_size   = PAGE_SIZE;
+	bio->bi_flags  = 1 << BIO_UPTODATE;
+	bio->bi_max_vecs = 1;
+	bio->bi_destructor = NULL;
+	atomic_set(&bio->bi_cnt, 1);
+
+	e->block_id = ID_VACANT;
 }
 
 static inline void drbd_bio_set_pages_dirty(struct bio *bio)
@@ -491,29 +478,49 @@
 	bio->bi_end_io = h;
 }
 
-static inline void drbd_md_prepare_write(drbd_dev *mdev, sector_t sector)
-{
-}
-
-static inline void drbd_md_prepare_read(drbd_dev *mdev, sector_t sector)
+static inline void
+drbd_ee_bio_prepare(drbd_dev *mdev, struct Tl_epoch_entry* e,
+		    sector_t sector, int size)
 {
+	struct bio * const bio = &e->private_bio;
+	bio->bi_io_vec->bv_len =
+	bio->bi_size    = size;
+	bio->bi_bdev    = mdev->backing_bdev;
+	bio->bi_sector  = sector;
+	bio->bi_private = mdev;
 }
 
 static inline void
 drbd_ee_prepare_write(drbd_dev *mdev, struct Tl_epoch_entry* e,
 		      sector_t sector, int size)
 {
+	drbd_ee_bio_prepare(mdev,e,sector,size);
+	e->private_bio.bi_end_io = drbd_dio_end_sec;
 }
 
 static inline void
 drbd_ee_prepare_read(drbd_dev *mdev, struct Tl_epoch_entry* e,
 		     sector_t sector, int size)
 {
+	drbd_ee_bio_prepare(mdev,e,sector,size);
+	e->private_bio.bi_end_io = enslaved_read_bi_end_io;
 }
 
 static inline void
 drbd_req_prepare_write(drbd_dev *mdev, struct drbd_request *req)
 {
+	struct bio * const bio     = &req->private_bio;
+	struct bio * const bio_src =  req->master_bio;
+
+	__bio_clone(bio,bio_src);
+	bio->bi_bdev    = mdev->backing_bdev;
+	bio->bi_private = mdev;
+	bio->bi_end_io  = drbd_dio_end;
+
+	// FIXME D_ASSERT(??)
+	// what else?
+
+	req->rq_status = RQ_DRBD_NOTHING;
 }
 
 #if 0
@@ -542,6 +549,7 @@
 	generic_make_request(bio);
 }
 
+#if 0
 /* FIXME
  * I'd rather use something like sync_page_io() from drivers/md/md.c
  * for our meta data io!  For now I only copied some of it here.
@@ -559,6 +567,7 @@
 	wait_for_completion(&event);
 	return test_bit(BIO_UPTODATE, &bio->bi_flags);
 }
+#endif
 
 static inline void drbd_kick_lo(drbd_dev *mdev)
 {
@@ -576,6 +585,11 @@
  * common functions,
  * move back to drbd_int.h
  ***/
+
+// defined in drbd_dsender.c
+extern int
+drbd_md_sync_page_io(drbd_dev *mdev, unsigned long sector, int rw);
+
 /* Returns the start sector for metadata, aligned to 4K */
 static inline sector_t drbd_md_ss(drbd_dev *mdev)
 {
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_dsender.c,v
retrieving revision 1.1.2.62
retrieving revision 1.1.2.63
diff -u -3 -r1.1.2.62 -r1.1.2.63
--- drbd_dsender.c	26 Jan 2004 19:32:26 -0000	1.1.2.62
+++ drbd_dsender.c	27 Jan 2004 09:16:50 -0000	1.1.2.63
@@ -44,7 +44,6 @@
 #include "drbd.h"
 #include "drbd_int.h"
 
-
 /* I choose to have all block layer end_io handlers defined here.
 
  * For all these callbacks, note the follwing:
@@ -58,12 +57,15 @@
 /* used for synchronous meta data and bitmap IO
  * submitted by FIXME (I'd say worker only, but currently this is not true...)
  */
-void drbd_generic_end_io(struct buffer_head *bh, int uptodate)
-{ // This is a rough copy of end_buffer_io_sync
-	mark_buffer_uptodate(bh, uptodate);
-	unlock_buffer(bh);
+void drbd_md_io_complete(struct buffer_head *bh, int uptodate)
+{
+	if (uptodate)
+		set_bit(BH_Uptodate, &bh->b_state);
+
+	complete((struct completion*)bh->b_private);
 }
 
+#if 0
 /* used for asynchronous meta data and bitmap IO
  * submitted by FIXME (I'd say worker only, but currently this is not true...)
  */
@@ -78,6 +80,7 @@
 	unlock_buffer(bh);
 	up(&mdev->md_io_mutex);
 }
+#endif
 
 /* reads on behalf of the partner,
  * "submitted" by the receiver
@@ -166,12 +169,11 @@
 }
 
 #else
-# warning "FIXME"
+#warning "FIXME"
 /* used for synchronous meta data and bitmap IO
  * submitted by FIXME (I'd say worker only, but currently this is not true...)
  */
-
-int drbd_generic_end_io(struct bio *bio, unsigned int bytes_done, int error)
+int drbd_md_io_complete(struct bio *bio, unsigned int bytes_done, int error)
 {
 	if (bio->bi_size)
 		return 1;
@@ -180,14 +182,97 @@
 	return 0;
 }
 
-/* used for asynchronous meta data and bitmap IO
- * submitted by FIXME (I'd say worker only, but currently this is not true...)
+/* reads on behalf of the partner,
+ * "submitted" by the receiver
+ */
+int enslaved_read_bi_end_io(struct bio *bio, unsigned int bytes_done, int error)
+{
+	unsigned long flags=0;
+	struct Tl_epoch_entry *e=NULL;
+	struct Drbd_Conf* mdev;
+
+	/* we should be called via bio_endio, so this should never be the case
+	 * but "everyone else does it", and so do we ;)		-lge
+	 */
+	if (bio->bi_size)
+		return 1;
+
+	mdev=bio->bi_private;
+	PARANOIA_BUG_ON(!IS_VALID_MDEV(mdev));
+
+	e = container_of(bio,struct Tl_epoch_entry,private_bio);
+	PARANOIA_BUG_ON(!VALID_POINTER(e));
+	D_ASSERT(e->block_id != ID_VACANT);
+
+	spin_lock_irqsave(&mdev->ee_lock,flags);
+	list_del(&e->w.list);
+	spin_unlock_irqrestore(&mdev->ee_lock,flags);
+
+	drbd_queue_work(mdev,&mdev->data.work,&e->w);
+	return 0;
+}
+
+/* writes on behalf of the partner, or resync writes,
+ * "submitted" by the receiver.
  */
-int drbd_async_eio(struct bio *bio, unsigned int bytes_done, int error)
+int drbd_dio_end_sec(struct bio *bio, unsigned int bytes_done, int error)
 {
-	// FIXME: since all meta data io should be synchronous, this is
-	// probably a
-	BUG(); // and currently not used anyways.
+	unsigned long flags=0;
+	struct Tl_epoch_entry *e=NULL;
+	struct Drbd_Conf* mdev;
+
+	// see above
+	if (bio->bi_size)
+		return 1;
+
+	mdev=bio->bi_private;
+	PARANOIA_BUG_ON(!IS_VALID_MDEV(mdev));
+
+	e = container_of(bio,struct Tl_epoch_entry,private_bio);
+	PARANOIA_BUG_ON(!VALID_POINTER(e));
+	D_ASSERT(e->block_id != ID_VACANT);
+
+	spin_lock_irqsave(&mdev->ee_lock,flags);
+	list_del(&e->w.list);
+	list_add(&e->w.list,&mdev->done_ee);
+
+	if (waitqueue_active(&mdev->ee_wait) &&
+	    (list_empty(&mdev->active_ee) ||
+	     list_empty(&mdev->sync_ee)))
+		wake_up(&mdev->ee_wait);
+
+	spin_unlock_irqrestore(&mdev->ee_lock,flags);
+
+	if( mdev->do_panic && error) {
+		drbd_panic(DEVICE_NAME": The lower-level device had an error.\n");
+	}
+
+	wake_asender(mdev);
+	return 0;
+}
+
+/* writes on Primary comming from drbd_make_request
+ */
+int drbd_dio_end(struct bio *bio, unsigned int bytes_done, int error)
+{
+	struct Drbd_Conf* mdev;
+	drbd_request_t *req;
+
+	// see above
+	if (bio->bi_size)
+		return 1;
+
+	mdev = bio->bi_private;
+	PARANOIA_BUG_ON(!IS_VALID_MDEV(mdev));
+
+	req = container_of(bio,struct drbd_request,private_bio);
+	PARANOIA_BUG_ON(!VALID_POINTER(req));
+
+	if (error == 0)
+		D_ASSERT(drbd_bio_uptodate(bio));
+
+	drbd_end_req(req, RQ_DRBD_WRITTEN, (error == 0), drbd_req_get_sector(req));
+	drbd_al_complete_io(mdev,drbd_req_get_sector(req));
 	return 0;
 }
 #endif
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_fs.c,v
retrieving revision 1.28.2.52
retrieving revision 1.28.2.53
diff -u -3 -r1.28.2.52 -r1.28.2.53
--- drbd_fs.c	25 Jan 2004 19:03:50 -0000	1.28.2.52
+++ drbd_fs.c	27 Jan 2004 09:16:50 -0000	1.28.2.53
@@ -307,12 +307,13 @@
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
 #warning "FIXME make 26 clean, maybe move to compat layer?"
 #else
-	cn.cstate=mdev->cstate;
 	cn.lower_device_major=MAJOR(mdev->lo_device);
 	cn.lower_device_minor=MINOR(mdev->lo_device);
-	cn.disk_size_user=mdev->lo_usize;
 	cn.meta_device_major=MAJOR(mdev->md_device);
 	cn.meta_device_minor=MINOR(mdev->md_device);
+#endif
+	cn.cstate=mdev->cstate;
+	cn.disk_size_user=mdev->lo_usize;
 	cn.meta_index=mdev->md_index;
 	cn.do_panic=mdev->do_panic;
 	memcpy(&cn.nconf, &mdev->conf, sizeof(struct net_config));
@@ -320,7 +321,6 @@
 
 	if (copy_to_user(arg,&cn,sizeof(struct ioctl_get_config)))
 		return -EFAULT;
-#endif
 
 	return 0;
 }
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_int.h,v
retrieving revision 1.58.2.106
retrieving revision 1.58.2.107
diff -u -3 -r1.58.2.106 -r1.58.2.107
--- drbd_int.h	26 Jan 2004 19:32:26 -0000	1.58.2.106
+++ drbd_int.h	27 Jan 2004 09:16:50 -0000	1.58.2.107
@@ -542,6 +542,8 @@
 	int magic;
 	ONLY_IN_26(unsigned int ee_size;)
 	ONLY_IN_26(sector_t ee_sector;)
+	// THINK: maybe we rather want bio_alloc(GFP_*,1)
+	ONLY_IN_26(struct bio_vec ee_bvec;)
 };
 
 struct Pending_read {
@@ -701,7 +703,7 @@
 	wait_queue_head_t ee_wait;
 	struct list_head busy_blocks;
 	NOT_IN_26(struct tq_struct write_hint_tq;)
-	drbd_bio_t md_io_bio; // a (one page) Byte buffer for md_io
+	struct page *md_io_page; // one page buffer for md_io
 	struct semaphore md_io_mutex; // protects the md_io_buffer
 	spinlock_t al_lock;
 	wait_queue_head_t al_wait;
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_main.c,v
retrieving revision 1.73.2.112
retrieving revision 1.73.2.113
diff -u -3 -r1.73.2.112 -r1.73.2.113
--- drbd_main.c	26 Jan 2004 20:00:51 -0000	1.73.2.112
+++ drbd_main.c	27 Jan 2004 09:16:50 -0000	1.73.2.113
@@ -1152,7 +1152,6 @@
 void drbd_cleanup(void)
 {
 	int i, rr;
-	struct page *page;
 	if (drbd_conf) {
 		if (drbd_proc)
 			remove_proc_entry("drbd",&proc_root);
@@ -1197,9 +1196,8 @@
 			if(rr) printk(KERN_ERR DEVICE_NAME
 				       "%d: %d EEs in read list found!\n",i,rr);
 
-			page = drbd_bio_get_page(&mdev->md_io_bio);
-			if (page)
-				__free_page(page);
+			if (mdev->md_io_page)
+				__free_page(mdev->md_io_page);
 
 			if (mdev->act_log) lc_free(mdev->act_log);
 		}
@@ -1308,8 +1306,7 @@
 )
 
 		if(!page) goto Enomem;
-		drbd_bio_init(&mdev->md_io_bio);
-		drbd_bio_add_page(&mdev->md_io_bio,page,512,0);
+		mdev->md_io_page = page;
 
 		mdev->mbds_id = bm_init(0);
 		if (!mdev->mbds_id) goto Enomem;
@@ -1916,7 +1913,7 @@
 	if( mdev->lo_file == 0) return;
 
 	down(&mdev->md_io_mutex);
-	buffer = (struct meta_data_on_disk *)drbd_bio_kmap(&mdev->md_io_bio);
+	buffer = (struct meta_data_on_disk *)kmap(mdev->md_io_page);
 
 	flags=mdev->gen_cnt[Flags] & ~(MDF_PrimaryInd|MDF_ConnectedInd);
 	if(mdev->state==Primary) flags |= MDF_PrimaryInd;
@@ -1934,11 +1931,10 @@
 
 	buffer->bm_offset = __constant_cpu_to_be32(MD_BM_OFFSET);
 
-	drbd_bio_kunmap(&mdev->md_io_bio);
+	kunmap(mdev->md_io_page);
 	sector = drbd_md_ss(mdev) + MD_GC_OFFSET;
 
-	drbd_md_prepare_write(mdev,sector);
-	drbd_generic_make_request_wait(WRITE,&mdev->md_io_bio);
+	drbd_md_sync_page_io(mdev,sector,WRITE);
 
 	up(&mdev->md_io_mutex);
 }
@@ -1955,11 +1951,9 @@
 
 	sector = drbd_md_ss(mdev) + MD_GC_OFFSET;
 
-	drbd_md_prepare_read(mdev,sector);
-	drbd_generic_make_request_wait(READ,&mdev->md_io_bio);
-	ERR_IF( ! drbd_bio_uptodate(&mdev->md_io_bio) ) goto err;
+	ERR_IF( ! drbd_md_sync_page_io(mdev,sector,READ) ) goto err;
 
-	buffer = (struct meta_data_on_disk *)drbd_bio_kmap(&mdev->md_io_bio);
+	buffer = (struct meta_data_on_disk *)kmap(mdev->md_io_page);
 
 	if(be32_to_cpu(buffer->magic) != DRBD_MD_MAGIC) goto err;
 
@@ -1968,12 +1962,12 @@
 	mdev->la_size = be64_to_cpu(buffer->la_size);
 	mdev->sync_conf.al_extents = be32_to_cpu(buffer->al_nr_extents);
 
-	drbd_bio_kunmap(&mdev->md_io_bio);
+	kunmap(mdev->md_io_page);
 	up(&mdev->md_io_mutex);
 	return;
 
  err:
-	drbd_bio_kunmap(&mdev->md_io_bio);
+	kunmap(mdev->md_io_page);
 	up(&mdev->md_io_mutex);
 
 	INFO("Creating state block\n");
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_receiver.c,v
retrieving revision 1.97.2.96
retrieving revision 1.97.2.97
diff -u -3 -r1.97.2.96 -r1.97.2.97
--- drbd_receiver.c	26 Jan 2004 19:32:27 -0000	1.97.2.96
+++ drbd_receiver.c	27 Jan 2004 09:16:50 -0000	1.97.2.97
@@ -165,11 +165,7 @@
 	e = kmem_cache_alloc(drbd_ee_cache, mask);
 	if( e == NULL ) return FALSE;
 
-	// BM_BLOCK_SIZE == PAGE_SIZE ! FIXME not necessarily on all arch!!
-	drbd_bio_init(&e->private_bio);
-	drbd_bio_add_page(&e->private_bio,page,BM_BLOCK_SIZE_B,0);
-
-	e->block_id = ID_VACANT;
+	drbd_ee_init(e,page);
 	spin_lock_irq(&mdev->ee_lock);
 	list_add(&e->w.list,&mdev->free_ee);
 	mdev->ee_vacant++;
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_req-2.4.c,v
retrieving revision 1.33.2.45
retrieving revision 1.33.2.46
diff -u -3 -r1.33.2.45 -r1.33.2.46
--- drbd_req-2.4.c	25 Jan 2004 19:03:50 -0000	1.33.2.45
+++ drbd_req-2.4.c	27 Jan 2004 09:16:50 -0000	1.33.2.46
@@ -131,7 +131,7 @@
 	drbd_send_drequest(mdev, DataRequest, bio->b_rsector, bio->b_size,
 			   (unsigned long)pr);
 #else
-# warning "FIXME make 2.6.x clean"
+#warning "FIXME make 2.6.x clean"
 #endif
 }
 
@@ -159,7 +159,7 @@
 	}
 
 #else
-# warning "FIXME"
+#warning "FIXME"
 #endif
 
 	/* what do we know?
@@ -262,7 +262,7 @@
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
 		bio->b_rdev = mdev->lo_device;
 #else
-# warning "FIXME"
+#warning "FIXME"
 		/* I want to change it anyways so we never remap ... */
 #endif
 		return 1; // Not arranged for transfer ( but remapped :)
@@ -278,7 +278,7 @@
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
 		bio->b_rdev = mdev->lo_device;
 #else
-# warning "FIXME"
+#warning "FIXME"
 		/* I want to change it anyways so we never remap ... */
 #endif
 		return 1; // Not arranged for transfer ( but remapped :)