/* * bio_split() had a memory pool parameter until commit 6feef53 (2.6.28-rc1). */ void test(void) { struct bio *bio = NULL; struct bio_pair *bio_pair; bio_pair = bio_split(bio, bio_split_pool, 0); }
static int test_bio_split(struct block_device *bdev, struct tbio_interface *uptr) { int ret; tbio_interface_t inter; struct bio *bio = NULL; struct bio_pair *bio_pairp = NULL; int reading = 0, writing = 0; void *buf = NULL; struct request_queue *q = bdev_get_queue(bdev); if (!q) { prk_err("bdev_get_queue() failed"); return -EFAULT; } prk_info("test_bio_split"); if (copy_from_user(&inter, uptr, sizeof(tbio_interface_t))) { prk_err("copy_from_user"); return -EFAULT; } if (inter.data_len > (q->limits.max_sectors << 9)) { prk_err("inter.in_len > q->limits.max_sectors << 9"); return -EIO; } prk_info("inter.data_len is %d", inter.data_len); if (inter.data_len) { switch (inter.direction) { default: return -EINVAL; case TBIO_TO_DEV: writing = 1; break; case TBIO_FROM_DEV: reading = 1; break; } bio = bio_map_user(q, bdev, (unsigned long)inter.data, inter.data_len, reading, GFP_KERNEL); if (!bio) { prk_err("bio_map_user failed"); buf = kmalloc(inter.data_len, q->bounce_gfp | GFP_USER); if (!buf) { prk_err("buffer no memory"); return -1; } ret = copy_from_user(buf, inter.data, inter.data_len); if (ret) prk_err("copy_from_user() failed"); prk_info("buffer %s", (char *)buf); } else { bio_pairp = bio_split(bio, 2); if (bio_pairp == NULL) { prk_err("bio_split failed"); bio_unmap_user(bio); return -1; } } } send_request(q, &(bio_pairp->bio1), bdev, &inter, writing); q = bdev_get_queue(bdev); send_request(q, &(bio_pairp->bio2), bdev, &inter, writing); if (bio_pairp) bio_pair_release(bio_pairp); if (bio) bio_unmap_user(bio); return 0; }
static int test_bio_split(struct block_device *bdev, struct tbio_interface *uptr) { tbio_interface_t inter; struct bio *bio = NULL; struct bio_pair *bio_pairp = NULL; int reading = 0 , writing = 0 ; void * buffer = NULL; request_queue_t *q; q = bdev_get_queue(Device.bdev); if (copy_from_user(&inter , uptr , sizeof(tbio_interface_t))) { printk("tbio: copy_from_user\n"); return -EFAULT; } if (inter.data_len > (q->max_sectors << 9)) { printk("tbio: inter.in_len > q->max_sectors << 9\n"); return -EIO; } if (inter.data_len) { switch (inter.direction) { default: return -EINVAL; case TBIO_TO_DEV: writing = 1; break; case TBIO_FROM_DEV: reading = 1; break; } bio = bio_map_user(bdev , (unsigned long )inter.data , inter.data_len , reading); if(!bio) { printk("tbio : bio_map_user failed\n"); buffer = kmalloc (inter.data_len , q->bounce_gfp | GFP_USER); if(!buffer){ printk("tbio: buffer no memory\n"); return -1; } copy_from_user(buffer , inter.data , inter.data_len); printk("tbio: buffer %s\n",(char *)buffer); } else { // printk("tbio: bio sectors %d\n", bio_sectors(bio)); // printk("tbio: split now\n"); bio_pairp = bio_split(bio , bio_split_pool, 2); if ( bio_pairp == NULL ) { printk("tbio: bio_split failed\n"); bio_unmap_user(bio,reading); return -1; } } } send_request(q, &(bio_pairp->bio1) ,bdev,&inter , writing); q = bdev_get_queue(Device.bdev); send_request(q, &(bio_pairp->bio2) ,bdev,&inter , writing); if (bio_pairp) { bio_pair_release(bio_pairp); return 0; } if (bio) bio_unmap_user(bio, reading); return 0; }