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; }
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; }
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; }
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); */ }