Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.10 1005 lines 25 kB view raw
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 15#define PART_BITS 4 16 17static bool use_bio; 18module_param(use_bio, bool, S_IRUGO); 19 20static int major; 21static DEFINE_IDA(vd_index_ida); 22 23struct workqueue_struct *virtblk_wq; 24 25struct virtio_blk 26{ 27 struct virtio_device *vdev; 28 struct virtqueue *vq; 29 wait_queue_head_t queue_wait; 30 31 /* The disk structure for the kernel. */ 32 struct gendisk *disk; 33 34 mempool_t *pool; 35 36 /* Process context for config space updates */ 37 struct work_struct config_work; 38 39 /* Lock for config space updates */ 40 struct mutex config_lock; 41 42 /* enable config space updates */ 43 bool config_enable; 44 45 /* What host tells us, plus 2 for header & tailer. */ 46 unsigned int sg_elems; 47 48 /* Ida index - used to track minor number allocations. */ 49 int index; 50 51 /* Scatterlist: can be too big for stack. */ 52 struct scatterlist sg[/*sg_elems*/]; 53}; 54 55struct virtblk_req 56{ 57 struct request *req; 58 struct bio *bio; 59 struct virtio_blk_outhdr out_hdr; 60 struct virtio_scsi_inhdr in_hdr; 61 struct work_struct work; 62 struct virtio_blk *vblk; 63 int flags; 64 u8 status; 65 struct scatterlist sg[]; 66}; 67 68enum { 69 VBLK_IS_FLUSH = 1, 70 VBLK_REQ_FLUSH = 2, 71 VBLK_REQ_DATA = 4, 72 VBLK_REQ_FUA = 8, 73}; 74 75static inline int virtblk_result(struct virtblk_req *vbr) 76{ 77 switch (vbr->status) { 78 case VIRTIO_BLK_S_OK: 79 return 0; 80 case VIRTIO_BLK_S_UNSUPP: 81 return -ENOTTY; 82 default: 83 return -EIO; 84 } 85} 86 87static inline struct virtblk_req *virtblk_alloc_req(struct virtio_blk *vblk, 88 gfp_t gfp_mask) 89{ 90 struct virtblk_req *vbr; 91 92 vbr = mempool_alloc(vblk->pool, gfp_mask); 93 if (!vbr) 94 return NULL; 95 96 vbr->vblk = vblk; 97 if (use_bio) 98 sg_init_table(vbr->sg, vblk->sg_elems); 99 100 return vbr; 101} 102 103static int __virtblk_add_req(struct virtqueue *vq, 104 struct virtblk_req *vbr, 105 struct scatterlist *data_sg, 106 bool have_data) 107{ 108 struct scatterlist hdr, status, cmd, sense, inhdr, *sgs[6]; 109 unsigned int num_out = 0, num_in = 0; 110 int type = vbr->out_hdr.type & ~VIRTIO_BLK_T_OUT; 111 112 sg_init_one(&hdr, &vbr->out_hdr, sizeof(vbr->out_hdr)); 113 sgs[num_out++] = &hdr; 114 115 /* 116 * If this is a packet command we need a couple of additional headers. 117 * Behind the normal outhdr we put a segment with the scsi command 118 * block, and before the normal inhdr we put the sense data and the 119 * inhdr with additional status information. 120 */ 121 if (type == VIRTIO_BLK_T_SCSI_CMD) { 122 sg_init_one(&cmd, vbr->req->cmd, vbr->req->cmd_len); 123 sgs[num_out++] = &cmd; 124 } 125 126 if (have_data) { 127 if (vbr->out_hdr.type & VIRTIO_BLK_T_OUT) 128 sgs[num_out++] = data_sg; 129 else 130 sgs[num_out + num_in++] = data_sg; 131 } 132 133 if (type == VIRTIO_BLK_T_SCSI_CMD) { 134 sg_init_one(&sense, vbr->req->sense, SCSI_SENSE_BUFFERSIZE); 135 sgs[num_out + num_in++] = &sense; 136 sg_init_one(&inhdr, &vbr->in_hdr, sizeof(vbr->in_hdr)); 137 sgs[num_out + num_in++] = &inhdr; 138 } 139 140 sg_init_one(&status, &vbr->status, sizeof(vbr->status)); 141 sgs[num_out + num_in++] = &status; 142 143 return virtqueue_add_sgs(vq, sgs, num_out, num_in, vbr, GFP_ATOMIC); 144} 145 146static void virtblk_add_req(struct virtblk_req *vbr, bool have_data) 147{ 148 struct virtio_blk *vblk = vbr->vblk; 149 DEFINE_WAIT(wait); 150 int ret; 151 152 spin_lock_irq(vblk->disk->queue->queue_lock); 153 while (unlikely((ret = __virtblk_add_req(vblk->vq, vbr, vbr->sg, 154 have_data)) < 0)) { 155 prepare_to_wait_exclusive(&vblk->queue_wait, &wait, 156 TASK_UNINTERRUPTIBLE); 157 158 spin_unlock_irq(vblk->disk->queue->queue_lock); 159 io_schedule(); 160 spin_lock_irq(vblk->disk->queue->queue_lock); 161 162 finish_wait(&vblk->queue_wait, &wait); 163 } 164 165 virtqueue_kick(vblk->vq); 166 spin_unlock_irq(vblk->disk->queue->queue_lock); 167} 168 169static void virtblk_bio_send_flush(struct virtblk_req *vbr) 170{ 171 vbr->flags |= VBLK_IS_FLUSH; 172 vbr->out_hdr.type = VIRTIO_BLK_T_FLUSH; 173 vbr->out_hdr.sector = 0; 174 vbr->out_hdr.ioprio = 0; 175 176 virtblk_add_req(vbr, false); 177} 178 179static void virtblk_bio_send_data(struct virtblk_req *vbr) 180{ 181 struct virtio_blk *vblk = vbr->vblk; 182 struct bio *bio = vbr->bio; 183 bool have_data; 184 185 vbr->flags &= ~VBLK_IS_FLUSH; 186 vbr->out_hdr.type = 0; 187 vbr->out_hdr.sector = bio->bi_sector; 188 vbr->out_hdr.ioprio = bio_prio(bio); 189 190 if (blk_bio_map_sg(vblk->disk->queue, bio, vbr->sg)) { 191 have_data = true; 192 if (bio->bi_rw & REQ_WRITE) 193 vbr->out_hdr.type |= VIRTIO_BLK_T_OUT; 194 else 195 vbr->out_hdr.type |= VIRTIO_BLK_T_IN; 196 } else 197 have_data = false; 198 199 virtblk_add_req(vbr, have_data); 200} 201 202static void virtblk_bio_send_data_work(struct work_struct *work) 203{ 204 struct virtblk_req *vbr; 205 206 vbr = container_of(work, struct virtblk_req, work); 207 208 virtblk_bio_send_data(vbr); 209} 210 211static void virtblk_bio_send_flush_work(struct work_struct *work) 212{ 213 struct virtblk_req *vbr; 214 215 vbr = container_of(work, struct virtblk_req, work); 216 217 virtblk_bio_send_flush(vbr); 218} 219 220static inline void virtblk_request_done(struct virtblk_req *vbr) 221{ 222 struct virtio_blk *vblk = vbr->vblk; 223 struct request *req = vbr->req; 224 int error = virtblk_result(vbr); 225 226 if (req->cmd_type == REQ_TYPE_BLOCK_PC) { 227 req->resid_len = vbr->in_hdr.residual; 228 req->sense_len = vbr->in_hdr.sense_len; 229 req->errors = vbr->in_hdr.errors; 230 } else if (req->cmd_type == REQ_TYPE_SPECIAL) { 231 req->errors = (error != 0); 232 } 233 234 __blk_end_request_all(req, error); 235 mempool_free(vbr, vblk->pool); 236} 237 238static inline void virtblk_bio_flush_done(struct virtblk_req *vbr) 239{ 240 struct virtio_blk *vblk = vbr->vblk; 241 242 if (vbr->flags & VBLK_REQ_DATA) { 243 /* Send out the actual write data */ 244 INIT_WORK(&vbr->work, virtblk_bio_send_data_work); 245 queue_work(virtblk_wq, &vbr->work); 246 } else { 247 bio_endio(vbr->bio, virtblk_result(vbr)); 248 mempool_free(vbr, vblk->pool); 249 } 250} 251 252static inline void virtblk_bio_data_done(struct virtblk_req *vbr) 253{ 254 struct virtio_blk *vblk = vbr->vblk; 255 256 if (unlikely(vbr->flags & VBLK_REQ_FUA)) { 257 /* Send out a flush before end the bio */ 258 vbr->flags &= ~VBLK_REQ_DATA; 259 INIT_WORK(&vbr->work, virtblk_bio_send_flush_work); 260 queue_work(virtblk_wq, &vbr->work); 261 } else { 262 bio_endio(vbr->bio, virtblk_result(vbr)); 263 mempool_free(vbr, vblk->pool); 264 } 265} 266 267static inline void virtblk_bio_done(struct virtblk_req *vbr) 268{ 269 if (unlikely(vbr->flags & VBLK_IS_FLUSH)) 270 virtblk_bio_flush_done(vbr); 271 else 272 virtblk_bio_data_done(vbr); 273} 274 275static void virtblk_done(struct virtqueue *vq) 276{ 277 struct virtio_blk *vblk = vq->vdev->priv; 278 bool bio_done = false, req_done = false; 279 struct virtblk_req *vbr; 280 unsigned long flags; 281 unsigned int len; 282 283 spin_lock_irqsave(vblk->disk->queue->queue_lock, flags); 284 do { 285 virtqueue_disable_cb(vq); 286 while ((vbr = virtqueue_get_buf(vblk->vq, &len)) != NULL) { 287 if (vbr->bio) { 288 virtblk_bio_done(vbr); 289 bio_done = true; 290 } else { 291 virtblk_request_done(vbr); 292 req_done = true; 293 } 294 } 295 } while (!virtqueue_enable_cb(vq)); 296 /* In case queue is stopped waiting for more buffers. */ 297 if (req_done) 298 blk_start_queue(vblk->disk->queue); 299 spin_unlock_irqrestore(vblk->disk->queue->queue_lock, flags); 300 301 if (bio_done) 302 wake_up(&vblk->queue_wait); 303} 304 305static bool do_req(struct request_queue *q, struct virtio_blk *vblk, 306 struct request *req) 307{ 308 unsigned int num; 309 struct virtblk_req *vbr; 310 311 vbr = virtblk_alloc_req(vblk, GFP_ATOMIC); 312 if (!vbr) 313 /* When another request finishes we'll try again. */ 314 return false; 315 316 vbr->req = req; 317 vbr->bio = NULL; 318 if (req->cmd_flags & REQ_FLUSH) { 319 vbr->out_hdr.type = VIRTIO_BLK_T_FLUSH; 320 vbr->out_hdr.sector = 0; 321 vbr->out_hdr.ioprio = req_get_ioprio(vbr->req); 322 } else { 323 switch (req->cmd_type) { 324 case REQ_TYPE_FS: 325 vbr->out_hdr.type = 0; 326 vbr->out_hdr.sector = blk_rq_pos(vbr->req); 327 vbr->out_hdr.ioprio = req_get_ioprio(vbr->req); 328 break; 329 case REQ_TYPE_BLOCK_PC: 330 vbr->out_hdr.type = VIRTIO_BLK_T_SCSI_CMD; 331 vbr->out_hdr.sector = 0; 332 vbr->out_hdr.ioprio = req_get_ioprio(vbr->req); 333 break; 334 case REQ_TYPE_SPECIAL: 335 vbr->out_hdr.type = VIRTIO_BLK_T_GET_ID; 336 vbr->out_hdr.sector = 0; 337 vbr->out_hdr.ioprio = req_get_ioprio(vbr->req); 338 break; 339 default: 340 /* We don't put anything else in the queue. */ 341 BUG(); 342 } 343 } 344 345 num = blk_rq_map_sg(q, vbr->req, vblk->sg); 346 if (num) { 347 if (rq_data_dir(vbr->req) == WRITE) 348 vbr->out_hdr.type |= VIRTIO_BLK_T_OUT; 349 else 350 vbr->out_hdr.type |= VIRTIO_BLK_T_IN; 351 } 352 353 if (__virtblk_add_req(vblk->vq, vbr, vblk->sg, num) < 0) { 354 mempool_free(vbr, vblk->pool); 355 return false; 356 } 357 358 return true; 359} 360 361static void virtblk_request(struct request_queue *q) 362{ 363 struct virtio_blk *vblk = q->queuedata; 364 struct request *req; 365 unsigned int issued = 0; 366 367 while ((req = blk_peek_request(q)) != NULL) { 368 BUG_ON(req->nr_phys_segments + 2 > vblk->sg_elems); 369 370 /* If this request fails, stop queue and wait for something to 371 finish to restart it. */ 372 if (!do_req(q, vblk, req)) { 373 blk_stop_queue(q); 374 break; 375 } 376 blk_start_request(req); 377 issued++; 378 } 379 380 if (issued) 381 virtqueue_kick(vblk->vq); 382} 383 384static void virtblk_make_request(struct request_queue *q, struct bio *bio) 385{ 386 struct virtio_blk *vblk = q->queuedata; 387 struct virtblk_req *vbr; 388 389 BUG_ON(bio->bi_phys_segments + 2 > vblk->sg_elems); 390 391 vbr = virtblk_alloc_req(vblk, GFP_NOIO); 392 if (!vbr) { 393 bio_endio(bio, -ENOMEM); 394 return; 395 } 396 397 vbr->bio = bio; 398 vbr->flags = 0; 399 if (bio->bi_rw & REQ_FLUSH) 400 vbr->flags |= VBLK_REQ_FLUSH; 401 if (bio->bi_rw & REQ_FUA) 402 vbr->flags |= VBLK_REQ_FUA; 403 if (bio->bi_size) 404 vbr->flags |= VBLK_REQ_DATA; 405 406 if (unlikely(vbr->flags & VBLK_REQ_FLUSH)) 407 virtblk_bio_send_flush(vbr); 408 else 409 virtblk_bio_send_data(vbr); 410} 411 412/* return id (s/n) string for *disk to *id_str 413 */ 414static int virtblk_get_id(struct gendisk *disk, char *id_str) 415{ 416 struct virtio_blk *vblk = disk->private_data; 417 struct request *req; 418 struct bio *bio; 419 int err; 420 421 bio = bio_map_kern(vblk->disk->queue, id_str, VIRTIO_BLK_ID_BYTES, 422 GFP_KERNEL); 423 if (IS_ERR(bio)) 424 return PTR_ERR(bio); 425 426 req = blk_make_request(vblk->disk->queue, bio, GFP_KERNEL); 427 if (IS_ERR(req)) { 428 bio_put(bio); 429 return PTR_ERR(req); 430 } 431 432 req->cmd_type = REQ_TYPE_SPECIAL; 433 err = blk_execute_rq(vblk->disk->queue, vblk->disk, req, false); 434 blk_put_request(req); 435 436 return err; 437} 438 439static int virtblk_ioctl(struct block_device *bdev, fmode_t mode, 440 unsigned int cmd, unsigned long data) 441{ 442 struct gendisk *disk = bdev->bd_disk; 443 struct virtio_blk *vblk = disk->private_data; 444 445 /* 446 * Only allow the generic SCSI ioctls if the host can support it. 447 */ 448 if (!virtio_has_feature(vblk->vdev, VIRTIO_BLK_F_SCSI)) 449 return -ENOTTY; 450 451 return scsi_cmd_blk_ioctl(bdev, mode, cmd, 452 (void __user *)data); 453} 454 455/* We provide getgeo only to please some old bootloader/partitioning tools */ 456static int virtblk_getgeo(struct block_device *bd, struct hd_geometry *geo) 457{ 458 struct virtio_blk *vblk = bd->bd_disk->private_data; 459 struct virtio_blk_geometry vgeo; 460 int err; 461 462 /* see if the host passed in geometry config */ 463 err = virtio_config_val(vblk->vdev, VIRTIO_BLK_F_GEOMETRY, 464 offsetof(struct virtio_blk_config, geometry), 465 &vgeo); 466 467 if (!err) { 468 geo->heads = vgeo.heads; 469 geo->sectors = vgeo.sectors; 470 geo->cylinders = vgeo.cylinders; 471 } else { 472 /* some standard values, similar to sd */ 473 geo->heads = 1 << 6; 474 geo->sectors = 1 << 5; 475 geo->cylinders = get_capacity(bd->bd_disk) >> 11; 476 } 477 return 0; 478} 479 480static const struct block_device_operations virtblk_fops = { 481 .ioctl = virtblk_ioctl, 482 .owner = THIS_MODULE, 483 .getgeo = virtblk_getgeo, 484}; 485 486static int index_to_minor(int index) 487{ 488 return index << PART_BITS; 489} 490 491static int minor_to_index(int minor) 492{ 493 return minor >> PART_BITS; 494} 495 496static ssize_t virtblk_serial_show(struct device *dev, 497 struct device_attribute *attr, char *buf) 498{ 499 struct gendisk *disk = dev_to_disk(dev); 500 int err; 501 502 /* sysfs gives us a PAGE_SIZE buffer */ 503 BUILD_BUG_ON(PAGE_SIZE < VIRTIO_BLK_ID_BYTES); 504 505 buf[VIRTIO_BLK_ID_BYTES] = '\0'; 506 err = virtblk_get_id(disk, buf); 507 if (!err) 508 return strlen(buf); 509 510 if (err == -EIO) /* Unsupported? Make it empty. */ 511 return 0; 512 513 return err; 514} 515DEVICE_ATTR(serial, S_IRUGO, virtblk_serial_show, NULL); 516 517static void virtblk_config_changed_work(struct work_struct *work) 518{ 519 struct virtio_blk *vblk = 520 container_of(work, struct virtio_blk, config_work); 521 struct virtio_device *vdev = vblk->vdev; 522 struct request_queue *q = vblk->disk->queue; 523 char cap_str_2[10], cap_str_10[10]; 524 char *envp[] = { "RESIZE=1", NULL }; 525 u64 capacity, size; 526 527 mutex_lock(&vblk->config_lock); 528 if (!vblk->config_enable) 529 goto done; 530 531 /* Host must always specify the capacity. */ 532 vdev->config->get(vdev, offsetof(struct virtio_blk_config, capacity), 533 &capacity, sizeof(capacity)); 534 535 /* If capacity is too big, truncate with warning. */ 536 if ((sector_t)capacity != capacity) { 537 dev_warn(&vdev->dev, "Capacity %llu too large: truncating\n", 538 (unsigned long long)capacity); 539 capacity = (sector_t)-1; 540 } 541 542 size = capacity * queue_logical_block_size(q); 543 string_get_size(size, STRING_UNITS_2, cap_str_2, sizeof(cap_str_2)); 544 string_get_size(size, STRING_UNITS_10, cap_str_10, sizeof(cap_str_10)); 545 546 dev_notice(&vdev->dev, 547 "new size: %llu %d-byte logical blocks (%s/%s)\n", 548 (unsigned long long)capacity, 549 queue_logical_block_size(q), 550 cap_str_10, cap_str_2); 551 552 set_capacity(vblk->disk, capacity); 553 revalidate_disk(vblk->disk); 554 kobject_uevent_env(&disk_to_dev(vblk->disk)->kobj, KOBJ_CHANGE, envp); 555done: 556 mutex_unlock(&vblk->config_lock); 557} 558 559static void virtblk_config_changed(struct virtio_device *vdev) 560{ 561 struct virtio_blk *vblk = vdev->priv; 562 563 queue_work(virtblk_wq, &vblk->config_work); 564} 565 566static int init_vq(struct virtio_blk *vblk) 567{ 568 int err = 0; 569 570 /* We expect one virtqueue, for output. */ 571 vblk->vq = virtio_find_single_vq(vblk->vdev, virtblk_done, "requests"); 572 if (IS_ERR(vblk->vq)) 573 err = PTR_ERR(vblk->vq); 574 575 return err; 576} 577 578/* 579 * Legacy naming scheme used for virtio devices. We are stuck with it for 580 * virtio blk but don't ever use it for any new driver. 581 */ 582static int virtblk_name_format(char *prefix, int index, char *buf, int buflen) 583{ 584 const int base = 'z' - 'a' + 1; 585 char *begin = buf + strlen(prefix); 586 char *end = buf + buflen; 587 char *p; 588 int unit; 589 590 p = end - 1; 591 *p = '\0'; 592 unit = base; 593 do { 594 if (p == begin) 595 return -EINVAL; 596 *--p = 'a' + (index % unit); 597 index = (index / unit) - 1; 598 } while (index >= 0); 599 600 memmove(begin, p, end - p); 601 memcpy(buf, prefix, strlen(prefix)); 602 603 return 0; 604} 605 606static int virtblk_get_cache_mode(struct virtio_device *vdev) 607{ 608 u8 writeback; 609 int err; 610 611 err = virtio_config_val(vdev, VIRTIO_BLK_F_CONFIG_WCE, 612 offsetof(struct virtio_blk_config, wce), 613 &writeback); 614 if (err) 615 writeback = virtio_has_feature(vdev, VIRTIO_BLK_F_WCE); 616 617 return writeback; 618} 619 620static void virtblk_update_cache_mode(struct virtio_device *vdev) 621{ 622 u8 writeback = virtblk_get_cache_mode(vdev); 623 struct virtio_blk *vblk = vdev->priv; 624 625 if (writeback) 626 blk_queue_flush(vblk->disk->queue, REQ_FLUSH); 627 else 628 blk_queue_flush(vblk->disk->queue, 0); 629 630 revalidate_disk(vblk->disk); 631} 632 633static const char *const virtblk_cache_types[] = { 634 "write through", "write back" 635}; 636 637static ssize_t 638virtblk_cache_type_store(struct device *dev, struct device_attribute *attr, 639 const char *buf, size_t count) 640{ 641 struct gendisk *disk = dev_to_disk(dev); 642 struct virtio_blk *vblk = disk->private_data; 643 struct virtio_device *vdev = vblk->vdev; 644 int i; 645 u8 writeback; 646 647 BUG_ON(!virtio_has_feature(vblk->vdev, VIRTIO_BLK_F_CONFIG_WCE)); 648 for (i = ARRAY_SIZE(virtblk_cache_types); --i >= 0; ) 649 if (sysfs_streq(buf, virtblk_cache_types[i])) 650 break; 651 652 if (i < 0) 653 return -EINVAL; 654 655 writeback = i; 656 vdev->config->set(vdev, 657 offsetof(struct virtio_blk_config, wce), 658 &writeback, sizeof(writeback)); 659 660 virtblk_update_cache_mode(vdev); 661 return count; 662} 663 664static ssize_t 665virtblk_cache_type_show(struct device *dev, struct device_attribute *attr, 666 char *buf) 667{ 668 struct gendisk *disk = dev_to_disk(dev); 669 struct virtio_blk *vblk = disk->private_data; 670 u8 writeback = virtblk_get_cache_mode(vblk->vdev); 671 672 BUG_ON(writeback >= ARRAY_SIZE(virtblk_cache_types)); 673 return snprintf(buf, 40, "%s\n", virtblk_cache_types[writeback]); 674} 675 676static const struct device_attribute dev_attr_cache_type_ro = 677 __ATTR(cache_type, S_IRUGO, 678 virtblk_cache_type_show, NULL); 679static const struct device_attribute dev_attr_cache_type_rw = 680 __ATTR(cache_type, S_IRUGO|S_IWUSR, 681 virtblk_cache_type_show, virtblk_cache_type_store); 682 683static int virtblk_probe(struct virtio_device *vdev) 684{ 685 struct virtio_blk *vblk; 686 struct request_queue *q; 687 int err, index; 688 int pool_size; 689 690 u64 cap; 691 u32 v, blk_size, sg_elems, opt_io_size; 692 u16 min_io_size; 693 u8 physical_block_exp, alignment_offset; 694 695 err = ida_simple_get(&vd_index_ida, 0, minor_to_index(1 << MINORBITS), 696 GFP_KERNEL); 697 if (err < 0) 698 goto out; 699 index = err; 700 701 /* We need to know how many segments before we allocate. */ 702 err = virtio_config_val(vdev, VIRTIO_BLK_F_SEG_MAX, 703 offsetof(struct virtio_blk_config, seg_max), 704 &sg_elems); 705 706 /* We need at least one SG element, whatever they say. */ 707 if (err || !sg_elems) 708 sg_elems = 1; 709 710 /* We need an extra sg elements at head and tail. */ 711 sg_elems += 2; 712 vdev->priv = vblk = kmalloc(sizeof(*vblk) + 713 sizeof(vblk->sg[0]) * sg_elems, GFP_KERNEL); 714 if (!vblk) { 715 err = -ENOMEM; 716 goto out_free_index; 717 } 718 719 init_waitqueue_head(&vblk->queue_wait); 720 vblk->vdev = vdev; 721 vblk->sg_elems = sg_elems; 722 sg_init_table(vblk->sg, vblk->sg_elems); 723 mutex_init(&vblk->config_lock); 724 725 INIT_WORK(&vblk->config_work, virtblk_config_changed_work); 726 vblk->config_enable = true; 727 728 err = init_vq(vblk); 729 if (err) 730 goto out_free_vblk; 731 732 pool_size = sizeof(struct virtblk_req); 733 if (use_bio) 734 pool_size += sizeof(struct scatterlist) * sg_elems; 735 vblk->pool = mempool_create_kmalloc_pool(1, pool_size); 736 if (!vblk->pool) { 737 err = -ENOMEM; 738 goto out_free_vq; 739 } 740 741 /* FIXME: How many partitions? How long is a piece of string? */ 742 vblk->disk = alloc_disk(1 << PART_BITS); 743 if (!vblk->disk) { 744 err = -ENOMEM; 745 goto out_mempool; 746 } 747 748 q = vblk->disk->queue = blk_init_queue(virtblk_request, NULL); 749 if (!q) { 750 err = -ENOMEM; 751 goto out_put_disk; 752 } 753 754 if (use_bio) 755 blk_queue_make_request(q, virtblk_make_request); 756 q->queuedata = vblk; 757 758 virtblk_name_format("vd", index, vblk->disk->disk_name, DISK_NAME_LEN); 759 760 vblk->disk->major = major; 761 vblk->disk->first_minor = index_to_minor(index); 762 vblk->disk->private_data = vblk; 763 vblk->disk->fops = &virtblk_fops; 764 vblk->disk->driverfs_dev = &vdev->dev; 765 vblk->index = index; 766 767 /* configure queue flush support */ 768 virtblk_update_cache_mode(vdev); 769 770 /* If disk is read-only in the host, the guest should obey */ 771 if (virtio_has_feature(vdev, VIRTIO_BLK_F_RO)) 772 set_disk_ro(vblk->disk, 1); 773 774 /* Host must always specify the capacity. */ 775 vdev->config->get(vdev, offsetof(struct virtio_blk_config, capacity), 776 &cap, sizeof(cap)); 777 778 /* If capacity is too big, truncate with warning. */ 779 if ((sector_t)cap != cap) { 780 dev_warn(&vdev->dev, "Capacity %llu too large: truncating\n", 781 (unsigned long long)cap); 782 cap = (sector_t)-1; 783 } 784 set_capacity(vblk->disk, cap); 785 786 /* We can handle whatever the host told us to handle. */ 787 blk_queue_max_segments(q, vblk->sg_elems-2); 788 789 /* No need to bounce any requests */ 790 blk_queue_bounce_limit(q, BLK_BOUNCE_ANY); 791 792 /* No real sector limit. */ 793 blk_queue_max_hw_sectors(q, -1U); 794 795 /* Host can optionally specify maximum segment size and number of 796 * segments. */ 797 err = virtio_config_val(vdev, VIRTIO_BLK_F_SIZE_MAX, 798 offsetof(struct virtio_blk_config, size_max), 799 &v); 800 if (!err) 801 blk_queue_max_segment_size(q, v); 802 else 803 blk_queue_max_segment_size(q, -1U); 804 805 /* Host can optionally specify the block size of the device */ 806 err = virtio_config_val(vdev, VIRTIO_BLK_F_BLK_SIZE, 807 offsetof(struct virtio_blk_config, blk_size), 808 &blk_size); 809 if (!err) 810 blk_queue_logical_block_size(q, blk_size); 811 else 812 blk_size = queue_logical_block_size(q); 813 814 /* Use topology information if available */ 815 err = virtio_config_val(vdev, VIRTIO_BLK_F_TOPOLOGY, 816 offsetof(struct virtio_blk_config, physical_block_exp), 817 &physical_block_exp); 818 if (!err && physical_block_exp) 819 blk_queue_physical_block_size(q, 820 blk_size * (1 << physical_block_exp)); 821 822 err = virtio_config_val(vdev, VIRTIO_BLK_F_TOPOLOGY, 823 offsetof(struct virtio_blk_config, alignment_offset), 824 &alignment_offset); 825 if (!err && alignment_offset) 826 blk_queue_alignment_offset(q, blk_size * alignment_offset); 827 828 err = virtio_config_val(vdev, VIRTIO_BLK_F_TOPOLOGY, 829 offsetof(struct virtio_blk_config, min_io_size), 830 &min_io_size); 831 if (!err && min_io_size) 832 blk_queue_io_min(q, blk_size * min_io_size); 833 834 err = virtio_config_val(vdev, VIRTIO_BLK_F_TOPOLOGY, 835 offsetof(struct virtio_blk_config, opt_io_size), 836 &opt_io_size); 837 if (!err && opt_io_size) 838 blk_queue_io_opt(q, blk_size * opt_io_size); 839 840 add_disk(vblk->disk); 841 err = device_create_file(disk_to_dev(vblk->disk), &dev_attr_serial); 842 if (err) 843 goto out_del_disk; 844 845 if (virtio_has_feature(vdev, VIRTIO_BLK_F_CONFIG_WCE)) 846 err = device_create_file(disk_to_dev(vblk->disk), 847 &dev_attr_cache_type_rw); 848 else 849 err = device_create_file(disk_to_dev(vblk->disk), 850 &dev_attr_cache_type_ro); 851 if (err) 852 goto out_del_disk; 853 return 0; 854 855out_del_disk: 856 del_gendisk(vblk->disk); 857 blk_cleanup_queue(vblk->disk->queue); 858out_put_disk: 859 put_disk(vblk->disk); 860out_mempool: 861 mempool_destroy(vblk->pool); 862out_free_vq: 863 vdev->config->del_vqs(vdev); 864out_free_vblk: 865 kfree(vblk); 866out_free_index: 867 ida_simple_remove(&vd_index_ida, index); 868out: 869 return err; 870} 871 872static void virtblk_remove(struct virtio_device *vdev) 873{ 874 struct virtio_blk *vblk = vdev->priv; 875 int index = vblk->index; 876 int refc; 877 878 /* Prevent config work handler from accessing the device. */ 879 mutex_lock(&vblk->config_lock); 880 vblk->config_enable = false; 881 mutex_unlock(&vblk->config_lock); 882 883 del_gendisk(vblk->disk); 884 blk_cleanup_queue(vblk->disk->queue); 885 886 /* Stop all the virtqueues. */ 887 vdev->config->reset(vdev); 888 889 flush_work(&vblk->config_work); 890 891 refc = atomic_read(&disk_to_dev(vblk->disk)->kobj.kref.refcount); 892 put_disk(vblk->disk); 893 mempool_destroy(vblk->pool); 894 vdev->config->del_vqs(vdev); 895 kfree(vblk); 896 897 /* Only free device id if we don't have any users */ 898 if (refc == 1) 899 ida_simple_remove(&vd_index_ida, index); 900} 901 902#ifdef CONFIG_PM 903static int virtblk_freeze(struct virtio_device *vdev) 904{ 905 struct virtio_blk *vblk = vdev->priv; 906 907 /* Ensure we don't receive any more interrupts */ 908 vdev->config->reset(vdev); 909 910 /* Prevent config work handler from accessing the device. */ 911 mutex_lock(&vblk->config_lock); 912 vblk->config_enable = false; 913 mutex_unlock(&vblk->config_lock); 914 915 flush_work(&vblk->config_work); 916 917 spin_lock_irq(vblk->disk->queue->queue_lock); 918 blk_stop_queue(vblk->disk->queue); 919 spin_unlock_irq(vblk->disk->queue->queue_lock); 920 blk_sync_queue(vblk->disk->queue); 921 922 vdev->config->del_vqs(vdev); 923 return 0; 924} 925 926static int virtblk_restore(struct virtio_device *vdev) 927{ 928 struct virtio_blk *vblk = vdev->priv; 929 int ret; 930 931 vblk->config_enable = true; 932 ret = init_vq(vdev->priv); 933 if (!ret) { 934 spin_lock_irq(vblk->disk->queue->queue_lock); 935 blk_start_queue(vblk->disk->queue); 936 spin_unlock_irq(vblk->disk->queue->queue_lock); 937 } 938 return ret; 939} 940#endif 941 942static const struct virtio_device_id id_table[] = { 943 { VIRTIO_ID_BLOCK, VIRTIO_DEV_ANY_ID }, 944 { 0 }, 945}; 946 947static unsigned int features[] = { 948 VIRTIO_BLK_F_SEG_MAX, VIRTIO_BLK_F_SIZE_MAX, VIRTIO_BLK_F_GEOMETRY, 949 VIRTIO_BLK_F_RO, VIRTIO_BLK_F_BLK_SIZE, VIRTIO_BLK_F_SCSI, 950 VIRTIO_BLK_F_WCE, VIRTIO_BLK_F_TOPOLOGY, VIRTIO_BLK_F_CONFIG_WCE 951}; 952 953static struct virtio_driver virtio_blk = { 954 .feature_table = features, 955 .feature_table_size = ARRAY_SIZE(features), 956 .driver.name = KBUILD_MODNAME, 957 .driver.owner = THIS_MODULE, 958 .id_table = id_table, 959 .probe = virtblk_probe, 960 .remove = virtblk_remove, 961 .config_changed = virtblk_config_changed, 962#ifdef CONFIG_PM 963 .freeze = virtblk_freeze, 964 .restore = virtblk_restore, 965#endif 966}; 967 968static int __init init(void) 969{ 970 int error; 971 972 virtblk_wq = alloc_workqueue("virtio-blk", 0, 0); 973 if (!virtblk_wq) 974 return -ENOMEM; 975 976 major = register_blkdev(0, "virtblk"); 977 if (major < 0) { 978 error = major; 979 goto out_destroy_workqueue; 980 } 981 982 error = register_virtio_driver(&virtio_blk); 983 if (error) 984 goto out_unregister_blkdev; 985 return 0; 986 987out_unregister_blkdev: 988 unregister_blkdev(major, "virtblk"); 989out_destroy_workqueue: 990 destroy_workqueue(virtblk_wq); 991 return error; 992} 993 994static void __exit fini(void) 995{ 996 unregister_blkdev(major, "virtblk"); 997 unregister_virtio_driver(&virtio_blk); 998 destroy_workqueue(virtblk_wq); 999} 1000module_init(init); 1001module_exit(fini); 1002 1003MODULE_DEVICE_TABLE(virtio, id_table); 1004MODULE_DESCRIPTION("Virtio block driver"); 1005MODULE_LICENSE("GPL");