mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	block: Move bdi_unregister() to del_gendisk()
Commit6cd18e711d"block: destroy bdi before blockdev is unregistered." moved bdi unregistration (at that time through bdi_destroy()) from blk_release_queue() to blk_cleanup_queue() because it needs to happen before blk_unregister_region() call in del_gendisk() for MD. SCSI though will free up the device number from sd_remove() called through a maze of callbacks from device_del() in __scsi_remove_device() before blk_cleanup_queue() and thus similar races as described in6cd18e711dcan happen for SCSI as well as reported by Omar [1]. Moving bdi_unregister() to del_gendisk() works for MD and fixes the problem for SCSI since del_gendisk() gets called from sd_remove() before freeing the device number. This also makes device_add_disk() (calling bdi_register_owner()) more symmetric with del_gendisk(). [1] http://marc.info/?l=linux-block&m=148554717109098&w=2 Tested-by: Lekshmi Pillai <lekshmicpillai@in.ibm.com> Acked-by: Tejun Heo <tj@kernel.org> Signed-off-by: Jan Kara <jack@suse.cz> Tested-by: Omar Sandoval <osandov@fb.com> Signed-off-by: Jens Axboe <axboe@fb.com>
This commit is contained in:
		
							parent
							
								
									113285b473
								
							
						
					
					
						commit
						165a5e22fa
					
				
					 2 changed files with 5 additions and 1 deletions
				
			
		| 
						 | 
					@ -578,7 +578,6 @@ void blk_cleanup_queue(struct request_queue *q)
 | 
				
			||||||
		q->queue_lock = &q->__queue_lock;
 | 
							q->queue_lock = &q->__queue_lock;
 | 
				
			||||||
	spin_unlock_irq(lock);
 | 
						spin_unlock_irq(lock);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bdi_unregister(q->backing_dev_info);
 | 
					 | 
				
			||||||
	put_disk_devt(q->disk_devt);
 | 
						put_disk_devt(q->disk_devt);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* @q is and will stay empty, shutdown and put */
 | 
						/* @q is and will stay empty, shutdown and put */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -681,6 +681,11 @@ void del_gendisk(struct gendisk *disk)
 | 
				
			||||||
	disk->flags &= ~GENHD_FL_UP;
 | 
						disk->flags &= ~GENHD_FL_UP;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sysfs_remove_link(&disk_to_dev(disk)->kobj, "bdi");
 | 
						sysfs_remove_link(&disk_to_dev(disk)->kobj, "bdi");
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * Unregister bdi before releasing device numbers (as they can get
 | 
				
			||||||
 | 
						 * reused and we'd get clashes in sysfs).
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						bdi_unregister(disk->queue->backing_dev_info);
 | 
				
			||||||
	blk_unregister_queue(disk);
 | 
						blk_unregister_queue(disk);
 | 
				
			||||||
	blk_unregister_region(disk_devt(disk), disk->minors);
 | 
						blk_unregister_region(disk_devt(disk), disk->minors);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue