diff options
author | Alasdair G Kergon <agk@redhat.com> | 2008-07-03 03:53:43 -0400 |
---|---|---|
committer | Jens Axboe <jens.axboe@oracle.com> | 2008-07-03 07:21:15 -0400 |
commit | cc371e66e340f35eed8dc4651c7c18e754c7fb26 (patch) | |
tree | 5a2d6727eb07a05999c531a90da43ab1c36b713e /drivers/block | |
parent | b24498d477a14680fc3bb3ad884fa9fa76a2d237 (diff) |
Add bvec_merge_data to handle stacked devices and ->merge_bvec()
When devices are stacked, one device's merge_bvec_fn may need to perform
the mapping and then call one or more functions for its underlying devices.
The following bio fields are used:
bio->bi_sector
bio->bi_bdev
bio->bi_size
bio->bi_rw using bio_data_dir()
This patch creates a new struct bvec_merge_data holding a copy of those
fields to avoid having to change them directly in the struct bio when
going down the stack only to have to change them back again on the way
back up. (And then when the bio gets mapped for real, the whole
exercise gets repeated, but that's a problem for another day...)
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
Cc: Neil Brown <neilb@suse.de>
Cc: Milan Broz <mbroz@redhat.com>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Diffstat (limited to 'drivers/block')
-rw-r--r-- | drivers/block/pktcdvd.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c index 3ba1df93e9e3..589850cff359 100644 --- a/drivers/block/pktcdvd.c +++ b/drivers/block/pktcdvd.c | |||
@@ -2633,11 +2633,12 @@ end_io: | |||
2633 | 2633 | ||
2634 | 2634 | ||
2635 | 2635 | ||
2636 | static int pkt_merge_bvec(struct request_queue *q, struct bio *bio, struct bio_vec *bvec) | 2636 | static int pkt_merge_bvec(struct request_queue *q, struct bvec_merge_data *bmd, |
2637 | struct bio_vec *bvec) | ||
2637 | { | 2638 | { |
2638 | struct pktcdvd_device *pd = q->queuedata; | 2639 | struct pktcdvd_device *pd = q->queuedata; |
2639 | sector_t zone = ZONE(bio->bi_sector, pd); | 2640 | sector_t zone = ZONE(bmd->bi_sector, pd); |
2640 | int used = ((bio->bi_sector - zone) << 9) + bio->bi_size; | 2641 | int used = ((bmd->bi_sector - zone) << 9) + bmd->bi_size; |
2641 | int remaining = (pd->settings.size << 9) - used; | 2642 | int remaining = (pd->settings.size << 9) - used; |
2642 | int remaining2; | 2643 | int remaining2; |
2643 | 2644 | ||
@@ -2645,7 +2646,7 @@ static int pkt_merge_bvec(struct request_queue *q, struct bio *bio, struct bio_v | |||
2645 | * A bio <= PAGE_SIZE must be allowed. If it crosses a packet | 2646 | * A bio <= PAGE_SIZE must be allowed. If it crosses a packet |
2646 | * boundary, pkt_make_request() will split the bio. | 2647 | * boundary, pkt_make_request() will split the bio. |
2647 | */ | 2648 | */ |
2648 | remaining2 = PAGE_SIZE - bio->bi_size; | 2649 | remaining2 = PAGE_SIZE - bmd->bi_size; |
2649 | remaining = max(remaining, remaining2); | 2650 | remaining = max(remaining, remaining2); |
2650 | 2651 | ||
2651 | BUG_ON(remaining < 0); | 2652 | BUG_ON(remaining < 0); |