Merge git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-2.6-nmw
[pandora-kernel.git] / drivers / block / virtio_blk.c
1 //#define DEBUG
2 #include <linux/spinlock.h>
3 #include <linux/slab.h>
4 #include <linux/blkdev.h>
5 #include <linux/smp_lock.h>
6 #include <linux/hdreg.h>
7 #include <linux/virtio.h>
8 #include <linux/virtio_blk.h>
9 #include <linux/scatterlist.h>
10
11 #define PART_BITS 4
12
13 static int major, index;
14
15 struct virtio_blk
16 {
17         spinlock_t lock;
18
19         struct virtio_device *vdev;
20         struct virtqueue *vq;
21
22         /* The disk structure for the kernel. */
23         struct gendisk *disk;
24
25         /* Request tracking. */
26         struct list_head reqs;
27
28         mempool_t *pool;
29
30         /* What host tells us, plus 2 for header & tailer. */
31         unsigned int sg_elems;
32
33         /* Scatterlist: can be too big for stack. */
34         struct scatterlist sg[/*sg_elems*/];
35 };
36
37 struct virtblk_req
38 {
39         struct list_head list;
40         struct request *req;
41         struct virtio_blk_outhdr out_hdr;
42         struct virtio_scsi_inhdr in_hdr;
43         u8 status;
44 };
45
46 static void blk_done(struct virtqueue *vq)
47 {
48         struct virtio_blk *vblk = vq->vdev->priv;
49         struct virtblk_req *vbr;
50         unsigned int len;
51         unsigned long flags;
52
53         spin_lock_irqsave(&vblk->lock, flags);
54         while ((vbr = virtqueue_get_buf(vblk->vq, &len)) != NULL) {
55                 int error;
56
57                 switch (vbr->status) {
58                 case VIRTIO_BLK_S_OK:
59                         error = 0;
60                         break;
61                 case VIRTIO_BLK_S_UNSUPP:
62                         error = -ENOTTY;
63                         break;
64                 default:
65                         error = -EIO;
66                         break;
67                 }
68
69                 switch (vbr->req->cmd_type) {
70                 case REQ_TYPE_BLOCK_PC:
71                         vbr->req->resid_len = vbr->in_hdr.residual;
72                         vbr->req->sense_len = vbr->in_hdr.sense_len;
73                         vbr->req->errors = vbr->in_hdr.errors;
74                         break;
75                 case REQ_TYPE_SPECIAL:
76                         vbr->req->errors = (error != 0);
77                         break;
78                 default:
79                         break;
80                 }
81
82                 __blk_end_request_all(vbr->req, error);
83                 list_del(&vbr->list);
84                 mempool_free(vbr, vblk->pool);
85         }
86         /* In case queue is stopped waiting for more buffers. */
87         blk_start_queue(vblk->disk->queue);
88         spin_unlock_irqrestore(&vblk->lock, flags);
89 }
90
91 static bool do_req(struct request_queue *q, struct virtio_blk *vblk,
92                    struct request *req)
93 {
94         unsigned long num, out = 0, in = 0;
95         struct virtblk_req *vbr;
96
97         vbr = mempool_alloc(vblk->pool, GFP_ATOMIC);
98         if (!vbr)
99                 /* When another request finishes we'll try again. */
100                 return false;
101
102         vbr->req = req;
103
104         if (req->cmd_flags & REQ_FLUSH) {
105                 vbr->out_hdr.type = VIRTIO_BLK_T_FLUSH;
106                 vbr->out_hdr.sector = 0;
107                 vbr->out_hdr.ioprio = req_get_ioprio(vbr->req);
108         } else {
109                 switch (req->cmd_type) {
110                 case REQ_TYPE_FS:
111                         vbr->out_hdr.type = 0;
112                         vbr->out_hdr.sector = blk_rq_pos(vbr->req);
113                         vbr->out_hdr.ioprio = req_get_ioprio(vbr->req);
114                         break;
115                 case REQ_TYPE_BLOCK_PC:
116                         vbr->out_hdr.type = VIRTIO_BLK_T_SCSI_CMD;
117                         vbr->out_hdr.sector = 0;
118                         vbr->out_hdr.ioprio = req_get_ioprio(vbr->req);
119                         break;
120                 case REQ_TYPE_SPECIAL:
121                         vbr->out_hdr.type = VIRTIO_BLK_T_GET_ID;
122                         vbr->out_hdr.sector = 0;
123                         vbr->out_hdr.ioprio = req_get_ioprio(vbr->req);
124                         break;
125                 default:
126                         /* We don't put anything else in the queue. */
127                         BUG();
128                 }
129         }
130
131         if (vbr->req->cmd_flags & REQ_HARDBARRIER)
132                 vbr->out_hdr.type |= VIRTIO_BLK_T_BARRIER;
133
134         sg_set_buf(&vblk->sg[out++], &vbr->out_hdr, sizeof(vbr->out_hdr));
135
136         /*
137          * If this is a packet command we need a couple of additional headers.
138          * Behind the normal outhdr we put a segment with the scsi command
139          * block, and before the normal inhdr we put the sense data and the
140          * inhdr with additional status information before the normal inhdr.
141          */
142         if (vbr->req->cmd_type == REQ_TYPE_BLOCK_PC)
143                 sg_set_buf(&vblk->sg[out++], vbr->req->cmd, vbr->req->cmd_len);
144
145         num = blk_rq_map_sg(q, vbr->req, vblk->sg + out);
146
147         if (vbr->req->cmd_type == REQ_TYPE_BLOCK_PC) {
148                 sg_set_buf(&vblk->sg[num + out + in++], vbr->req->sense, 96);
149                 sg_set_buf(&vblk->sg[num + out + in++], &vbr->in_hdr,
150                            sizeof(vbr->in_hdr));
151         }
152
153         sg_set_buf(&vblk->sg[num + out + in++], &vbr->status,
154                    sizeof(vbr->status));
155
156         if (num) {
157                 if (rq_data_dir(vbr->req) == WRITE) {
158                         vbr->out_hdr.type |= VIRTIO_BLK_T_OUT;
159                         out += num;
160                 } else {
161                         vbr->out_hdr.type |= VIRTIO_BLK_T_IN;
162                         in += num;
163                 }
164         }
165
166         if (virtqueue_add_buf(vblk->vq, vblk->sg, out, in, vbr) < 0) {
167                 mempool_free(vbr, vblk->pool);
168                 return false;
169         }
170
171         list_add_tail(&vbr->list, &vblk->reqs);
172         return true;
173 }
174
175 static void do_virtblk_request(struct request_queue *q)
176 {
177         struct virtio_blk *vblk = q->queuedata;
178         struct request *req;
179         unsigned int issued = 0;
180
181         while ((req = blk_peek_request(q)) != NULL) {
182                 BUG_ON(req->nr_phys_segments + 2 > vblk->sg_elems);
183
184                 /* If this request fails, stop queue and wait for something to
185                    finish to restart it. */
186                 if (!do_req(q, vblk, req)) {
187                         blk_stop_queue(q);
188                         break;
189                 }
190                 blk_start_request(req);
191                 issued++;
192         }
193
194         if (issued)
195                 virtqueue_kick(vblk->vq);
196 }
197
198 /* return id (s/n) string for *disk to *id_str
199  */
200 static int virtblk_get_id(struct gendisk *disk, char *id_str)
201 {
202         struct virtio_blk *vblk = disk->private_data;
203         struct request *req;
204         struct bio *bio;
205         int err;
206
207         bio = bio_map_kern(vblk->disk->queue, id_str, VIRTIO_BLK_ID_BYTES,
208                            GFP_KERNEL);
209         if (IS_ERR(bio))
210                 return PTR_ERR(bio);
211
212         req = blk_make_request(vblk->disk->queue, bio, GFP_KERNEL);
213         if (IS_ERR(req)) {
214                 bio_put(bio);
215                 return PTR_ERR(req);
216         }
217
218         req->cmd_type = REQ_TYPE_SPECIAL;
219         err = blk_execute_rq(vblk->disk->queue, vblk->disk, req, false);
220         blk_put_request(req);
221
222         return err;
223 }
224
225 static int virtblk_locked_ioctl(struct block_device *bdev, fmode_t mode,
226                          unsigned cmd, unsigned long data)
227 {
228         struct gendisk *disk = bdev->bd_disk;
229         struct virtio_blk *vblk = disk->private_data;
230
231         /*
232          * Only allow the generic SCSI ioctls if the host can support it.
233          */
234         if (!virtio_has_feature(vblk->vdev, VIRTIO_BLK_F_SCSI))
235                 return -ENOTTY;
236
237         return scsi_cmd_ioctl(disk->queue, disk, mode, cmd,
238                               (void __user *)data);
239 }
240
241 static int virtblk_ioctl(struct block_device *bdev, fmode_t mode,
242                              unsigned int cmd, unsigned long param)
243 {
244         int ret;
245
246         lock_kernel();
247         ret = virtblk_locked_ioctl(bdev, mode, cmd, param);
248         unlock_kernel();
249
250         return ret;
251 }
252
253 /* We provide getgeo only to please some old bootloader/partitioning tools */
254 static int virtblk_getgeo(struct block_device *bd, struct hd_geometry *geo)
255 {
256         struct virtio_blk *vblk = bd->bd_disk->private_data;
257         struct virtio_blk_geometry vgeo;
258         int err;
259
260         /* see if the host passed in geometry config */
261         err = virtio_config_val(vblk->vdev, VIRTIO_BLK_F_GEOMETRY,
262                                 offsetof(struct virtio_blk_config, geometry),
263                                 &vgeo);
264
265         if (!err) {
266                 geo->heads = vgeo.heads;
267                 geo->sectors = vgeo.sectors;
268                 geo->cylinders = vgeo.cylinders;
269         } else {
270                 /* some standard values, similar to sd */
271                 geo->heads = 1 << 6;
272                 geo->sectors = 1 << 5;
273                 geo->cylinders = get_capacity(bd->bd_disk) >> 11;
274         }
275         return 0;
276 }
277
278 static const struct block_device_operations virtblk_fops = {
279         .ioctl  = virtblk_ioctl,
280         .owner  = THIS_MODULE,
281         .getgeo = virtblk_getgeo,
282 };
283
284 static int index_to_minor(int index)
285 {
286         return index << PART_BITS;
287 }
288
289 static ssize_t virtblk_serial_show(struct device *dev,
290                                 struct device_attribute *attr, char *buf)
291 {
292         struct gendisk *disk = dev_to_disk(dev);
293         int err;
294
295         /* sysfs gives us a PAGE_SIZE buffer */
296         BUILD_BUG_ON(PAGE_SIZE < VIRTIO_BLK_ID_BYTES);
297
298         buf[VIRTIO_BLK_ID_BYTES] = '\0';
299         err = virtblk_get_id(disk, buf);
300         if (!err)
301                 return strlen(buf);
302
303         if (err == -EIO) /* Unsupported? Make it empty. */
304                 return 0;
305
306         return err;
307 }
308 DEVICE_ATTR(serial, S_IRUGO, virtblk_serial_show, NULL);
309
310 static int __devinit virtblk_probe(struct virtio_device *vdev)
311 {
312         struct virtio_blk *vblk;
313         struct request_queue *q;
314         int err;
315         u64 cap;
316         u32 v, blk_size, sg_elems, opt_io_size;
317         u16 min_io_size;
318         u8 physical_block_exp, alignment_offset;
319
320         if (index_to_minor(index) >= 1 << MINORBITS)
321                 return -ENOSPC;
322
323         /* We need to know how many segments before we allocate. */
324         err = virtio_config_val(vdev, VIRTIO_BLK_F_SEG_MAX,
325                                 offsetof(struct virtio_blk_config, seg_max),
326                                 &sg_elems);
327
328         /* We need at least one SG element, whatever they say. */
329         if (err || !sg_elems)
330                 sg_elems = 1;
331
332         /* We need an extra sg elements at head and tail. */
333         sg_elems += 2;
334         vdev->priv = vblk = kmalloc(sizeof(*vblk) +
335                                     sizeof(vblk->sg[0]) * sg_elems, GFP_KERNEL);
336         if (!vblk) {
337                 err = -ENOMEM;
338                 goto out;
339         }
340
341         INIT_LIST_HEAD(&vblk->reqs);
342         spin_lock_init(&vblk->lock);
343         vblk->vdev = vdev;
344         vblk->sg_elems = sg_elems;
345         sg_init_table(vblk->sg, vblk->sg_elems);
346
347         /* We expect one virtqueue, for output. */
348         vblk->vq = virtio_find_single_vq(vdev, blk_done, "requests");
349         if (IS_ERR(vblk->vq)) {
350                 err = PTR_ERR(vblk->vq);
351                 goto out_free_vblk;
352         }
353
354         vblk->pool = mempool_create_kmalloc_pool(1,sizeof(struct virtblk_req));
355         if (!vblk->pool) {
356                 err = -ENOMEM;
357                 goto out_free_vq;
358         }
359
360         /* FIXME: How many partitions?  How long is a piece of string? */
361         vblk->disk = alloc_disk(1 << PART_BITS);
362         if (!vblk->disk) {
363                 err = -ENOMEM;
364                 goto out_mempool;
365         }
366
367         q = vblk->disk->queue = blk_init_queue(do_virtblk_request, &vblk->lock);
368         if (!q) {
369                 err = -ENOMEM;
370                 goto out_put_disk;
371         }
372
373         q->queuedata = vblk;
374
375         if (index < 26) {
376                 sprintf(vblk->disk->disk_name, "vd%c", 'a' + index % 26);
377         } else if (index < (26 + 1) * 26) {
378                 sprintf(vblk->disk->disk_name, "vd%c%c",
379                         'a' + index / 26 - 1, 'a' + index % 26);
380         } else {
381                 const unsigned int m1 = (index / 26 - 1) / 26 - 1;
382                 const unsigned int m2 = (index / 26 - 1) % 26;
383                 const unsigned int m3 =  index % 26;
384                 sprintf(vblk->disk->disk_name, "vd%c%c%c",
385                         'a' + m1, 'a' + m2, 'a' + m3);
386         }
387
388         vblk->disk->major = major;
389         vblk->disk->first_minor = index_to_minor(index);
390         vblk->disk->private_data = vblk;
391         vblk->disk->fops = &virtblk_fops;
392         vblk->disk->driverfs_dev = &vdev->dev;
393         index++;
394
395         if (virtio_has_feature(vdev, VIRTIO_BLK_F_FLUSH)) {
396                 /*
397                  * If the FLUSH feature is supported we do have support for
398                  * flushing a volatile write cache on the host.  Use that
399                  * to implement write barrier support.
400                  */
401                 blk_queue_ordered(q, QUEUE_ORDERED_DRAIN_FLUSH);
402         } else if (virtio_has_feature(vdev, VIRTIO_BLK_F_BARRIER)) {
403                 /*
404                  * If the BARRIER feature is supported the host expects us
405                  * to order request by tags.  This implies there is not
406                  * volatile write cache on the host, and that the host
407                  * never re-orders outstanding I/O.  This feature is not
408                  * useful for real life scenarious and deprecated.
409                  */
410                 blk_queue_ordered(q, QUEUE_ORDERED_TAG);
411         } else {
412                 /*
413                  * If the FLUSH feature is not supported we must assume that
414                  * the host does not perform any kind of volatile write
415                  * caching. We still need to drain the queue to provider
416                  * proper barrier semantics.
417                  */
418                 blk_queue_ordered(q, QUEUE_ORDERED_DRAIN);
419         }
420
421         /* If disk is read-only in the host, the guest should obey */
422         if (virtio_has_feature(vdev, VIRTIO_BLK_F_RO))
423                 set_disk_ro(vblk->disk, 1);
424
425         /* Host must always specify the capacity. */
426         vdev->config->get(vdev, offsetof(struct virtio_blk_config, capacity),
427                           &cap, sizeof(cap));
428
429         /* If capacity is too big, truncate with warning. */
430         if ((sector_t)cap != cap) {
431                 dev_warn(&vdev->dev, "Capacity %llu too large: truncating\n",
432                          (unsigned long long)cap);
433                 cap = (sector_t)-1;
434         }
435         set_capacity(vblk->disk, cap);
436
437         /* We can handle whatever the host told us to handle. */
438         blk_queue_max_segments(q, vblk->sg_elems-2);
439
440         /* No need to bounce any requests */
441         blk_queue_bounce_limit(q, BLK_BOUNCE_ANY);
442
443         /* No real sector limit. */
444         blk_queue_max_hw_sectors(q, -1U);
445
446         /* Host can optionally specify maximum segment size and number of
447          * segments. */
448         err = virtio_config_val(vdev, VIRTIO_BLK_F_SIZE_MAX,
449                                 offsetof(struct virtio_blk_config, size_max),
450                                 &v);
451         if (!err)
452                 blk_queue_max_segment_size(q, v);
453         else
454                 blk_queue_max_segment_size(q, -1U);
455
456         /* Host can optionally specify the block size of the device */
457         err = virtio_config_val(vdev, VIRTIO_BLK_F_BLK_SIZE,
458                                 offsetof(struct virtio_blk_config, blk_size),
459                                 &blk_size);
460         if (!err)
461                 blk_queue_logical_block_size(q, blk_size);
462         else
463                 blk_size = queue_logical_block_size(q);
464
465         /* Use topology information if available */
466         err = virtio_config_val(vdev, VIRTIO_BLK_F_TOPOLOGY,
467                         offsetof(struct virtio_blk_config, physical_block_exp),
468                         &physical_block_exp);
469         if (!err && physical_block_exp)
470                 blk_queue_physical_block_size(q,
471                                 blk_size * (1 << physical_block_exp));
472
473         err = virtio_config_val(vdev, VIRTIO_BLK_F_TOPOLOGY,
474                         offsetof(struct virtio_blk_config, alignment_offset),
475                         &alignment_offset);
476         if (!err && alignment_offset)
477                 blk_queue_alignment_offset(q, blk_size * alignment_offset);
478
479         err = virtio_config_val(vdev, VIRTIO_BLK_F_TOPOLOGY,
480                         offsetof(struct virtio_blk_config, min_io_size),
481                         &min_io_size);
482         if (!err && min_io_size)
483                 blk_queue_io_min(q, blk_size * min_io_size);
484
485         err = virtio_config_val(vdev, VIRTIO_BLK_F_TOPOLOGY,
486                         offsetof(struct virtio_blk_config, opt_io_size),
487                         &opt_io_size);
488         if (!err && opt_io_size)
489                 blk_queue_io_opt(q, blk_size * opt_io_size);
490
491
492         add_disk(vblk->disk);
493         err = device_create_file(disk_to_dev(vblk->disk), &dev_attr_serial);
494         if (err)
495                 goto out_del_disk;
496
497         return 0;
498
499 out_del_disk:
500         del_gendisk(vblk->disk);
501         blk_cleanup_queue(vblk->disk->queue);
502 out_put_disk:
503         put_disk(vblk->disk);
504 out_mempool:
505         mempool_destroy(vblk->pool);
506 out_free_vq:
507         vdev->config->del_vqs(vdev);
508 out_free_vblk:
509         kfree(vblk);
510 out:
511         return err;
512 }
513
514 static void __devexit virtblk_remove(struct virtio_device *vdev)
515 {
516         struct virtio_blk *vblk = vdev->priv;
517
518         /* Nothing should be pending. */
519         BUG_ON(!list_empty(&vblk->reqs));
520
521         /* Stop all the virtqueues. */
522         vdev->config->reset(vdev);
523
524         del_gendisk(vblk->disk);
525         blk_cleanup_queue(vblk->disk->queue);
526         put_disk(vblk->disk);
527         mempool_destroy(vblk->pool);
528         vdev->config->del_vqs(vdev);
529         kfree(vblk);
530 }
531
532 static const struct virtio_device_id id_table[] = {
533         { VIRTIO_ID_BLOCK, VIRTIO_DEV_ANY_ID },
534         { 0 },
535 };
536
537 static unsigned int features[] = {
538         VIRTIO_BLK_F_BARRIER, VIRTIO_BLK_F_SEG_MAX, VIRTIO_BLK_F_SIZE_MAX,
539         VIRTIO_BLK_F_GEOMETRY, VIRTIO_BLK_F_RO, VIRTIO_BLK_F_BLK_SIZE,
540         VIRTIO_BLK_F_SCSI, VIRTIO_BLK_F_FLUSH, VIRTIO_BLK_F_TOPOLOGY
541 };
542
543 /*
544  * virtio_blk causes spurious section mismatch warning by
545  * simultaneously referring to a __devinit and a __devexit function.
546  * Use __refdata to avoid this warning.
547  */
548 static struct virtio_driver __refdata virtio_blk = {
549         .feature_table = features,
550         .feature_table_size = ARRAY_SIZE(features),
551         .driver.name =  KBUILD_MODNAME,
552         .driver.owner = THIS_MODULE,
553         .id_table =     id_table,
554         .probe =        virtblk_probe,
555         .remove =       __devexit_p(virtblk_remove),
556 };
557
558 static int __init init(void)
559 {
560         major = register_blkdev(0, "virtblk");
561         if (major < 0)
562                 return major;
563         return register_virtio_driver(&virtio_blk);
564 }
565
566 static void __exit fini(void)
567 {
568         unregister_blkdev(major, "virtblk");
569         unregister_virtio_driver(&virtio_blk);
570 }
571 module_init(init);
572 module_exit(fini);
573
574 MODULE_DEVICE_TABLE(virtio, id_table);
575 MODULE_DESCRIPTION("Virtio block driver");
576 MODULE_LICENSE("GPL");