Commit 3babc504 authored by Jens Axboe's avatar Jens Axboe

[PATCH] Update md to new i/o completions

parent 5f761bd3
...@@ -144,7 +144,7 @@ static int linear_make_request (request_queue_t *q, struct bio *bio) ...@@ -144,7 +144,7 @@ static int linear_make_request (request_queue_t *q, struct bio *bio)
if (!hash->dev1) { if (!hash->dev1) {
printk ("linear_make_request : hash->dev1==NULL for block %ld\n", printk ("linear_make_request : hash->dev1==NULL for block %ld\n",
block); block);
bio_io_error(bio); bio_io_error(bio, bio->bi_size);
return 0; return 0;
} }
tmp_dev = hash->dev1; tmp_dev = hash->dev1;
...@@ -154,7 +154,7 @@ static int linear_make_request (request_queue_t *q, struct bio *bio) ...@@ -154,7 +154,7 @@ static int linear_make_request (request_queue_t *q, struct bio *bio)
if (block >= (tmp_dev->size + tmp_dev->offset) if (block >= (tmp_dev->size + tmp_dev->offset)
|| block < tmp_dev->offset) { || block < tmp_dev->offset) {
printk ("linear_make_request: Block %ld out of bounds on dev %s size %ld offset %ld\n", block, bdevname(tmp_dev->rdev->bdev), tmp_dev->size, tmp_dev->offset); printk ("linear_make_request: Block %ld out of bounds on dev %s size %ld offset %ld\n", block, bdevname(tmp_dev->rdev->bdev), tmp_dev->size, tmp_dev->offset);
bio_io_error(bio); bio_io_error(bio, bio->bi_size);
return 0; return 0;
} }
bio->bi_bdev = tmp_dev->rdev->bdev; bio->bi_bdev = tmp_dev->rdev->bdev;
......
...@@ -144,7 +144,7 @@ static mddev_t *mddev_map[MAX_MD_DEVS]; ...@@ -144,7 +144,7 @@ static mddev_t *mddev_map[MAX_MD_DEVS];
static int md_fail_request (request_queue_t *q, struct bio *bio) static int md_fail_request (request_queue_t *q, struct bio *bio)
{ {
bio_io_error(bio); bio_io_error(bio, bio->bi_size);
return 0; return 0;
} }
...@@ -361,9 +361,13 @@ static void free_disk_sb(mdk_rdev_t * rdev) ...@@ -361,9 +361,13 @@ static void free_disk_sb(mdk_rdev_t * rdev)
} }
static void bi_complete(struct bio *bio) static int bi_complete(struct bio *bio, unsigned int bytes_done, int error)
{ {
if (bio->bi_size)
return 1;
complete((struct completion*)bio->bi_private); complete((struct completion*)bio->bi_private);
return 0;
} }
static int sync_page_io(struct block_device *bdev, sector_t sector, int size, static int sync_page_io(struct block_device *bdev, sector_t sector, int size,
......
...@@ -109,17 +109,20 @@ static void multipath_end_bh_io (struct multipath_bh *mp_bh, int uptodate) ...@@ -109,17 +109,20 @@ static void multipath_end_bh_io (struct multipath_bh *mp_bh, int uptodate)
struct bio *bio = mp_bh->master_bio; struct bio *bio = mp_bh->master_bio;
multipath_conf_t *conf = mddev_to_conf(mp_bh->mddev); multipath_conf_t *conf = mddev_to_conf(mp_bh->mddev);
bio_endio(bio, uptodate); bio_endio(bio, bio->bi_size, uptodate ? 0 : -EIO);
mempool_free(mp_bh, conf->pool); mempool_free(mp_bh, conf->pool);
} }
void multipath_end_request(struct bio *bio) int multipath_end_request(struct bio *bio, unsigned int bytes_done, int error)
{ {
int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags); int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
struct multipath_bh * mp_bh = (struct multipath_bh *)(bio->bi_private); struct multipath_bh * mp_bh = (struct multipath_bh *)(bio->bi_private);
multipath_conf_t *conf = mddev_to_conf(mp_bh->mddev); multipath_conf_t *conf = mddev_to_conf(mp_bh->mddev);
mdk_rdev_t *rdev = conf->multipaths[mp_bh->path].rdev; mdk_rdev_t *rdev = conf->multipaths[mp_bh->path].rdev;
if (bio->bi_size)
return 1;
if (uptodate) if (uptodate)
multipath_end_bh_io(mp_bh, uptodate); multipath_end_bh_io(mp_bh, uptodate);
else { else {
...@@ -132,7 +135,7 @@ void multipath_end_request(struct bio *bio) ...@@ -132,7 +135,7 @@ void multipath_end_request(struct bio *bio)
multipath_reschedule_retry(mp_bh); multipath_reschedule_retry(mp_bh);
} }
atomic_dec(&rdev->nr_pending); atomic_dec(&rdev->nr_pending);
return; return 0;
} }
/* /*
......
...@@ -323,7 +323,7 @@ static int raid0_make_request (request_queue_t *q, struct bio *bio) ...@@ -323,7 +323,7 @@ static int raid0_make_request (request_queue_t *q, struct bio *bio)
bad_zone1: bad_zone1:
printk ("raid0_make_request bug: hash->zone1==NULL for block %ld\n", block); printk ("raid0_make_request bug: hash->zone1==NULL for block %ld\n", block);
outerr: outerr:
bio_io_error(bio); bio_io_error(bio, bio->bi_size);
return 0; return 0;
} }
......
...@@ -236,7 +236,7 @@ static void raid_end_bio_io(r1bio_t *r1_bio, int uptodate) ...@@ -236,7 +236,7 @@ static void raid_end_bio_io(r1bio_t *r1_bio, int uptodate)
{ {
struct bio *bio = r1_bio->master_bio; struct bio *bio = r1_bio->master_bio;
bio_endio(bio, uptodate); bio_endio(bio, bio->bi_size, uptodate ? 0 : -EIO);
free_r1bio(r1_bio); free_r1bio(r1_bio);
} }
...@@ -251,12 +251,15 @@ static void inline update_head_pos(int disk, r1bio_t *r1_bio) ...@@ -251,12 +251,15 @@ static void inline update_head_pos(int disk, r1bio_t *r1_bio)
r1_bio->sector + (r1_bio->master_bio->bi_size >> 9); r1_bio->sector + (r1_bio->master_bio->bi_size >> 9);
} }
static void end_request(struct bio *bio) static int end_request(struct bio *bio, unsigned int bytes_done, int error)
{ {
int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags); int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
r1bio_t * r1_bio = (r1bio_t *)(bio->bi_private); r1bio_t * r1_bio = (r1bio_t *)(bio->bi_private);
int mirror; int mirror;
conf_t *conf = mddev_to_conf(r1_bio->mddev); conf_t *conf = mddev_to_conf(r1_bio->mddev);
if (bio->bi_size)
return 1;
if (r1_bio->cmd == READ || r1_bio->cmd == READA) if (r1_bio->cmd == READ || r1_bio->cmd == READA)
mirror = r1_bio->read_disk; mirror = r1_bio->read_disk;
...@@ -313,6 +316,7 @@ static void end_request(struct bio *bio) ...@@ -313,6 +316,7 @@ static void end_request(struct bio *bio)
raid_end_bio_io(r1_bio, uptodate); raid_end_bio_io(r1_bio, uptodate);
} }
atomic_dec(&conf->mirrors[mirror].rdev->nr_pending); atomic_dec(&conf->mirrors[mirror].rdev->nr_pending);
return 0;
} }
/* /*
...@@ -748,12 +752,15 @@ static int raid1_remove_disk(mddev_t *mddev, int number) ...@@ -748,12 +752,15 @@ static int raid1_remove_disk(mddev_t *mddev, int number)
#define REDIRECT_SECTOR KERN_ERR \ #define REDIRECT_SECTOR KERN_ERR \
"raid1: %s: redirecting sector %lu to another mirror\n" "raid1: %s: redirecting sector %lu to another mirror\n"
static void end_sync_read(struct bio *bio) static int end_sync_read(struct bio *bio, unsigned int bytes_done, int error)
{ {
int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags); int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
r1bio_t * r1_bio = (r1bio_t *)(bio->bi_private); r1bio_t * r1_bio = (r1bio_t *)(bio->bi_private);
conf_t *conf = mddev_to_conf(r1_bio->mddev); conf_t *conf = mddev_to_conf(r1_bio->mddev);
if (bio->bi_size)
return 1;
if (r1_bio->read_bio != bio) if (r1_bio->read_bio != bio)
BUG(); BUG();
update_head_pos(r1_bio->read_disk, r1_bio); update_head_pos(r1_bio->read_disk, r1_bio);
...@@ -769,9 +776,10 @@ static void end_sync_read(struct bio *bio) ...@@ -769,9 +776,10 @@ static void end_sync_read(struct bio *bio)
set_bit(R1BIO_Uptodate, &r1_bio->state); set_bit(R1BIO_Uptodate, &r1_bio->state);
atomic_dec(&conf->mirrors[r1_bio->read_disk].rdev->nr_pending); atomic_dec(&conf->mirrors[r1_bio->read_disk].rdev->nr_pending);
reschedule_retry(r1_bio); reschedule_retry(r1_bio);
return 0;
} }
static void end_sync_write(struct bio *bio) static int end_sync_write(struct bio *bio, unsigned int bytes_done, int error)
{ {
int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags); int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
r1bio_t * r1_bio = (r1bio_t *)(bio->bi_private); r1bio_t * r1_bio = (r1bio_t *)(bio->bi_private);
...@@ -780,6 +788,9 @@ static void end_sync_write(struct bio *bio) ...@@ -780,6 +788,9 @@ static void end_sync_write(struct bio *bio)
int i; int i;
int mirror=0; int mirror=0;
if (bio->bi_size)
return 1;
for (i = 0; i < conf->raid_disks; i++) for (i = 0; i < conf->raid_disks; i++)
if (r1_bio->write_bios[i] == bio) { if (r1_bio->write_bios[i] == bio) {
mirror = i; mirror = i;
...@@ -795,6 +806,7 @@ static void end_sync_write(struct bio *bio) ...@@ -795,6 +806,7 @@ static void end_sync_write(struct bio *bio)
put_buf(r1_bio); put_buf(r1_bio);
} }
atomic_dec(&conf->mirrors[mirror].rdev->nr_pending); atomic_dec(&conf->mirrors[mirror].rdev->nr_pending);
return 0;
} }
static void sync_request_write(mddev_t *mddev, r1bio_t *r1_bio) static void sync_request_write(mddev_t *mddev, r1bio_t *r1_bio)
......
...@@ -321,13 +321,17 @@ static void shrink_stripes(raid5_conf_t *conf) ...@@ -321,13 +321,17 @@ static void shrink_stripes(raid5_conf_t *conf)
conf->slab_cache = NULL; conf->slab_cache = NULL;
} }
static void raid5_end_read_request (struct bio * bi) static int raid5_end_read_request (struct bio * bi, unsigned int bytes_done,
int error)
{ {
struct stripe_head *sh = bi->bi_private; struct stripe_head *sh = bi->bi_private;
raid5_conf_t *conf = sh->raid_conf; raid5_conf_t *conf = sh->raid_conf;
int disks = conf->raid_disks, i; int disks = conf->raid_disks, i;
int uptodate = test_bit(BIO_UPTODATE, &bi->bi_flags); int uptodate = test_bit(BIO_UPTODATE, &bi->bi_flags);
if (bi->bi_size)
return 1;
for (i=0 ; i<disks; i++) for (i=0 ; i<disks; i++)
if (bi == &sh->dev[i].req) if (bi == &sh->dev[i].req)
break; break;
...@@ -335,7 +339,7 @@ static void raid5_end_read_request (struct bio * bi) ...@@ -335,7 +339,7 @@ static void raid5_end_read_request (struct bio * bi)
PRINTK("end_read_request %lu/%d, count: %d, uptodate %d.\n", sh->sector, i, atomic_read(&sh->count), uptodate); PRINTK("end_read_request %lu/%d, count: %d, uptodate %d.\n", sh->sector, i, atomic_read(&sh->count), uptodate);
if (i == disks) { if (i == disks) {
BUG(); BUG();
return; return 0;
} }
if (uptodate) { if (uptodate) {
...@@ -384,9 +388,11 @@ static void raid5_end_read_request (struct bio * bi) ...@@ -384,9 +388,11 @@ static void raid5_end_read_request (struct bio * bi)
clear_bit(R5_LOCKED, &sh->dev[i].flags); clear_bit(R5_LOCKED, &sh->dev[i].flags);
set_bit(STRIPE_HANDLE, &sh->state); set_bit(STRIPE_HANDLE, &sh->state);
release_stripe(sh); release_stripe(sh);
return 0;
} }
static void raid5_end_write_request (struct bio *bi) static int raid5_end_write_request (struct bio *bi, unsigned int bytes_done,
int error)
{ {
struct stripe_head *sh = bi->bi_private; struct stripe_head *sh = bi->bi_private;
raid5_conf_t *conf = sh->raid_conf; raid5_conf_t *conf = sh->raid_conf;
...@@ -394,6 +400,9 @@ static void raid5_end_write_request (struct bio *bi) ...@@ -394,6 +400,9 @@ static void raid5_end_write_request (struct bio *bi)
unsigned long flags; unsigned long flags;
int uptodate = test_bit(BIO_UPTODATE, &bi->bi_flags); int uptodate = test_bit(BIO_UPTODATE, &bi->bi_flags);
if (bi->bi_size)
return 1;
for (i=0 ; i<disks; i++) for (i=0 ; i<disks; i++)
if (bi == &sh->dev[i].req) if (bi == &sh->dev[i].req)
break; break;
...@@ -401,7 +410,7 @@ static void raid5_end_write_request (struct bio *bi) ...@@ -401,7 +410,7 @@ static void raid5_end_write_request (struct bio *bi)
PRINTK("end_write_request %lu/%d, count %d, uptodate: %d.\n", sh->sector, i, atomic_read(&sh->count), uptodate); PRINTK("end_write_request %lu/%d, count %d, uptodate: %d.\n", sh->sector, i, atomic_read(&sh->count), uptodate);
if (i == disks) { if (i == disks) {
BUG(); BUG();
return; return 0;
} }
spin_lock_irqsave(&conf->device_lock, flags); spin_lock_irqsave(&conf->device_lock, flags);
...@@ -414,6 +423,7 @@ static void raid5_end_write_request (struct bio *bi) ...@@ -414,6 +423,7 @@ static void raid5_end_write_request (struct bio *bi)
set_bit(STRIPE_HANDLE, &sh->state); set_bit(STRIPE_HANDLE, &sh->state);
__release_stripe(conf, sh); __release_stripe(conf, sh);
spin_unlock_irqrestore(&conf->device_lock, flags); spin_unlock_irqrestore(&conf->device_lock, flags);
return 0;
} }
...@@ -1135,9 +1145,12 @@ static void handle_stripe(struct stripe_head *sh) ...@@ -1135,9 +1145,12 @@ static void handle_stripe(struct stripe_head *sh)
spin_unlock(&sh->lock); spin_unlock(&sh->lock);
while ((bi=return_bi)) { while ((bi=return_bi)) {
int bytes = bi->bi_size;
return_bi = bi->bi_next; return_bi = bi->bi_next;
bi->bi_next = NULL; bi->bi_next = NULL;
bi->bi_end_io(bi); bi->bi_size = 0;
bi->bi_end_io(bi, bytes, 0);
} }
for (i=disks; i-- ;) for (i=disks; i-- ;)
if (sh->dev[i].flags & ((1<<R5_Wantwrite)|(1<<R5_Wantread))) { if (sh->dev[i].flags & ((1<<R5_Wantwrite)|(1<<R5_Wantread))) {
...@@ -1236,7 +1249,6 @@ static int make_request (request_queue_t *q, struct bio * bi) ...@@ -1236,7 +1249,6 @@ static int make_request (request_queue_t *q, struct bio * bi)
last_sector = bi->bi_sector + (bi->bi_size>>9); last_sector = bi->bi_sector + (bi->bi_size>>9);
bi->bi_next = NULL; bi->bi_next = NULL;
set_bit(BIO_UPTODATE, &bi->bi_flags); /* will be cleared if error detected */
bi->bi_phys_segments = 1; /* over-loaded to count active stripes */ bi->bi_phys_segments = 1; /* over-loaded to count active stripes */
for (;logical_sector < last_sector; logical_sector += STRIPE_SECTORS) { for (;logical_sector < last_sector; logical_sector += STRIPE_SECTORS) {
...@@ -1257,8 +1269,12 @@ static int make_request (request_queue_t *q, struct bio * bi) ...@@ -1257,8 +1269,12 @@ static int make_request (request_queue_t *q, struct bio * bi)
} }
} }
spin_lock_irq(&conf->device_lock); spin_lock_irq(&conf->device_lock);
if (--bi->bi_phys_segments == 0) if (--bi->bi_phys_segments == 0) {
bi->bi_end_io(bi); int bytes = bi->bi_size;
bi->bi_size = 0;
bi->bi_end_io(bi, bytes, 0);
}
spin_unlock_irq(&conf->device_lock); spin_unlock_irq(&conf->device_lock);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment