xref: /openbmc/linux/drivers/block/virtio_blk.c (revision f6723b56)
1 //#define DEBUG
2 #include <linux/spinlock.h>
3 #include <linux/slab.h>
4 #include <linux/blkdev.h>
5 #include <linux/hdreg.h>
6 #include <linux/module.h>
7 #include <linux/mutex.h>
8 #include <linux/virtio.h>
9 #include <linux/virtio_blk.h>
10 #include <linux/scatterlist.h>
11 #include <linux/string_helpers.h>
12 #include <scsi/scsi_cmnd.h>
13 #include <linux/idr.h>
14 #include <linux/blk-mq.h>
15 #include <linux/numa.h>
16 
17 #define PART_BITS 4
18 
19 static int major;
20 static DEFINE_IDA(vd_index_ida);
21 
22 static struct workqueue_struct *virtblk_wq;
23 
24 struct virtio_blk
25 {
26 	struct virtio_device *vdev;
27 	struct virtqueue *vq;
28 	spinlock_t vq_lock;
29 
30 	/* The disk structure for the kernel. */
31 	struct gendisk *disk;
32 
33 	/* Process context for config space updates */
34 	struct work_struct config_work;
35 
36 	/* Lock for config space updates */
37 	struct mutex config_lock;
38 
39 	/* enable config space updates */
40 	bool config_enable;
41 
42 	/* What host tells us, plus 2 for header & tailer. */
43 	unsigned int sg_elems;
44 
45 	/* Ida index - used to track minor number allocations. */
46 	int index;
47 };
48 
49 struct virtblk_req
50 {
51 	struct request *req;
52 	struct virtio_blk_outhdr out_hdr;
53 	struct virtio_scsi_inhdr in_hdr;
54 	u8 status;
55 	struct scatterlist sg[];
56 };
57 
58 static inline int virtblk_result(struct virtblk_req *vbr)
59 {
60 	switch (vbr->status) {
61 	case VIRTIO_BLK_S_OK:
62 		return 0;
63 	case VIRTIO_BLK_S_UNSUPP:
64 		return -ENOTTY;
65 	default:
66 		return -EIO;
67 	}
68 }
69 
70 static int __virtblk_add_req(struct virtqueue *vq,
71 			     struct virtblk_req *vbr,
72 			     struct scatterlist *data_sg,
73 			     bool have_data)
74 {
75 	struct scatterlist hdr, status, cmd, sense, inhdr, *sgs[6];
76 	unsigned int num_out = 0, num_in = 0;
77 	int type = vbr->out_hdr.type & ~VIRTIO_BLK_T_OUT;
78 
79 	sg_init_one(&hdr, &vbr->out_hdr, sizeof(vbr->out_hdr));
80 	sgs[num_out++] = &hdr;
81 
82 	/*
83 	 * If this is a packet command we need a couple of additional headers.
84 	 * Behind the normal outhdr we put a segment with the scsi command
85 	 * block, and before the normal inhdr we put the sense data and the
86 	 * inhdr with additional status information.
87 	 */
88 	if (type == VIRTIO_BLK_T_SCSI_CMD) {
89 		sg_init_one(&cmd, vbr->req->cmd, vbr->req->cmd_len);
90 		sgs[num_out++] = &cmd;
91 	}
92 
93 	if (have_data) {
94 		if (vbr->out_hdr.type & VIRTIO_BLK_T_OUT)
95 			sgs[num_out++] = data_sg;
96 		else
97 			sgs[num_out + num_in++] = data_sg;
98 	}
99 
100 	if (type == VIRTIO_BLK_T_SCSI_CMD) {
101 		sg_init_one(&sense, vbr->req->sense, SCSI_SENSE_BUFFERSIZE);
102 		sgs[num_out + num_in++] = &sense;
103 		sg_init_one(&inhdr, &vbr->in_hdr, sizeof(vbr->in_hdr));
104 		sgs[num_out + num_in++] = &inhdr;
105 	}
106 
107 	sg_init_one(&status, &vbr->status, sizeof(vbr->status));
108 	sgs[num_out + num_in++] = &status;
109 
110 	return virtqueue_add_sgs(vq, sgs, num_out, num_in, vbr, GFP_ATOMIC);
111 }
112 
113 static inline void virtblk_request_done(struct request *req)
114 {
115 	struct virtblk_req *vbr = req->special;
116 	int error = virtblk_result(vbr);
117 
118 	if (req->cmd_type == REQ_TYPE_BLOCK_PC) {
119 		req->resid_len = vbr->in_hdr.residual;
120 		req->sense_len = vbr->in_hdr.sense_len;
121 		req->errors = vbr->in_hdr.errors;
122 	} else if (req->cmd_type == REQ_TYPE_SPECIAL) {
123 		req->errors = (error != 0);
124 	}
125 
126 	blk_mq_end_io(req, error);
127 }
128 
129 static void virtblk_done(struct virtqueue *vq)
130 {
131 	struct virtio_blk *vblk = vq->vdev->priv;
132 	bool req_done = false;
133 	struct virtblk_req *vbr;
134 	unsigned long flags;
135 	unsigned int len;
136 
137 	spin_lock_irqsave(&vblk->vq_lock, flags);
138 	do {
139 		virtqueue_disable_cb(vq);
140 		while ((vbr = virtqueue_get_buf(vblk->vq, &len)) != NULL) {
141 			blk_mq_complete_request(vbr->req);
142 			req_done = true;
143 		}
144 		if (unlikely(virtqueue_is_broken(vq)))
145 			break;
146 	} while (!virtqueue_enable_cb(vq));
147 	spin_unlock_irqrestore(&vblk->vq_lock, flags);
148 
149 	/* In case queue is stopped waiting for more buffers. */
150 	if (req_done)
151 		blk_mq_start_stopped_hw_queues(vblk->disk->queue);
152 }
153 
154 static int virtio_queue_rq(struct blk_mq_hw_ctx *hctx, struct request *req)
155 {
156 	struct virtio_blk *vblk = hctx->queue->queuedata;
157 	struct virtblk_req *vbr = req->special;
158 	unsigned long flags;
159 	unsigned int num;
160 	const bool last = (req->cmd_flags & REQ_END) != 0;
161 
162 	BUG_ON(req->nr_phys_segments + 2 > vblk->sg_elems);
163 
164 	vbr->req = req;
165 	if (req->cmd_flags & REQ_FLUSH) {
166 		vbr->out_hdr.type = VIRTIO_BLK_T_FLUSH;
167 		vbr->out_hdr.sector = 0;
168 		vbr->out_hdr.ioprio = req_get_ioprio(vbr->req);
169 	} else {
170 		switch (req->cmd_type) {
171 		case REQ_TYPE_FS:
172 			vbr->out_hdr.type = 0;
173 			vbr->out_hdr.sector = blk_rq_pos(vbr->req);
174 			vbr->out_hdr.ioprio = req_get_ioprio(vbr->req);
175 			break;
176 		case REQ_TYPE_BLOCK_PC:
177 			vbr->out_hdr.type = VIRTIO_BLK_T_SCSI_CMD;
178 			vbr->out_hdr.sector = 0;
179 			vbr->out_hdr.ioprio = req_get_ioprio(vbr->req);
180 			break;
181 		case REQ_TYPE_SPECIAL:
182 			vbr->out_hdr.type = VIRTIO_BLK_T_GET_ID;
183 			vbr->out_hdr.sector = 0;
184 			vbr->out_hdr.ioprio = req_get_ioprio(vbr->req);
185 			break;
186 		default:
187 			/* We don't put anything else in the queue. */
188 			BUG();
189 		}
190 	}
191 
192 	num = blk_rq_map_sg(hctx->queue, vbr->req, vbr->sg);
193 	if (num) {
194 		if (rq_data_dir(vbr->req) == WRITE)
195 			vbr->out_hdr.type |= VIRTIO_BLK_T_OUT;
196 		else
197 			vbr->out_hdr.type |= VIRTIO_BLK_T_IN;
198 	}
199 
200 	spin_lock_irqsave(&vblk->vq_lock, flags);
201 	if (__virtblk_add_req(vblk->vq, vbr, vbr->sg, num) < 0) {
202 		virtqueue_kick(vblk->vq);
203 		spin_unlock_irqrestore(&vblk->vq_lock, flags);
204 		blk_mq_stop_hw_queue(hctx);
205 		return BLK_MQ_RQ_QUEUE_BUSY;
206 	}
207 
208 	if (last)
209 		virtqueue_kick(vblk->vq);
210 
211 	spin_unlock_irqrestore(&vblk->vq_lock, flags);
212 	return BLK_MQ_RQ_QUEUE_OK;
213 }
214 
215 /* return id (s/n) string for *disk to *id_str
216  */
217 static int virtblk_get_id(struct gendisk *disk, char *id_str)
218 {
219 	struct virtio_blk *vblk = disk->private_data;
220 	struct request *req;
221 	struct bio *bio;
222 	int err;
223 
224 	bio = bio_map_kern(vblk->disk->queue, id_str, VIRTIO_BLK_ID_BYTES,
225 			   GFP_KERNEL);
226 	if (IS_ERR(bio))
227 		return PTR_ERR(bio);
228 
229 	req = blk_make_request(vblk->disk->queue, bio, GFP_KERNEL);
230 	if (IS_ERR(req)) {
231 		bio_put(bio);
232 		return PTR_ERR(req);
233 	}
234 
235 	req->cmd_type = REQ_TYPE_SPECIAL;
236 	err = blk_execute_rq(vblk->disk->queue, vblk->disk, req, false);
237 	blk_put_request(req);
238 
239 	return err;
240 }
241 
242 static int virtblk_ioctl(struct block_device *bdev, fmode_t mode,
243 			     unsigned int cmd, unsigned long data)
244 {
245 	struct gendisk *disk = bdev->bd_disk;
246 	struct virtio_blk *vblk = disk->private_data;
247 
248 	/*
249 	 * Only allow the generic SCSI ioctls if the host can support it.
250 	 */
251 	if (!virtio_has_feature(vblk->vdev, VIRTIO_BLK_F_SCSI))
252 		return -ENOTTY;
253 
254 	return scsi_cmd_blk_ioctl(bdev, mode, cmd,
255 				  (void __user *)data);
256 }
257 
258 /* We provide getgeo only to please some old bootloader/partitioning tools */
259 static int virtblk_getgeo(struct block_device *bd, struct hd_geometry *geo)
260 {
261 	struct virtio_blk *vblk = bd->bd_disk->private_data;
262 
263 	/* see if the host passed in geometry config */
264 	if (virtio_has_feature(vblk->vdev, VIRTIO_BLK_F_GEOMETRY)) {
265 		virtio_cread(vblk->vdev, struct virtio_blk_config,
266 			     geometry.cylinders, &geo->cylinders);
267 		virtio_cread(vblk->vdev, struct virtio_blk_config,
268 			     geometry.heads, &geo->heads);
269 		virtio_cread(vblk->vdev, struct virtio_blk_config,
270 			     geometry.sectors, &geo->sectors);
271 	} else {
272 		/* some standard values, similar to sd */
273 		geo->heads = 1 << 6;
274 		geo->sectors = 1 << 5;
275 		geo->cylinders = get_capacity(bd->bd_disk) >> 11;
276 	}
277 	return 0;
278 }
279 
280 static const struct block_device_operations virtblk_fops = {
281 	.ioctl  = virtblk_ioctl,
282 	.owner  = THIS_MODULE,
283 	.getgeo = virtblk_getgeo,
284 };
285 
286 static int index_to_minor(int index)
287 {
288 	return index << PART_BITS;
289 }
290 
291 static int minor_to_index(int minor)
292 {
293 	return minor >> PART_BITS;
294 }
295 
296 static ssize_t virtblk_serial_show(struct device *dev,
297 				struct device_attribute *attr, char *buf)
298 {
299 	struct gendisk *disk = dev_to_disk(dev);
300 	int err;
301 
302 	/* sysfs gives us a PAGE_SIZE buffer */
303 	BUILD_BUG_ON(PAGE_SIZE < VIRTIO_BLK_ID_BYTES);
304 
305 	buf[VIRTIO_BLK_ID_BYTES] = '\0';
306 	err = virtblk_get_id(disk, buf);
307 	if (!err)
308 		return strlen(buf);
309 
310 	if (err == -EIO) /* Unsupported? Make it empty. */
311 		return 0;
312 
313 	return err;
314 }
315 DEVICE_ATTR(serial, S_IRUGO, virtblk_serial_show, NULL);
316 
317 static void virtblk_config_changed_work(struct work_struct *work)
318 {
319 	struct virtio_blk *vblk =
320 		container_of(work, struct virtio_blk, config_work);
321 	struct virtio_device *vdev = vblk->vdev;
322 	struct request_queue *q = vblk->disk->queue;
323 	char cap_str_2[10], cap_str_10[10];
324 	char *envp[] = { "RESIZE=1", NULL };
325 	u64 capacity, size;
326 
327 	mutex_lock(&vblk->config_lock);
328 	if (!vblk->config_enable)
329 		goto done;
330 
331 	/* Host must always specify the capacity. */
332 	virtio_cread(vdev, struct virtio_blk_config, capacity, &capacity);
333 
334 	/* If capacity is too big, truncate with warning. */
335 	if ((sector_t)capacity != capacity) {
336 		dev_warn(&vdev->dev, "Capacity %llu too large: truncating\n",
337 			 (unsigned long long)capacity);
338 		capacity = (sector_t)-1;
339 	}
340 
341 	size = capacity * queue_logical_block_size(q);
342 	string_get_size(size, STRING_UNITS_2, cap_str_2, sizeof(cap_str_2));
343 	string_get_size(size, STRING_UNITS_10, cap_str_10, sizeof(cap_str_10));
344 
345 	dev_notice(&vdev->dev,
346 		  "new size: %llu %d-byte logical blocks (%s/%s)\n",
347 		  (unsigned long long)capacity,
348 		  queue_logical_block_size(q),
349 		  cap_str_10, cap_str_2);
350 
351 	set_capacity(vblk->disk, capacity);
352 	revalidate_disk(vblk->disk);
353 	kobject_uevent_env(&disk_to_dev(vblk->disk)->kobj, KOBJ_CHANGE, envp);
354 done:
355 	mutex_unlock(&vblk->config_lock);
356 }
357 
358 static void virtblk_config_changed(struct virtio_device *vdev)
359 {
360 	struct virtio_blk *vblk = vdev->priv;
361 
362 	queue_work(virtblk_wq, &vblk->config_work);
363 }
364 
365 static int init_vq(struct virtio_blk *vblk)
366 {
367 	int err = 0;
368 
369 	/* We expect one virtqueue, for output. */
370 	vblk->vq = virtio_find_single_vq(vblk->vdev, virtblk_done, "requests");
371 	if (IS_ERR(vblk->vq))
372 		err = PTR_ERR(vblk->vq);
373 
374 	return err;
375 }
376 
377 /*
378  * Legacy naming scheme used for virtio devices.  We are stuck with it for
379  * virtio blk but don't ever use it for any new driver.
380  */
381 static int virtblk_name_format(char *prefix, int index, char *buf, int buflen)
382 {
383 	const int base = 'z' - 'a' + 1;
384 	char *begin = buf + strlen(prefix);
385 	char *end = buf + buflen;
386 	char *p;
387 	int unit;
388 
389 	p = end - 1;
390 	*p = '\0';
391 	unit = base;
392 	do {
393 		if (p == begin)
394 			return -EINVAL;
395 		*--p = 'a' + (index % unit);
396 		index = (index / unit) - 1;
397 	} while (index >= 0);
398 
399 	memmove(begin, p, end - p);
400 	memcpy(buf, prefix, strlen(prefix));
401 
402 	return 0;
403 }
404 
405 static int virtblk_get_cache_mode(struct virtio_device *vdev)
406 {
407 	u8 writeback;
408 	int err;
409 
410 	err = virtio_cread_feature(vdev, VIRTIO_BLK_F_CONFIG_WCE,
411 				   struct virtio_blk_config, wce,
412 				   &writeback);
413 	if (err)
414 		writeback = virtio_has_feature(vdev, VIRTIO_BLK_F_WCE);
415 
416 	return writeback;
417 }
418 
419 static void virtblk_update_cache_mode(struct virtio_device *vdev)
420 {
421 	u8 writeback = virtblk_get_cache_mode(vdev);
422 	struct virtio_blk *vblk = vdev->priv;
423 
424 	if (writeback)
425 		blk_queue_flush(vblk->disk->queue, REQ_FLUSH);
426 	else
427 		blk_queue_flush(vblk->disk->queue, 0);
428 
429 	revalidate_disk(vblk->disk);
430 }
431 
432 static const char *const virtblk_cache_types[] = {
433 	"write through", "write back"
434 };
435 
436 static ssize_t
437 virtblk_cache_type_store(struct device *dev, struct device_attribute *attr,
438 			 const char *buf, size_t count)
439 {
440 	struct gendisk *disk = dev_to_disk(dev);
441 	struct virtio_blk *vblk = disk->private_data;
442 	struct virtio_device *vdev = vblk->vdev;
443 	int i;
444 
445 	BUG_ON(!virtio_has_feature(vblk->vdev, VIRTIO_BLK_F_CONFIG_WCE));
446 	for (i = ARRAY_SIZE(virtblk_cache_types); --i >= 0; )
447 		if (sysfs_streq(buf, virtblk_cache_types[i]))
448 			break;
449 
450 	if (i < 0)
451 		return -EINVAL;
452 
453 	virtio_cwrite8(vdev, offsetof(struct virtio_blk_config, wce), i);
454 	virtblk_update_cache_mode(vdev);
455 	return count;
456 }
457 
458 static ssize_t
459 virtblk_cache_type_show(struct device *dev, struct device_attribute *attr,
460 			 char *buf)
461 {
462 	struct gendisk *disk = dev_to_disk(dev);
463 	struct virtio_blk *vblk = disk->private_data;
464 	u8 writeback = virtblk_get_cache_mode(vblk->vdev);
465 
466 	BUG_ON(writeback >= ARRAY_SIZE(virtblk_cache_types));
467 	return snprintf(buf, 40, "%s\n", virtblk_cache_types[writeback]);
468 }
469 
470 static const struct device_attribute dev_attr_cache_type_ro =
471 	__ATTR(cache_type, S_IRUGO,
472 	       virtblk_cache_type_show, NULL);
473 static const struct device_attribute dev_attr_cache_type_rw =
474 	__ATTR(cache_type, S_IRUGO|S_IWUSR,
475 	       virtblk_cache_type_show, virtblk_cache_type_store);
476 
477 static struct blk_mq_ops virtio_mq_ops = {
478 	.queue_rq	= virtio_queue_rq,
479 	.map_queue	= blk_mq_map_queue,
480 	.alloc_hctx	= blk_mq_alloc_single_hw_queue,
481 	.free_hctx	= blk_mq_free_single_hw_queue,
482 	.complete	= virtblk_request_done,
483 };
484 
485 static struct blk_mq_reg virtio_mq_reg = {
486 	.ops		= &virtio_mq_ops,
487 	.nr_hw_queues	= 1,
488 	.queue_depth	= 64,
489 	.numa_node	= NUMA_NO_NODE,
490 	.flags		= BLK_MQ_F_SHOULD_MERGE,
491 };
492 
493 static void virtblk_init_vbr(void *data, struct blk_mq_hw_ctx *hctx,
494 			     struct request *rq, unsigned int nr)
495 {
496 	struct virtio_blk *vblk = data;
497 	struct virtblk_req *vbr = rq->special;
498 
499 	sg_init_table(vbr->sg, vblk->sg_elems);
500 }
501 
502 static int virtblk_probe(struct virtio_device *vdev)
503 {
504 	struct virtio_blk *vblk;
505 	struct request_queue *q;
506 	int err, index;
507 
508 	u64 cap;
509 	u32 v, blk_size, sg_elems, opt_io_size;
510 	u16 min_io_size;
511 	u8 physical_block_exp, alignment_offset;
512 
513 	err = ida_simple_get(&vd_index_ida, 0, minor_to_index(1 << MINORBITS),
514 			     GFP_KERNEL);
515 	if (err < 0)
516 		goto out;
517 	index = err;
518 
519 	/* We need to know how many segments before we allocate. */
520 	err = virtio_cread_feature(vdev, VIRTIO_BLK_F_SEG_MAX,
521 				   struct virtio_blk_config, seg_max,
522 				   &sg_elems);
523 
524 	/* We need at least one SG element, whatever they say. */
525 	if (err || !sg_elems)
526 		sg_elems = 1;
527 
528 	/* We need an extra sg elements at head and tail. */
529 	sg_elems += 2;
530 	vdev->priv = vblk = kmalloc(sizeof(*vblk), GFP_KERNEL);
531 	if (!vblk) {
532 		err = -ENOMEM;
533 		goto out_free_index;
534 	}
535 
536 	vblk->vdev = vdev;
537 	vblk->sg_elems = sg_elems;
538 	mutex_init(&vblk->config_lock);
539 
540 	INIT_WORK(&vblk->config_work, virtblk_config_changed_work);
541 	vblk->config_enable = true;
542 
543 	err = init_vq(vblk);
544 	if (err)
545 		goto out_free_vblk;
546 	spin_lock_init(&vblk->vq_lock);
547 
548 	/* FIXME: How many partitions?  How long is a piece of string? */
549 	vblk->disk = alloc_disk(1 << PART_BITS);
550 	if (!vblk->disk) {
551 		err = -ENOMEM;
552 		goto out_free_vq;
553 	}
554 
555 	virtio_mq_reg.cmd_size =
556 		sizeof(struct virtblk_req) +
557 		sizeof(struct scatterlist) * sg_elems;
558 
559 	q = vblk->disk->queue = blk_mq_init_queue(&virtio_mq_reg, vblk);
560 	if (!q) {
561 		err = -ENOMEM;
562 		goto out_put_disk;
563 	}
564 
565 	blk_mq_init_commands(q, virtblk_init_vbr, vblk);
566 
567 	q->queuedata = vblk;
568 
569 	virtblk_name_format("vd", index, vblk->disk->disk_name, DISK_NAME_LEN);
570 
571 	vblk->disk->major = major;
572 	vblk->disk->first_minor = index_to_minor(index);
573 	vblk->disk->private_data = vblk;
574 	vblk->disk->fops = &virtblk_fops;
575 	vblk->disk->driverfs_dev = &vdev->dev;
576 	vblk->index = index;
577 
578 	/* configure queue flush support */
579 	virtblk_update_cache_mode(vdev);
580 
581 	/* If disk is read-only in the host, the guest should obey */
582 	if (virtio_has_feature(vdev, VIRTIO_BLK_F_RO))
583 		set_disk_ro(vblk->disk, 1);
584 
585 	/* Host must always specify the capacity. */
586 	virtio_cread(vdev, struct virtio_blk_config, capacity, &cap);
587 
588 	/* If capacity is too big, truncate with warning. */
589 	if ((sector_t)cap != cap) {
590 		dev_warn(&vdev->dev, "Capacity %llu too large: truncating\n",
591 			 (unsigned long long)cap);
592 		cap = (sector_t)-1;
593 	}
594 	set_capacity(vblk->disk, cap);
595 
596 	/* We can handle whatever the host told us to handle. */
597 	blk_queue_max_segments(q, vblk->sg_elems-2);
598 
599 	/* No need to bounce any requests */
600 	blk_queue_bounce_limit(q, BLK_BOUNCE_ANY);
601 
602 	/* No real sector limit. */
603 	blk_queue_max_hw_sectors(q, -1U);
604 
605 	/* Host can optionally specify maximum segment size and number of
606 	 * segments. */
607 	err = virtio_cread_feature(vdev, VIRTIO_BLK_F_SIZE_MAX,
608 				   struct virtio_blk_config, size_max, &v);
609 	if (!err)
610 		blk_queue_max_segment_size(q, v);
611 	else
612 		blk_queue_max_segment_size(q, -1U);
613 
614 	/* Host can optionally specify the block size of the device */
615 	err = virtio_cread_feature(vdev, VIRTIO_BLK_F_BLK_SIZE,
616 				   struct virtio_blk_config, blk_size,
617 				   &blk_size);
618 	if (!err)
619 		blk_queue_logical_block_size(q, blk_size);
620 	else
621 		blk_size = queue_logical_block_size(q);
622 
623 	/* Use topology information if available */
624 	err = virtio_cread_feature(vdev, VIRTIO_BLK_F_TOPOLOGY,
625 				   struct virtio_blk_config, physical_block_exp,
626 				   &physical_block_exp);
627 	if (!err && physical_block_exp)
628 		blk_queue_physical_block_size(q,
629 				blk_size * (1 << physical_block_exp));
630 
631 	err = virtio_cread_feature(vdev, VIRTIO_BLK_F_TOPOLOGY,
632 				   struct virtio_blk_config, alignment_offset,
633 				   &alignment_offset);
634 	if (!err && alignment_offset)
635 		blk_queue_alignment_offset(q, blk_size * alignment_offset);
636 
637 	err = virtio_cread_feature(vdev, VIRTIO_BLK_F_TOPOLOGY,
638 				   struct virtio_blk_config, min_io_size,
639 				   &min_io_size);
640 	if (!err && min_io_size)
641 		blk_queue_io_min(q, blk_size * min_io_size);
642 
643 	err = virtio_cread_feature(vdev, VIRTIO_BLK_F_TOPOLOGY,
644 				   struct virtio_blk_config, opt_io_size,
645 				   &opt_io_size);
646 	if (!err && opt_io_size)
647 		blk_queue_io_opt(q, blk_size * opt_io_size);
648 
649 	add_disk(vblk->disk);
650 	err = device_create_file(disk_to_dev(vblk->disk), &dev_attr_serial);
651 	if (err)
652 		goto out_del_disk;
653 
654 	if (virtio_has_feature(vdev, VIRTIO_BLK_F_CONFIG_WCE))
655 		err = device_create_file(disk_to_dev(vblk->disk),
656 					 &dev_attr_cache_type_rw);
657 	else
658 		err = device_create_file(disk_to_dev(vblk->disk),
659 					 &dev_attr_cache_type_ro);
660 	if (err)
661 		goto out_del_disk;
662 	return 0;
663 
664 out_del_disk:
665 	del_gendisk(vblk->disk);
666 	blk_cleanup_queue(vblk->disk->queue);
667 out_put_disk:
668 	put_disk(vblk->disk);
669 out_free_vq:
670 	vdev->config->del_vqs(vdev);
671 out_free_vblk:
672 	kfree(vblk);
673 out_free_index:
674 	ida_simple_remove(&vd_index_ida, index);
675 out:
676 	return err;
677 }
678 
679 static void virtblk_remove(struct virtio_device *vdev)
680 {
681 	struct virtio_blk *vblk = vdev->priv;
682 	int index = vblk->index;
683 	int refc;
684 
685 	/* Prevent config work handler from accessing the device. */
686 	mutex_lock(&vblk->config_lock);
687 	vblk->config_enable = false;
688 	mutex_unlock(&vblk->config_lock);
689 
690 	del_gendisk(vblk->disk);
691 	blk_cleanup_queue(vblk->disk->queue);
692 
693 	/* Stop all the virtqueues. */
694 	vdev->config->reset(vdev);
695 
696 	flush_work(&vblk->config_work);
697 
698 	refc = atomic_read(&disk_to_dev(vblk->disk)->kobj.kref.refcount);
699 	put_disk(vblk->disk);
700 	vdev->config->del_vqs(vdev);
701 	kfree(vblk);
702 
703 	/* Only free device id if we don't have any users */
704 	if (refc == 1)
705 		ida_simple_remove(&vd_index_ida, index);
706 }
707 
708 #ifdef CONFIG_PM_SLEEP
709 static int virtblk_freeze(struct virtio_device *vdev)
710 {
711 	struct virtio_blk *vblk = vdev->priv;
712 
713 	/* Ensure we don't receive any more interrupts */
714 	vdev->config->reset(vdev);
715 
716 	/* Prevent config work handler from accessing the device. */
717 	mutex_lock(&vblk->config_lock);
718 	vblk->config_enable = false;
719 	mutex_unlock(&vblk->config_lock);
720 
721 	flush_work(&vblk->config_work);
722 
723 	blk_mq_stop_hw_queues(vblk->disk->queue);
724 
725 	vdev->config->del_vqs(vdev);
726 	return 0;
727 }
728 
729 static int virtblk_restore(struct virtio_device *vdev)
730 {
731 	struct virtio_blk *vblk = vdev->priv;
732 	int ret;
733 
734 	vblk->config_enable = true;
735 	ret = init_vq(vdev->priv);
736 	if (!ret)
737 		blk_mq_start_stopped_hw_queues(vblk->disk->queue);
738 
739 	return ret;
740 }
741 #endif
742 
743 static const struct virtio_device_id id_table[] = {
744 	{ VIRTIO_ID_BLOCK, VIRTIO_DEV_ANY_ID },
745 	{ 0 },
746 };
747 
748 static unsigned int features[] = {
749 	VIRTIO_BLK_F_SEG_MAX, VIRTIO_BLK_F_SIZE_MAX, VIRTIO_BLK_F_GEOMETRY,
750 	VIRTIO_BLK_F_RO, VIRTIO_BLK_F_BLK_SIZE, VIRTIO_BLK_F_SCSI,
751 	VIRTIO_BLK_F_WCE, VIRTIO_BLK_F_TOPOLOGY, VIRTIO_BLK_F_CONFIG_WCE
752 };
753 
754 static struct virtio_driver virtio_blk = {
755 	.feature_table		= features,
756 	.feature_table_size	= ARRAY_SIZE(features),
757 	.driver.name		= KBUILD_MODNAME,
758 	.driver.owner		= THIS_MODULE,
759 	.id_table		= id_table,
760 	.probe			= virtblk_probe,
761 	.remove			= virtblk_remove,
762 	.config_changed		= virtblk_config_changed,
763 #ifdef CONFIG_PM_SLEEP
764 	.freeze			= virtblk_freeze,
765 	.restore		= virtblk_restore,
766 #endif
767 };
768 
769 static int __init init(void)
770 {
771 	int error;
772 
773 	virtblk_wq = alloc_workqueue("virtio-blk", 0, 0);
774 	if (!virtblk_wq)
775 		return -ENOMEM;
776 
777 	major = register_blkdev(0, "virtblk");
778 	if (major < 0) {
779 		error = major;
780 		goto out_destroy_workqueue;
781 	}
782 
783 	error = register_virtio_driver(&virtio_blk);
784 	if (error)
785 		goto out_unregister_blkdev;
786 	return 0;
787 
788 out_unregister_blkdev:
789 	unregister_blkdev(major, "virtblk");
790 out_destroy_workqueue:
791 	destroy_workqueue(virtblk_wq);
792 	return error;
793 }
794 
795 static void __exit fini(void)
796 {
797 	unregister_blkdev(major, "virtblk");
798 	unregister_virtio_driver(&virtio_blk);
799 	destroy_workqueue(virtblk_wq);
800 }
801 module_init(init);
802 module_exit(fini);
803 
804 MODULE_DEVICE_TABLE(virtio, id_table);
805 MODULE_DESCRIPTION("Virtio block driver");
806 MODULE_LICENSE("GPL");
807