38
38
* device).
39
39
*/
40
40
struct brd_device {
41
- int brd_number ;
42
-
43
- struct request_queue * brd_queue ;
41
+ int brd_number ;
44
42
struct gendisk * brd_disk ;
45
43
struct list_head brd_list ;
46
44
@@ -372,86 +370,71 @@ static LIST_HEAD(brd_devices);
372
370
static DEFINE_MUTEX (brd_devices_mutex );
373
371
static struct dentry * brd_debugfs_dir ;
374
372
375
- static struct brd_device * brd_alloc (int i )
373
+ static int brd_alloc (int i )
376
374
{
377
375
struct brd_device * brd ;
378
376
struct gendisk * disk ;
379
377
char buf [DISK_NAME_LEN ];
380
378
381
379
brd = kzalloc (sizeof (* brd ), GFP_KERNEL );
382
380
if (!brd )
383
- goto out ;
381
+ return - ENOMEM ;
384
382
brd -> brd_number = i ;
385
383
spin_lock_init (& brd -> brd_lock );
386
384
INIT_RADIX_TREE (& brd -> brd_pages , GFP_ATOMIC );
387
385
388
- brd -> brd_queue = blk_alloc_queue (NUMA_NO_NODE );
389
- if (!brd -> brd_queue )
390
- goto out_free_dev ;
391
-
392
386
snprintf (buf , DISK_NAME_LEN , "ram%d" , i );
393
387
if (!IS_ERR_OR_NULL (brd_debugfs_dir ))
394
388
debugfs_create_u64 (buf , 0444 , brd_debugfs_dir ,
395
389
& brd -> brd_nr_pages );
396
390
397
- /* This is so fdisk will align partitions on 4k, because of
398
- * direct_access API needing 4k alignment, returning a PFN
399
- * (This is only a problem on very small devices <= 4M,
400
- * otherwise fdisk will align on 1M. Regardless this call
401
- * is harmless)
402
- */
403
- blk_queue_physical_block_size (brd -> brd_queue , PAGE_SIZE );
404
- disk = brd -> brd_disk = alloc_disk (max_part );
391
+ disk = brd -> brd_disk = blk_alloc_disk (NUMA_NO_NODE );
405
392
if (!disk )
406
- goto out_free_queue ;
393
+ goto out_free_dev ;
394
+
407
395
disk -> major = RAMDISK_MAJOR ;
408
396
disk -> first_minor = i * max_part ;
397
+ disk -> minors = max_part ;
409
398
disk -> fops = & brd_fops ;
410
399
disk -> private_data = brd ;
411
400
disk -> flags = GENHD_FL_EXT_DEVT ;
412
401
strlcpy (disk -> disk_name , buf , DISK_NAME_LEN );
413
402
set_capacity (disk , rd_size * 2 );
403
+
404
+ /*
405
+ * This is so fdisk will align partitions on 4k, because of
406
+ * direct_access API needing 4k alignment, returning a PFN
407
+ * (This is only a problem on very small devices <= 4M,
408
+ * otherwise fdisk will align on 1M. Regardless this call
409
+ * is harmless)
410
+ */
411
+ blk_queue_physical_block_size (disk -> queue , PAGE_SIZE );
414
412
415
413
/* Tell the block layer that this is not a rotational device */
416
- blk_queue_flag_set (QUEUE_FLAG_NONROT , brd -> brd_queue );
417
- blk_queue_flag_clear (QUEUE_FLAG_ADD_RANDOM , brd -> brd_queue );
414
+ blk_queue_flag_set (QUEUE_FLAG_NONROT , disk -> queue );
415
+ blk_queue_flag_clear (QUEUE_FLAG_ADD_RANDOM , disk -> queue );
416
+ add_disk (disk );
417
+ list_add_tail (& brd -> brd_list , & brd_devices );
418
418
419
- return brd ;
419
+ return 0 ;
420
420
421
- out_free_queue :
422
- blk_cleanup_queue (brd -> brd_queue );
423
421
out_free_dev :
424
422
kfree (brd );
425
- out :
426
- return NULL ;
427
- }
428
-
429
- static void brd_free (struct brd_device * brd )
430
- {
431
- put_disk (brd -> brd_disk );
432
- blk_cleanup_queue (brd -> brd_queue );
433
- brd_free_pages (brd );
434
- kfree (brd );
423
+ return - ENOMEM ;
435
424
}
436
425
437
426
static void brd_probe (dev_t dev )
438
427
{
439
- struct brd_device * brd ;
440
428
int i = MINOR (dev ) / max_part ;
429
+ struct brd_device * brd ;
441
430
442
431
mutex_lock (& brd_devices_mutex );
443
432
list_for_each_entry (brd , & brd_devices , brd_list ) {
444
433
if (brd -> brd_number == i )
445
434
goto out_unlock ;
446
435
}
447
436
448
- brd = brd_alloc (i );
449
- if (brd ) {
450
- brd -> brd_disk -> queue = brd -> brd_queue ;
451
- add_disk (brd -> brd_disk );
452
- list_add_tail (& brd -> brd_list , & brd_devices );
453
- }
454
-
437
+ brd_alloc (i );
455
438
out_unlock :
456
439
mutex_unlock (& brd_devices_mutex );
457
440
}
@@ -460,7 +443,9 @@ static void brd_del_one(struct brd_device *brd)
460
443
{
461
444
list_del (& brd -> brd_list );
462
445
del_gendisk (brd -> brd_disk );
463
- brd_free (brd );
446
+ blk_cleanup_disk (brd -> brd_disk );
447
+ brd_free_pages (brd );
448
+ kfree (brd );
464
449
}
465
450
466
451
static inline void brd_check_and_reset_par (void )
@@ -485,7 +470,7 @@ static inline void brd_check_and_reset_par(void)
485
470
static int __init brd_init (void )
486
471
{
487
472
struct brd_device * brd , * next ;
488
- int i ;
473
+ int err , i ;
489
474
490
475
/*
491
476
* brd module now has a feature to instantiate underlying device
@@ -511,22 +496,11 @@ static int __init brd_init(void)
511
496
512
497
mutex_lock (& brd_devices_mutex );
513
498
for (i = 0 ; i < rd_nr ; i ++ ) {
514
- brd = brd_alloc (i );
515
- if (! brd )
499
+ err = brd_alloc (i );
500
+ if (err )
516
501
goto out_free ;
517
- list_add_tail (& brd -> brd_list , & brd_devices );
518
502
}
519
503
520
- /* point of no return */
521
-
522
- list_for_each_entry (brd , & brd_devices , brd_list ) {
523
- /*
524
- * associate with queue just before adding disk for
525
- * avoiding to mess up failure path
526
- */
527
- brd -> brd_disk -> queue = brd -> brd_queue ;
528
- add_disk (brd -> brd_disk );
529
- }
530
504
mutex_unlock (& brd_devices_mutex );
531
505
532
506
pr_info ("brd: module loaded\n" );
@@ -535,15 +509,13 @@ static int __init brd_init(void)
535
509
out_free :
536
510
debugfs_remove_recursive (brd_debugfs_dir );
537
511
538
- list_for_each_entry_safe (brd , next , & brd_devices , brd_list ) {
539
- list_del (& brd -> brd_list );
540
- brd_free (brd );
541
- }
512
+ list_for_each_entry_safe (brd , next , & brd_devices , brd_list )
513
+ brd_del_one (brd );
542
514
mutex_unlock (& brd_devices_mutex );
543
515
unregister_blkdev (RAMDISK_MAJOR , "ramdisk" );
544
516
545
517
pr_info ("brd: module NOT loaded !!!\n" );
546
- return - ENOMEM ;
518
+ return err ;
547
519
}
548
520
549
521
static void __exit brd_exit (void )
0 commit comments