[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 :)