From 325e3788b0770e9337a85f4ff7a69c2c6a7e4780 Mon Sep 17 00:00:00 2001 From: Mike Christie Date: Wed, 31 Oct 2007 15:28:15 -0500 Subject: [PATCH 05/13] remove old bio code replaced by last patches This patch just removes the old bio map and bio copy/uncopy code that is now replaced with the bio set page pool versions. Signed-off-by: Mike Christie --- fs/bio.c | 155 -------------------------------------------------------------- 1 files changed, 0 insertions(+), 155 deletions(-) diff --git a/fs/bio.c b/fs/bio.c index 03b3879..f73262f 100644 --- a/fs/bio.c +++ b/fs/bio.c @@ -643,161 +643,6 @@ int bio_add_page(struct bio *bio, struct page *page, unsigned int len, return __bio_add_page(q, bio, page, len, offset, q->max_sectors); } -#if 0 - -all the old bio map data code will be removed in the next patch - -struct bio_map_data { - struct bio_vec *iovecs; - void __user *userptr; -}; - -static void bio_set_map_data(struct bio_map_data *bmd, struct bio *bio) -{ - memcpy(bmd->iovecs, bio->bi_io_vec, sizeof(struct bio_vec) * bio->bi_vcnt); - bio->bi_private = bmd; -} - -static void bio_free_map_data(struct bio_map_data *bmd) -{ - kfree(bmd->iovecs); - kfree(bmd); -} - -static struct bio_map_data *bio_alloc_map_data(int nr_segs) -{ - struct bio_map_data *bmd = kmalloc(sizeof(*bmd), GFP_KERNEL); - - if (!bmd) - return NULL; - - bmd->iovecs = kmalloc(sizeof(struct bio_vec) * nr_segs, GFP_KERNEL); - if (bmd->iovecs) - return bmd; - - kfree(bmd); - return NULL; -} - -/** - * bio_uncopy_user - finish previously mapped bio - * @bio: bio being terminated - * - * Free pages allocated from bio_copy_user() and write back data - * to user space in case of a read. - */ -int bio_uncopy_user(struct bio *bio) -{ - struct bio_map_data *bmd = bio->bi_private; - const int read = bio_data_dir(bio) == READ; - struct bio_vec *bvec; - int i, ret = 0; - - __bio_for_each_segment(bvec, bio, i, 0) { - char *addr = page_address(bvec->bv_page); - unsigned int len = bmd->iovecs[i].bv_len; - - if (read && !ret && copy_to_user(bmd->userptr, addr, len)) - ret = -EFAULT; - - __free_page(bvec->bv_page); - bmd->userptr += len; - } - bio_free_map_data(bmd); - bio_put(bio); - return ret; -} - -/** - * bio_copy_user - copy user data to bio - * @q: destination block queue - * @uaddr: start of user address - * @len: length in bytes - * @write_to_vm: bool indicating writing to pages or not - * - * Prepares and returns a bio for indirect user io, bouncing data - * to/from kernel pages as necessary. Must be paired with - * call bio_uncopy_user() on io completion. - */ -struct bio *bio_copy_user(struct request_queue *q, unsigned long uaddr, - unsigned int len, int write_to_vm) -{ - unsigned long end = (uaddr + len + PAGE_SIZE - 1) >> PAGE_SHIFT; - unsigned long start = uaddr >> PAGE_SHIFT; - struct bio_map_data *bmd; - struct bio_vec *bvec; - struct page *page; - struct bio *bio; - int i, ret; - - bmd = bio_alloc_map_data(end - start); - if (!bmd) - return ERR_PTR(-ENOMEM); - - bmd->userptr = (void __user *) uaddr; - - ret = -ENOMEM; - bio = bio_alloc_bioset(GFP_KERNEL, end - start, blk_bio_set); - if (!bio) - goto out_bmd; - - bio->bi_rw |= (!write_to_vm << BIO_RW); - bio->bi_destructor = bio_blk_destructor; - - ret = 0; - while (len) { - unsigned int bytes = PAGE_SIZE; - - if (bytes > len) - bytes = len; - - page = alloc_page(q->bounce_gfp | GFP_KERNEL); - if (!page) { - ret = -ENOMEM; - break; - } - - if (bio_add_pc_page(q, bio, page, bytes, 0) < bytes) - break; - - len -= bytes; - } - - if (ret) - goto cleanup; - - /* - * success - */ - if (!write_to_vm) { - char __user *p = (char __user *) uaddr; - - /* - * for a write, copy in data to kernel pages - */ - ret = -EFAULT; - bio_for_each_segment(bvec, bio, i) { - char *addr = page_address(bvec->bv_page); - - if (copy_from_user(addr, p, bvec->bv_len)) - goto cleanup; - p += bvec->bv_len; - } - } - - bio_set_map_data(bmd, bio); - return bio; -cleanup: - bio_for_each_segment(bvec, bio, i) - __free_page(bvec->bv_page); - - bio_put(bio); -out_bmd: - bio_free_map_data(bmd); - return ERR_PTR(ret); -} -#endif - static struct bio *__bio_map_user_iov(struct request_queue *q, struct bio_set *bs, struct sg_iovec *iov, int iov_count, int write_to_vm, -- 1.5.4.1