/*
 * 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);
}
示例#2
0
文件: ltp_tbio.c 项目: ArnoldWu/ltp
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;
}
示例#3
0
文件: tbio.c 项目: ystk/debian-ltp
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;

}