2 #include <linux/blkdev.h>
3 #include <linux/cdrom.h>
4 #include <linux/hdreg.h>
5 #include <linux/module.h>
7 #include <scsi/scsi_ioctl.h>
11 int blktap_device_major;
13 #define dev_to_blktap(_dev) container_of(_dev, struct blktap, device)
16 blktap_device_open(struct block_device *bdev, fmode_t mode)
18 struct gendisk *disk = bdev->bd_disk;
19 struct blktap_device *tapdev = disk->private_data;
24 /* NB. we might have bounced a bd trylock by tapdisk. when
25 * failing for reasons not !tapdev, make sure to kick tapdisk
26 * out of destroy wait state again. */
32 blktap_device_release(struct gendisk *disk, fmode_t mode)
34 struct blktap_device *tapdev = disk->private_data;
35 struct block_device *bdev = bdget_disk(disk, 0);
36 struct blktap *tap = dev_to_blktap(tapdev);
40 if (!bdev->bd_openers) {
41 set_bit(BLKTAP_DEVICE_CLOSED, &tap->dev_inuse);
42 blktap_ring_kick_user(tap);
49 blktap_device_getgeo(struct block_device *bd, struct hd_geometry *hg)
51 /* We don't have real geometry info, but let's at least return
52 values consistent with the size of the device */
53 sector_t nsect = get_capacity(bd->bd_disk);
54 sector_t cylinders = nsect;
58 sector_div(cylinders, hg->heads * hg->sectors);
59 hg->cylinders = cylinders;
60 if ((sector_t)(hg->cylinders + 1) * hg->heads * hg->sectors < nsect)
61 hg->cylinders = 0xffff;
66 blktap_device_ioctl(struct block_device *bd, fmode_t mode,
67 unsigned command, unsigned long argument)
72 case CDROMMULTISESSION:
73 BTDBG("FIXME: support multisession CDs later\n");
74 for (i = 0; i < sizeof(struct cdrom_multisession); i++)
75 if (put_user(0, (char __user *)(argument + i)))
79 case SCSI_IOCTL_GET_IDLUN:
80 if (!access_ok(VERIFY_WRITE, argument,
81 sizeof(struct scsi_idlun)))
84 /* return 0 for now. */
85 __put_user(0, &((struct scsi_idlun __user *)argument)->dev_id);
87 &((struct scsi_idlun __user *)argument)->host_unique_id);
91 /*printk(KERN_ALERT "ioctl %08x not supported by Xen blkdev\n",
93 return -EINVAL; /* same return as native Linux */
99 static const struct block_device_operations blktap_device_file_operations = {
100 .owner = THIS_MODULE,
101 .open = blktap_device_open,
102 .release = blktap_device_release,
103 .ioctl = blktap_device_ioctl,
104 .getgeo = blktap_device_getgeo
107 /* NB. __blktap holding the queue lock; blktap where unlocked */
109 static inline struct request*
110 __blktap_next_queued_rq(struct request_queue *q)
112 return blk_peek_request(q);
116 __blktap_dequeue_rq(struct request *rq)
118 blk_start_request(rq);
121 /* NB. err == 0 indicates success, failures < 0 */
124 __blktap_end_queued_rq(struct request *rq, int err)
126 blk_start_request(rq);
127 __blk_end_request(rq, err, blk_rq_bytes(rq));
131 __blktap_end_rq(struct request *rq, int err)
133 __blk_end_request(rq, err, blk_rq_bytes(rq));
137 blktap_end_rq(struct request *rq, int err)
139 struct request_queue *q = rq->q;
141 spin_lock_irq(q->queue_lock);
142 __blktap_end_rq(rq, err);
143 spin_unlock_irq(q->queue_lock);
147 blktap_device_end_request(struct blktap *tap,
148 struct blktap_request *request,
151 struct blktap_device *tapdev = &tap->device;
152 struct request *rq = request->rq;
154 blktap_ring_unmap_request(tap, request);
156 blktap_ring_free_request(tap, request);
158 dev_dbg(disk_to_dev(tapdev->gd),
159 "end_request: op=%d error=%d bytes=%d\n",
160 rq_data_dir(rq), error, blk_rq_bytes(rq));
162 blktap_end_rq(rq, error);
166 blktap_device_make_request(struct blktap *tap, struct request *rq)
168 struct blktap_device *tapdev = &tap->device;
169 struct blktap_request *request;
173 request = blktap_ring_make_request(tap);
174 if (IS_ERR(request)) {
175 err = PTR_ERR(request);
178 if (err == -ENOSPC || err == -ENOMEM)
184 write = rq_data_dir(rq) == WRITE;
185 nsegs = blk_rq_map_sg(rq->q, rq, request->sg_table);
187 dev_dbg(disk_to_dev(tapdev->gd),
188 "make_request: op=%c bytes=%d nsegs=%d\n",
189 write ? 'w' : 'r', blk_rq_bytes(rq), nsegs);
192 request->operation = write ? BLKIF_OP_WRITE : BLKIF_OP_READ;
193 if (unlikely(rq->cmd_type == REQ_TYPE_BLOCK_PC))
194 request->operation = BLKIF_OP_PACKET;
196 err = blktap_request_get_pages(tap, request, nsegs);
200 err = blktap_ring_map_request(tap, request);
204 blktap_ring_submit_request(tap, request);
209 tap->stats.st_oo_req++;
214 blktap_ring_free_request(tap, request);
218 if (printk_ratelimit())
219 dev_warn(disk_to_dev(tapdev->gd),
220 "make request: %d, failing\n", err);
225 * called from tapdisk context
228 blktap_device_run_queue(struct blktap *tap)
230 struct blktap_device *tapdev = &tap->device;
231 struct request_queue *q;
238 q = tapdev->gd->queue;
240 spin_lock_irq(&tapdev->lock);
241 queue_flag_clear(QUEUE_FLAG_STOPPED, q);
244 rq = __blktap_next_queued_rq(q);
248 if (rq->cmd_type != REQ_TYPE_FS) {
249 rq->errors = (DID_ERROR << 16) |
250 (DRIVER_INVALID << 24);
251 __blktap_end_queued_rq(rq, -EOPNOTSUPP);
255 spin_unlock_irq(&tapdev->lock);
257 err = blktap_device_make_request(tap, rq);
259 spin_lock_irq(&tapdev->lock);
266 __blktap_dequeue_rq(rq);
269 __blktap_end_rq(rq, err);
272 spin_unlock_irq(&tapdev->lock);
276 blktap_device_do_request(struct request_queue *rq)
278 struct blktap_device *tapdev = rq->queuedata;
279 struct blktap *tap = dev_to_blktap(tapdev);
281 blktap_ring_kick_user(tap);
285 blktap_device_configure(struct blktap *tap,
286 struct blktap_params *params)
288 struct request_queue *rq;
289 struct blktap_device *dev = &tap->device;
294 spin_lock_irq(&dev->lock);
296 set_capacity(dev->gd, params->capacity);
298 /* Hard sector size and max sectors impersonate the equiv. hardware. */
299 blk_queue_logical_block_size(rq, params->sector_size);
300 blk_queue_max_hw_sectors(rq, 512);
302 /* Each segment in a request is up to an aligned page in size. */
303 blk_queue_segment_boundary(rq, PAGE_SIZE - 1);
304 blk_queue_max_segment_size(rq, PAGE_SIZE);
306 /* Ensure a merged request will fit in a single I/O ring slot. */
307 blk_queue_max_segments(rq, BLKIF_MAX_SEGMENTS_PER_REQUEST);
309 /* Make sure buffer addresses are sector-aligned. */
310 blk_queue_dma_alignment(rq, 511);
312 spin_unlock_irq(&dev->lock);
316 blktap_device_validate_params(struct blktap *tap,
317 struct blktap_params *params)
319 struct device *dev = tap->ring.dev;
320 int sector_order, name_sz;
322 sector_order = ffs(params->sector_size) - 1;
324 if (sector_order < 9 ||
326 params->sector_size != 1U<<sector_order)
329 if (!params->capacity ||
330 (params->capacity > ULLONG_MAX >> sector_order))
333 name_sz = min(sizeof(params->name), sizeof(tap->name));
334 if (strnlen(params->name, name_sz) >= name_sz)
340 params->name[name_sz-1] = 0;
341 dev_err(dev, "capacity: %llu, sector-size: %lu, name: %s\n",
342 params->capacity, params->sector_size, params->name);
347 blktap_device_destroy(struct blktap *tap)
349 struct blktap_device *tapdev = &tap->device;
350 struct block_device *bdev;
358 bdev = bdget_disk(gd, 0);
360 err = !mutex_trylock(&bdev->bd_mutex);
362 /* NB. avoid a deadlock. the last opener syncs the
363 * bdev holding bd_mutex. */
368 if (bdev->bd_openers) {
374 gd->private_data = NULL;
376 blk_cleanup_queue(gd->queue);
381 clear_bit(BLKTAP_DEVICE, &tap->dev_inuse);
384 mutex_unlock(&bdev->bd_mutex);
392 blktap_device_fail_queue(struct blktap *tap)
394 struct blktap_device *tapdev = &tap->device;
395 struct request_queue *q = tapdev->gd->queue;
397 spin_lock_irq(&tapdev->lock);
398 queue_flag_clear(QUEUE_FLAG_STOPPED, q);
401 struct request *rq = __blktap_next_queued_rq(q);
405 __blktap_end_queued_rq(rq, -EIO);
408 spin_unlock_irq(&tapdev->lock);
412 blktap_device_try_destroy(struct blktap *tap)
416 err = blktap_device_destroy(tap);
418 blktap_device_fail_queue(tap);
424 blktap_device_destroy_sync(struct blktap *tap)
426 wait_event(tap->ring.poll_wait,
427 !blktap_device_try_destroy(tap));
430 static char *blktap_devnode(struct gendisk *gd, umode_t *mode)
432 return kasprintf(GFP_KERNEL, BLKTAP2_DEV_DIR "tapdev%u",
437 blktap_device_create(struct blktap *tap, struct blktap_params *params)
441 struct request_queue *rq;
442 struct blktap_device *tapdev;
446 tapdev = &tap->device;
449 if (test_bit(BLKTAP_DEVICE, &tap->dev_inuse))
452 if (blktap_device_validate_params(tap, params))
462 sprintf(gd->disk_name, "td%c", 'a' + minor % 26);
463 } else if (minor < (26 + 1) * 26) {
464 sprintf(gd->disk_name, "td%c%c",
465 'a' + minor / 26 - 1,'a' + minor % 26);
467 const unsigned int m1 = (minor / 26 - 1) / 26 - 1;
468 const unsigned int m2 = (minor / 26 - 1) % 26;
469 const unsigned int m3 = minor % 26;
470 sprintf(gd->disk_name, "td%c%c%c",
471 'a' + m1, 'a' + m2, 'a' + m3);
474 gd->major = blktap_device_major;
475 gd->first_minor = minor;
476 gd->devnode = blktap_devnode;
477 gd->fops = &blktap_device_file_operations;
478 gd->private_data = tapdev;
480 spin_lock_init(&tapdev->lock);
481 rq = blk_init_queue(blktap_device_do_request, &tapdev->lock);
486 elevator_init(rq, "noop");
489 rq->queuedata = tapdev;
492 blktap_device_configure(tap, params);
495 strlcpy(tap->name, params->name, ARRAY_SIZE(tap->name));
497 set_bit(BLKTAP_DEVICE, &tap->dev_inuse);
499 dev_info(disk_to_dev(gd), "sector-size: %u capacity: %llu\n",
500 queue_logical_block_size(rq),
501 (unsigned long long)get_capacity(gd));
509 blk_cleanup_queue(rq);
515 blktap_device_debug(struct blktap *tap, char *buf, size_t size)
517 struct gendisk *disk = tap->device.gd;
518 struct request_queue *q;
519 struct block_device *bdev;
520 char *s = buf, *end = buf + size;
527 s += snprintf(s, end - s,
528 "disk capacity:%llu sector size:%u\n",
529 (unsigned long long)get_capacity(disk),
530 queue_logical_block_size(q));
532 s += snprintf(s, end - s,
533 "queue flags:%#lx stopped:%d\n",
535 blk_queue_stopped(q));
537 bdev = bdget_disk(disk, 0);
539 s += snprintf(s, end - s,
540 "bdev openers:%d closed:%d\n",
542 test_bit(BLKTAP_DEVICE_CLOSED, &tap->dev_inuse));
554 /* Dynamically allocate a major for this device */
555 major = register_blkdev(0, "tapdev");
557 BTERR("Couldn't register blktap device\n");
561 blktap_device_major = major;
562 BTINFO("blktap device major %d\n", major);
568 blktap_device_exit(void)
570 if (blktap_device_major)
571 unregister_blkdev(blktap_device_major, "tapdev");