|
@@ -762,7 +762,19 @@ static struct block_device *bd_start_claiming(struct block_device *bdev,
|
|
if (!disk)
|
|
if (!disk)
|
|
return ERR_PTR(-ENXIO);
|
|
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);
|
|
module_put(disk->fops->owner);
|
|
put_disk(disk);
|
|
put_disk(disk);
|
|
if (!whole)
|
|
if (!whole)
|