diff options
Diffstat (limited to 'drivers/block')
| -rw-r--r-- | drivers/block/DAC960.c | 1 | ||||
| -rw-r--r-- | drivers/block/cciss.c | 1 | ||||
| -rw-r--r-- | drivers/block/cpqarray.c | 1 | ||||
| -rw-r--r-- | drivers/block/elevator.c | 1 | ||||
| -rw-r--r-- | drivers/block/floppy.c | 1 | ||||
| -rw-r--r-- | drivers/block/ll_rw_blk.c | 5 | ||||
| -rw-r--r-- | drivers/block/loop.c | 84 | ||||
| -rw-r--r-- | drivers/block/nbd.c | 1 | ||||
| -rw-r--r-- | drivers/block/rd.c | 2 | ||||
| -rw-r--r-- | drivers/block/umem.c | 1 |
10 files changed, 60 insertions, 38 deletions
diff --git a/drivers/block/DAC960.c b/drivers/block/DAC960.c index d57dc51df3f5..210449ad1715 100644 --- a/drivers/block/DAC960.c +++ b/drivers/block/DAC960.c @@ -28,6 +28,7 @@ #include <linux/types.h> #include <linux/blk.h> #include <linux/blkdev.h> +#include <linux/bio.h> #include <linux/completion.h> #include <linux/delay.h> #include <linux/genhd.h> diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index 9ae961460ff2..e06fd274b653 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c @@ -30,6 +30,7 @@ #include <linux/delay.h> #include <linux/major.h> #include <linux/fs.h> +#include <linux/bio.h> #include <linux/blkpg.h> #include <linux/timer.h> #include <linux/proc_fs.h> diff --git a/drivers/block/cpqarray.c b/drivers/block/cpqarray.c index 727cdeb23c0c..fccef1bb792c 100644 --- a/drivers/block/cpqarray.c +++ b/drivers/block/cpqarray.c @@ -24,6 +24,7 @@ #include <linux/version.h> #include <linux/types.h> #include <linux/pci.h> +#include <linux/bio.h> #include <linux/kernel.h> #include <linux/slab.h> #include <linux/delay.h> diff --git a/drivers/block/elevator.c b/drivers/block/elevator.c index 189814dbc7d1..cd3a4254e9e3 100644 --- a/drivers/block/elevator.c +++ b/drivers/block/elevator.c @@ -28,6 +28,7 @@ #include <linux/fs.h> #include <linux/blkdev.h> #include <linux/elevator.h> +#include <linux/bio.h> #include <linux/blk.h> #include <linux/config.h> #include <linux/module.h> diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c index 94f42b356556..aff8acff0ef3 100644 --- a/drivers/block/floppy.c +++ b/drivers/block/floppy.c @@ -165,6 +165,7 @@ static int print_unex=1; #include <linux/errno.h> #include <linux/slab.h> #include <linux/mm.h> +#include <linux/bio.h> #include <linux/string.h> #include <linux/fcntl.h> #include <linux/delay.h> diff --git a/drivers/block/ll_rw_blk.c b/drivers/block/ll_rw_blk.c index d53122b1ae46..16abcb3f5481 100644 --- a/drivers/block/ll_rw_blk.c +++ b/drivers/block/ll_rw_blk.c @@ -18,6 +18,7 @@ #include <linux/errno.h> #include <linux/string.h> #include <linux/config.h> +#include <linux/bio.h> #include <linux/mm.h> #include <linux/swap.h> #include <linux/init.h> @@ -2002,8 +2003,8 @@ int __init blk_dev_init(void) queue_nr_requests = (total_ram >> 8) & ~15; /* One per quarter-megabyte */ if (queue_nr_requests < 32) queue_nr_requests = 32; - if (queue_nr_requests > 512) - queue_nr_requests = 512; + if (queue_nr_requests > 256) + queue_nr_requests = 256; /* * Batch frees according to queue length diff --git a/drivers/block/loop.c b/drivers/block/loop.c index 5689de41b771..982604ff6bfd 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -60,6 +60,7 @@ #include <linux/sched.h> #include <linux/fs.h> #include <linux/file.h> +#include <linux/bio.h> #include <linux/stat.h> #include <linux/errno.h> #include <linux/major.h> @@ -168,6 +169,15 @@ static void figure_loop_size(struct loop_device *lo) } +static inline int lo_do_transfer(struct loop_device *lo, int cmd, char *rbuf, + char *lbuf, int size, int rblock) +{ + if (!lo->transfer) + return 0; + + return lo->transfer(lo, cmd, rbuf, lbuf, size, rblock); +} + static int do_lo_send(struct loop_device *lo, struct bio_vec *bvec, int bsize, loff_t pos) { @@ -454,20 +464,43 @@ static struct bio *loop_get_buffer(struct loop_device *lo, struct bio *rbh) out_bh: bio->bi_sector = rbh->bi_sector + (lo->lo_offset >> 9); bio->bi_rw = rbh->bi_rw; - spin_lock_irq(&lo->lo_lock); bio->bi_bdev = lo->lo_device; - spin_unlock_irq(&lo->lo_lock); return bio; } -static int loop_make_request(request_queue_t *q, struct bio *rbh) +static int +bio_transfer(struct loop_device *lo, struct bio *to_bio, + struct bio *from_bio) { - struct bio *bh = NULL; + unsigned long IV = loop_get_iv(lo, from_bio->bi_sector); + struct bio_vec *from_bvec, *to_bvec; + char *vto, *vfrom; + int ret = 0, i; + + __bio_for_each_segment(from_bvec, from_bio, i, 0) { + to_bvec = &to_bio->bi_io_vec[i]; + + kmap(from_bvec->bv_page); + kmap(to_bvec->bv_page); + vfrom = page_address(from_bvec->bv_page) + from_bvec->bv_offset; + vto = page_address(to_bvec->bv_page) + to_bvec->bv_offset; + ret |= lo_do_transfer(lo, bio_data_dir(to_bio), vto, vfrom, + from_bvec->bv_len, IV); + kunmap(from_bvec->bv_page); + kunmap(to_bvec->bv_page); + } + + return ret; +} + +static int loop_make_request(request_queue_t *q, struct bio *old_bio) +{ + struct bio *new_bio = NULL; struct loop_device *lo; unsigned long IV; - int rw = bio_rw(rbh); - int unit = minor(to_kdev_t(rbh->bi_bdev->bd_dev)); + int rw = bio_rw(old_bio); + int unit = minor(to_kdev_t(old_bio->bi_bdev->bd_dev)); if (unit >= max_loop) goto out; @@ -489,60 +522,41 @@ static int loop_make_request(request_queue_t *q, struct bio *rbh) goto err; } - blk_queue_bounce(q, &rbh); + blk_queue_bounce(q, &old_bio); /* * file backed, queue for loop_thread to handle */ if (lo->lo_flags & LO_FLAGS_DO_BMAP) { - loop_add_bio(lo, rbh); + loop_add_bio(lo, old_bio); return 0; } /* * piggy old buffer on original, and submit for I/O */ - bh = loop_get_buffer(lo, rbh); - IV = loop_get_iv(lo, rbh->bi_sector); + new_bio = loop_get_buffer(lo, old_bio); + IV = loop_get_iv(lo, old_bio->bi_sector); if (rw == WRITE) { - if (lo_do_transfer(lo, WRITE, bio_data(bh), bio_data(rbh), - bh->bi_size, IV)) + if (bio_transfer(lo, new_bio, old_bio)) goto err; } - generic_make_request(bh); + generic_make_request(new_bio); return 0; err: if (atomic_dec_and_test(&lo->lo_pending)) up(&lo->lo_bh_mutex); - loop_put_buffer(bh); + loop_put_buffer(new_bio); out: - bio_io_error(rbh); + bio_io_error(old_bio); return 0; inactive: spin_unlock_irq(&lo->lo_lock); goto out; } -static int do_bio_blockbacked(struct loop_device *lo, struct bio *bio, - struct bio *rbh) -{ - unsigned long IV = loop_get_iv(lo, rbh->bi_sector); - struct bio_vec *from; - char *vto, *vfrom; - int ret = 0, i; - - bio_for_each_segment(from, rbh, i) { - vfrom = page_address(from->bv_page) + from->bv_offset; - vto = page_address(bio->bi_io_vec[i].bv_page) + bio->bi_io_vec[i].bv_offset; - ret |= lo_do_transfer(lo, bio_data_dir(bio), vto, vfrom, - from->bv_len, IV); - } - - return ret; -} - static inline void loop_handle_bio(struct loop_device *lo, struct bio *bio) { int ret; @@ -556,7 +570,7 @@ static inline void loop_handle_bio(struct loop_device *lo, struct bio *bio) } else { struct bio *rbh = bio->bi_private; - ret = do_bio_blockbacked(lo, bio, rbh); + ret = bio_transfer(lo, bio, rbh); bio_endio(rbh, !ret); loop_put_buffer(bio); @@ -588,10 +602,8 @@ static int loop_thread(void *data) set_user_nice(current, -20); - spin_lock_irq(&lo->lo_lock); lo->lo_state = Lo_bound; atomic_inc(&lo->lo_pending); - spin_unlock_irq(&lo->lo_lock); /* * up sem, we are running diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index 67344c7fcc1a..697e825c3a91 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c @@ -39,6 +39,7 @@ #include <linux/init.h> #include <linux/sched.h> #include <linux/fs.h> +#include <linux/bio.h> #include <linux/stat.h> #include <linux/errno.h> #include <linux/file.h> diff --git a/drivers/block/rd.c b/drivers/block/rd.c index 4faf52c7be5c..7b60e75d5584 100644 --- a/drivers/block/rd.c +++ b/drivers/block/rd.c @@ -45,6 +45,8 @@ #include <linux/config.h> #include <linux/string.h> #include <linux/slab.h> +#include <asm/atomic.h> +#include <linux/bio.h> #include <linux/module.h> #include <linux/init.h> #include <linux/devfs_fs_kernel.h> diff --git a/drivers/block/umem.c b/drivers/block/umem.c index 8c61688cab1c..44909021aa06 100644 --- a/drivers/block/umem.c +++ b/drivers/block/umem.c @@ -37,6 +37,7 @@ #include <linux/config.h> #include <linux/sched.h> #include <linux/fs.h> +#include <linux/bio.h> #include <linux/kernel.h> #include <linux/mm.h> #include <linux/mman.h> |
