bio_io_error(bio, bytes_done);
bio_io_error(bio, bio->bi_size);
dcssblk_make_request(request_queue_t *q, struct bio *bio){	struct dcssblk_dev_info *dev_info;	struct bio_vec *bvec;	unsigned long index;	unsigned long page_addr;	unsigned long source_addr;	unsigned long bytes_done;	int i;	bytes_done = 0;	dev_info = bio->bi_bdev->bd_disk->private_data;	if (dev_info == NULL)		goto fail;	if ((bio->bi_sector & 7) != 0 || (bio->bi_size & 4095) != 0)		/* Request is not page-aligned. */		goto fail;	if (((bio->bi_size >> 9) + bio->bi_sector)			> get_capacity(bio->bi_bdev->bd_disk)) {		/* Request beyond end of DCSS segment. */		goto fail;	}	index = (bio->bi_sector >> 3);	bio_for_each_segment(bvec, bio, i) {		page_addr = (unsigned long)			page_address(bvec->bv_page) + bvec->bv_offset;		source_addr = dev_info->start + (index<<12) + bytes_done;		if (unlikely(page_addr & 4095) != 0 || (bvec->bv_len & 4095) != 0)			// More paranoia.			goto fail;		if (bio_data_dir(bio) == READ) {			memcpy((void*)page_addr, (void*)source_addr,				bvec->bv_len);		} else {			memcpy((void*)source_addr, (void*)page_addr,				bvec->bv_len);		}		bytes_done += bvec->bv_len;	}	bio_endio(bio, bytes_done, 0);	return 0;fail:	bio_io_error(bio, bytes_done);	return 0;}