|
@@ -1237,6 +1237,8 @@ int blkdev_get(struct block_device *bdev, fmode_t mode, void *holder)
|
|
|
res = __blkdev_get(bdev, mode, 0);
|
|
|
|
|
|
if (whole) {
|
|
|
+ struct gendisk *disk = whole->bd_disk;
|
|
|
+
|
|
|
/* finish claiming */
|
|
|
mutex_lock(&bdev->bd_mutex);
|
|
|
spin_lock(&bdev_lock);
|
|
@@ -1263,15 +1265,16 @@ int blkdev_get(struct block_device *bdev, fmode_t mode, void *holder)
|
|
|
spin_unlock(&bdev_lock);
|
|
|
|
|
|
/*
|
|
|
- * Block event polling for write claims. Any write
|
|
|
- * holder makes the write_holder state stick until all
|
|
|
- * are released. This is good enough and tracking
|
|
|
- * individual writeable reference is too fragile given
|
|
|
- * the way @mode is used in blkdev_get/put().
|
|
|
+ * Block event polling for write claims if requested. Any
|
|
|
+ * write holder makes the write_holder state stick until
|
|
|
+ * all are released. This is good enough and tracking
|
|
|
+ * individual writeable reference is too fragile given the
|
|
|
+ * way @mode is used in blkdev_get/put().
|
|
|
*/
|
|
|
- if (!res && (mode & FMODE_WRITE) && !bdev->bd_write_holder) {
|
|
|
+ if ((disk->flags & GENHD_FL_BLOCK_EVENTS_ON_EXCL_WRITE) &&
|
|
|
+ !res && (mode & FMODE_WRITE) && !bdev->bd_write_holder) {
|
|
|
bdev->bd_write_holder = true;
|
|
|
- disk_block_events(bdev->bd_disk);
|
|
|
+ disk_block_events(disk);
|
|
|
}
|
|
|
|
|
|
mutex_unlock(&bdev->bd_mutex);
|