3838 * device). 
3939 */ 
4040struct  brd_device  {
41- 	int 		brd_number ;
42- 
43- 	struct  request_queue 	* brd_queue ;
41+ 	int 			brd_number ;
4442	struct  gendisk 		* brd_disk ;
4543	struct  list_head 	brd_list ;
4644
@@ -372,86 +370,71 @@ static LIST_HEAD(brd_devices);
372370static  DEFINE_MUTEX (brd_devices_mutex );
373371static  struct  dentry  * brd_debugfs_dir ;
374372
375- static  struct   brd_device   * brd_alloc (int  i )
373+ static  int   brd_alloc (int  i )
376374{
377375	struct  brd_device  * brd ;
378376	struct  gendisk  * disk ;
379377	char  buf [DISK_NAME_LEN ];
380378
381379	brd  =  kzalloc (sizeof (* brd ), GFP_KERNEL );
382380	if  (!brd )
383- 		goto  out ;
381+ 		return   - ENOMEM ;
384382	brd -> brd_number 		=  i ;
385383	spin_lock_init (& brd -> brd_lock );
386384	INIT_RADIX_TREE (& brd -> brd_pages , GFP_ATOMIC );
387385
388- 	brd -> brd_queue  =  blk_alloc_queue (NUMA_NO_NODE );
389- 	if  (!brd -> brd_queue )
390- 		goto out_free_dev ;
391- 
392386	snprintf (buf , DISK_NAME_LEN , "ram%d" , i );
393387	if  (!IS_ERR_OR_NULL (brd_debugfs_dir ))
394388		debugfs_create_u64 (buf , 0444 , brd_debugfs_dir ,
395389				& brd -> brd_nr_pages );
396390
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 );
405392	if  (!disk )
406- 		goto out_free_queue ;
393+ 		goto out_free_dev ;
394+ 
407395	disk -> major 		=  RAMDISK_MAJOR ;
408396	disk -> first_minor 	=  i  *  max_part ;
397+ 	disk -> minors 		=  max_part ;
409398	disk -> fops 		=  & brd_fops ;
410399	disk -> private_data 	=  brd ;
411400	disk -> flags 		=  GENHD_FL_EXT_DEVT ;
412401	strlcpy (disk -> disk_name , buf , DISK_NAME_LEN );
413402	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 );
414412
415413	/* 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 );
418418
419- 	return  brd ;
419+ 	return  0 ;
420420
421- out_free_queue :
422- 	blk_cleanup_queue (brd -> brd_queue );
423421out_free_dev :
424422	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 ;
435424}
436425
437426static  void  brd_probe (dev_t  dev )
438427{
439- 	struct  brd_device  * brd ;
440428	int  i  =  MINOR (dev ) / max_part ;
429+ 	struct  brd_device  * brd ;
441430
442431	mutex_lock (& brd_devices_mutex );
443432	list_for_each_entry (brd , & brd_devices , brd_list ) {
444433		if  (brd -> brd_number  ==  i )
445434			goto out_unlock ;
446435	}
447436
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 );
455438out_unlock :
456439	mutex_unlock (& brd_devices_mutex );
457440}
@@ -460,7 +443,9 @@ static void brd_del_one(struct brd_device *brd)
460443{
461444	list_del (& brd -> brd_list );
462445	del_gendisk (brd -> brd_disk );
463- 	brd_free (brd );
446+ 	blk_cleanup_disk (brd -> brd_disk );
447+ 	brd_free_pages (brd );
448+ 	kfree (brd );
464449}
465450
466451static  inline  void  brd_check_and_reset_par (void )
@@ -485,7 +470,7 @@ static inline void brd_check_and_reset_par(void)
485470static  int  __init  brd_init (void )
486471{
487472	struct  brd_device  * brd , * next ;
488- 	int  i ;
473+ 	int  err ,  i ;
489474
490475	/* 
491476	 * brd module now has a feature to instantiate underlying device 
@@ -511,22 +496,11 @@ static int __init brd_init(void)
511496
512497	mutex_lock (& brd_devices_mutex );
513498	for  (i  =  0 ; i  <  rd_nr ; i ++ ) {
514- 		brd  =  brd_alloc (i );
515- 		if  (! brd )
499+ 		err  =  brd_alloc (i );
500+ 		if  (err )
516501			goto out_free ;
517- 		list_add_tail (& brd -> brd_list , & brd_devices );
518502	}
519503
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- 	}
530504	mutex_unlock (& brd_devices_mutex );
531505
532506	pr_info ("brd: module loaded\n" );
@@ -535,15 +509,13 @@ static int __init brd_init(void)
535509out_free :
536510	debugfs_remove_recursive (brd_debugfs_dir );
537511
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 );
542514	mutex_unlock (& brd_devices_mutex );
543515	unregister_blkdev (RAMDISK_MAJOR , "ramdisk" );
544516
545517	pr_info ("brd: module NOT loaded !!!\n" );
546- 	return  - ENOMEM ;
518+ 	return  err ;
547519}
548520
549521static  void  __exit  brd_exit (void )
0 commit comments