Ejemplo n.º 1
0
static int blk_do_rq(request_queue_t *q, struct block_device *bdev, 
		     struct request *rq)
{
	char sense[SCSI_SENSE_BUFFERSIZE];
	DECLARE_COMPLETION(wait);
	int err = 0;

	rq->rq_disk = bdev->bd_disk;

	/*
	 * we need an extra reference to the request, so we can look at
	 * it after io completion
	 */
	rq->ref_count++;

	if (!rq->sense) {
		memset(sense, 0, sizeof(sense));
		rq->sense = sense;
		rq->sense_len = 0;
	}

	rq->flags |= REQ_NOMERGE;
	rq->waiting = &wait;
	elv_add_request(q, rq, ELEVATOR_INSERT_BACK, 1);
	generic_unplug_device(q);
	wait_for_completion(&wait);

	if (rq->errors)
		err = -EIO;

	return err;
}
Ejemplo n.º 2
0
static int sync_request(struct page *page, struct block_device *bdev, int rw)
{
	struct bio bio;
	struct bio_vec bio_vec;
	struct completion complete;

	bio_init(&bio);
	bio.bi_io_vec = &bio_vec;
	bio_vec.bv_page = page;
	bio_vec.bv_len = PAGE_SIZE;
	bio_vec.bv_offset = 0;
	bio.bi_vcnt = 1;
	bio.bi_idx = 0;
	bio.bi_size = PAGE_SIZE;
	bio.bi_bdev = bdev;
	bio.bi_sector = page->index * (PAGE_SIZE >> 9);
	init_completion(&complete);
	bio.bi_private = &complete;
	bio.bi_end_io = request_complete;

	submit_bio(rw, &bio);
	generic_unplug_device(bdev_get_queue(bdev));
	wait_for_completion(&complete);
	return test_bit(BIO_UPTODATE, &bio.bi_flags) ? 0 : -EIO;
}
Ejemplo n.º 3
0
static int send_request(request_queue_t * q, struct bio *bio,
			struct block_device *bdev, struct tbio_interface *inter,
			int writing)
{
	struct request *rq;
	void *buffer = NULL;
	unsigned long start_time;
	int err;

	rq = blk_get_request(q, writing ? WRITE : READ, __GFP_WAIT);
	rq->cmd_len = inter->cmd_len;
	//printk("inter.cmd %s\n" , inter->cmd);
	if (copy_from_user(rq->cmd, inter->cmd, inter->cmd_len))
		goto out_request;
	//printk("tbio: rq->cmd : %s\n",rq->cmd);
	if (sizeof(rq->cmd) != inter->cmd_len)
		memset(rq->cmd + inter->cmd_len, 0,
		       sizeof(rq->cmd) - inter->cmd_len);

	rq->bio = rq->biotail = NULL;

	blk_rq_bio_prep(q, rq, bio);

	rq->data = buffer;
	rq->data_len = inter->data_len;

	rq->timeout = 0;
	if (!rq->timeout)
		rq->timeout = q->sg_timeout;
	if (!rq->timeout)
		rq->timeout = BLK_DEFAULT_TIMEOUT;

	start_time = jiffies;

	DECLARE_COMPLETION(wait);

	rq->rq_disk = bdev->bd_disk;

	rq->waiting = &wait;
	elv_add_request(q, rq, 1, 1);
	generic_unplug_device(q);
	wait_for_completion(&wait);
	//printk("tbio: completion\n");
	if (rq->errors) {
		err = -EIO;
		printk("tbio: rq->errors\n");
		return err;
	}

	blk_put_request(rq);

	return 0;
out_request:
	blk_put_request(rq);
	return -EFAULT;

}
Ejemplo n.º 4
0
static void td_device_queue_unplug(struct request_queue *q)
{
	/* struct dimsum_device *ds = q->queuedata; */

#ifdef queue_flag_clear_unlocked 
	queue_flag_clear_unlocked(QUEUE_FLAG_PLUGGED, q);
#else
	generic_unplug_device(q);
#endif
	/* blk_run_address_space(ds->dimsum_backing_file->f_mapping); */
}