multipath_conf_t *conf = mddev_to_conf(mp_bh->mddev);
bio_endio(bio, uptodate);
- bio_put(mp_bh->bio);
mempool_free(mp_bh, conf->pool);
}
{
mddev_t *mddev = q->queuedata;
multipath_conf_t *conf = mddev_to_conf(mddev);
- struct bio *real_bio;
struct multipath_bh * mp_bh;
struct multipath_info *multipath;
mp_bh->master_bio = bio;
mp_bh->mddev = mddev;
- mp_bh->cmd = bio_data_dir(bio);
/*
* read balancing logic:
*/
multipath = conf->multipaths + multipath_read_balance(conf);
- real_bio = bio_clone(bio, GFP_NOIO);
- real_bio->bi_bdev = multipath->bdev;
- real_bio->bi_rw = bio_data_dir(bio);
- real_bio->bi_end_io = multipath_end_request;
- real_bio->bi_private = mp_bh;
- mp_bh->bio = real_bio;
- generic_make_request(real_bio);
+ mp_bh->bio = *bio;
+ mp_bh->bio.bi_bdev = multipath->bdev;
+ mp_bh->bio.bi_end_io = multipath_end_request;
+ mp_bh->bio.bi_private = mp_bh;
+ generic_make_request(&mp_bh->bio);
return 0;
}
printk(KERN_INFO "dirty sb detected, updating.\n");
md_update_sb(mddev);
}
- bio = mp_bh->bio;
+ bio = &mp_bh->bio;
+ bio->bi_sector = mp_bh->master_bio->bi_sector;
bdev = bio->bi_bdev;
multipath_map (mddev, &bio->bi_bdev);
#define _MULTIPATH_H
#include <linux/raid/md.h>
+#include <linux/bio.h>
struct multipath_info {
int number;
int raid_disks;
int working_disks;
mdk_thread_t *thread;
- struct multipath_info *spare;
spinlock_t device_lock;
mempool_t *pool;
*/
struct multipath_bh {
- atomic_t remaining; /* 'have we finished' count,
- * used from IRQ handlers
- */
- int cmd;
mddev_t *mddev;
struct bio *master_bio;
- struct bio *bio;
- struct multipath_bh *next_mp; /* next for retry or in free list */
+ struct bio bio;
+ struct multipath_bh *next_mp; /* next for retry */
};
#endif