diff options
Diffstat (limited to 'fs/block_dev.c')
| -rw-r--r-- | fs/block_dev.c | 14 | 
1 files changed, 13 insertions, 1 deletions
diff --git a/fs/block_dev.c b/fs/block_dev.c index 1a2421f908f..610e8e0b04b 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -762,7 +762,19 @@ static struct block_device *bd_start_claiming(struct block_device *bdev,  	if (!disk)  		return ERR_PTR(-ENXIO); -	whole = bdget_disk(disk, 0); +	/* +	 * Normally, @bdev should equal what's returned from bdget_disk() +	 * if partno is 0; however, some drivers (floppy) use multiple +	 * bdev's for the same physical device and @bdev may be one of the +	 * aliases.  Keep @bdev if partno is 0.  This means claimer +	 * tracking is broken for those devices but it has always been that +	 * way. +	 */ +	if (partno) +		whole = bdget_disk(disk, 0); +	else +		whole = bdgrab(bdev); +  	module_put(disk->fops->owner);  	put_disk(disk);  	if (!whole)  |