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

brd: use __register_blkdev to allocate devices on demand

Use the simpler mechanism attached to major_name to allocate a brd device
when a currently unregistered minor is accessed.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>

authored by

Christoph Hellwig and committed by
Jens Axboe
7cc178a6 996e509b

+11 -28
+11 -28
drivers/block/brd.c
··· 426 426 kfree(brd); 427 427 } 428 428 429 - static struct brd_device *brd_init_one(int i, bool *new) 429 + static void brd_probe(dev_t dev) 430 430 { 431 431 struct brd_device *brd; 432 + int i = MINOR(dev) / max_part; 432 433 433 - *new = false; 434 + mutex_lock(&brd_devices_mutex); 434 435 list_for_each_entry(brd, &brd_devices, brd_list) { 435 436 if (brd->brd_number == i) 436 - goto out; 437 + goto out_unlock; 437 438 } 438 439 439 440 brd = brd_alloc(i); ··· 443 442 add_disk(brd->brd_disk); 444 443 list_add_tail(&brd->brd_list, &brd_devices); 445 444 } 446 - *new = true; 447 - out: 448 - return brd; 445 + 446 + out_unlock: 447 + mutex_unlock(&brd_devices_mutex); 449 448 } 450 449 451 450 static void brd_del_one(struct brd_device *brd) ··· 453 452 list_del(&brd->brd_list); 454 453 del_gendisk(brd->brd_disk); 455 454 brd_free(brd); 456 - } 457 - 458 - static struct kobject *brd_probe(dev_t dev, int *part, void *data) 459 - { 460 - struct brd_device *brd; 461 - struct kobject *kobj; 462 - bool new; 463 - 464 - mutex_lock(&brd_devices_mutex); 465 - brd = brd_init_one(MINOR(dev) / max_part, &new); 466 - kobj = brd ? get_disk_and_module(brd->brd_disk) : NULL; 467 - mutex_unlock(&brd_devices_mutex); 468 - 469 - if (new) 470 - *part = 0; 471 - 472 - return kobj; 473 455 } 474 456 475 457 static inline void brd_check_and_reset_par(void) ··· 494 510 * dynamically. 495 511 */ 496 512 497 - if (register_blkdev(RAMDISK_MAJOR, "ramdisk")) 513 + if (__register_blkdev(RAMDISK_MAJOR, "ramdisk", brd_probe)) 498 514 return -EIO; 499 515 500 516 brd_check_and_reset_par(); 501 517 518 + mutex_lock(&brd_devices_mutex); 502 519 for (i = 0; i < rd_nr; i++) { 503 520 brd = brd_alloc(i); 504 521 if (!brd) ··· 517 532 brd->brd_disk->queue = brd->brd_queue; 518 533 add_disk(brd->brd_disk); 519 534 } 520 - 521 - blk_register_region(MKDEV(RAMDISK_MAJOR, 0), 1UL << MINORBITS, 522 - THIS_MODULE, brd_probe, NULL, NULL); 535 + mutex_unlock(&brd_devices_mutex); 523 536 524 537 pr_info("brd: module loaded\n"); 525 538 return 0; ··· 527 544 list_del(&brd->brd_list); 528 545 brd_free(brd); 529 546 } 547 + mutex_unlock(&brd_devices_mutex); 530 548 unregister_blkdev(RAMDISK_MAJOR, "ramdisk"); 531 549 532 550 pr_info("brd: module NOT loaded !!!\n"); ··· 541 557 list_for_each_entry_safe(brd, next, &brd_devices, brd_list) 542 558 brd_del_one(brd); 543 559 544 - blk_unregister_region(MKDEV(RAMDISK_MAJOR, 0), 1UL << MINORBITS); 545 560 unregister_blkdev(RAMDISK_MAJOR, "ramdisk"); 546 561 547 562 pr_info("brd: module unloaded\n");