Fix for DVD reading (rhbz 1781762)
This commit is contained in:
parent
d8f382cfcc
commit
ff4083bf76
3 changed files with 136 additions and 0 deletions
|
|
@ -0,0 +1,68 @@
|
|||
From aea39223667868c77936546004b84716a623a438 Mon Sep 17 00:00:00 2001
|
||||
From: Jan Kara <jack@suse.cz>
|
||||
Date: Mon, 21 Oct 2019 10:37:59 +0200
|
||||
Subject: [PATCH 1/2] bdev: Factor out bdev revalidation into a common helper
|
||||
|
||||
Factor out code handling revalidation of bdev on disk change into a
|
||||
common helper.
|
||||
|
||||
Signed-off-by: Jan Kara <jack@suse.cz>
|
||||
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
||||
---
|
||||
fs/block_dev.c | 26 ++++++++++++++------------
|
||||
1 file changed, 14 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/fs/block_dev.c b/fs/block_dev.c
|
||||
index 9c073dbdc1b0..88c6d35ec71d 100644
|
||||
--- a/fs/block_dev.c
|
||||
+++ b/fs/block_dev.c
|
||||
@@ -1512,6 +1512,14 @@ EXPORT_SYMBOL(bd_set_size);
|
||||
|
||||
static void __blkdev_put(struct block_device *bdev, fmode_t mode, int for_part);
|
||||
|
||||
+static void bdev_disk_changed(struct block_device *bdev, bool invalidate)
|
||||
+{
|
||||
+ if (invalidate)
|
||||
+ invalidate_partitions(bdev->bd_disk, bdev);
|
||||
+ else
|
||||
+ rescan_partitions(bdev->bd_disk, bdev);
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* bd_mutex locking:
|
||||
*
|
||||
@@ -1594,12 +1602,9 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
|
||||
* The latter is necessary to prevent ghost
|
||||
* partitions on a removed medium.
|
||||
*/
|
||||
- if (bdev->bd_invalidated) {
|
||||
- if (!ret)
|
||||
- rescan_partitions(disk, bdev);
|
||||
- else if (ret == -ENOMEDIUM)
|
||||
- invalidate_partitions(disk, bdev);
|
||||
- }
|
||||
+ if (bdev->bd_invalidated &&
|
||||
+ (!ret || ret == -ENOMEDIUM))
|
||||
+ bdev_disk_changed(bdev, ret == -ENOMEDIUM);
|
||||
|
||||
if (ret)
|
||||
goto out_clear;
|
||||
@@ -1632,12 +1637,9 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
|
||||
if (bdev->bd_disk->fops->open)
|
||||
ret = bdev->bd_disk->fops->open(bdev, mode);
|
||||
/* the same as first opener case, read comment there */
|
||||
- if (bdev->bd_invalidated) {
|
||||
- if (!ret)
|
||||
- rescan_partitions(bdev->bd_disk, bdev);
|
||||
- else if (ret == -ENOMEDIUM)
|
||||
- invalidate_partitions(bdev->bd_disk, bdev);
|
||||
- }
|
||||
+ if (bdev->bd_invalidated &&
|
||||
+ (!ret || ret == -ENOMEDIUM))
|
||||
+ bdev_disk_changed(bdev, ret == -ENOMEDIUM);
|
||||
if (ret)
|
||||
goto out_unlock_bdev;
|
||||
}
|
||||
--
|
||||
2.21.0
|
||||
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
From 91ee136f5e2179a0994985ea043468bbbcd400d4 Mon Sep 17 00:00:00 2001
|
||||
From: Jan Kara <jack@suse.cz>
|
||||
Date: Mon, 21 Oct 2019 10:38:00 +0200
|
||||
Subject: [PATCH 2/2] bdev: Refresh bdev size for disks without partitioning
|
||||
|
||||
Currently, block device size in not updated on second and further open
|
||||
for block devices where partition scan is disabled. This is particularly
|
||||
annoying for example for DVD drives as that means block device size does
|
||||
not get updated once the media is inserted into a drive if the device is
|
||||
already open when inserting the media. This is actually always the case
|
||||
for example when pktcdvd is in use.
|
||||
|
||||
Fix the problem by revalidating block device size on every open even for
|
||||
devices with partition scan disabled.
|
||||
|
||||
Signed-off-by: Jan Kara <jack@suse.cz>
|
||||
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
||||
---
|
||||
fs/block_dev.c | 19 ++++++++++---------
|
||||
1 file changed, 10 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/fs/block_dev.c b/fs/block_dev.c
|
||||
index 88c6d35ec71d..d612468ee66b 100644
|
||||
--- a/fs/block_dev.c
|
||||
+++ b/fs/block_dev.c
|
||||
@@ -1403,11 +1403,7 @@ static void flush_disk(struct block_device *bdev, bool kill_dirty)
|
||||
"resized disk %s\n",
|
||||
bdev->bd_disk ? bdev->bd_disk->disk_name : "");
|
||||
}
|
||||
-
|
||||
- if (!bdev->bd_disk)
|
||||
- return;
|
||||
- if (disk_part_scan_enabled(bdev->bd_disk))
|
||||
- bdev->bd_invalidated = 1;
|
||||
+ bdev->bd_invalidated = 1;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1514,10 +1510,15 @@ static void __blkdev_put(struct block_device *bdev, fmode_t mode, int for_part);
|
||||
|
||||
static void bdev_disk_changed(struct block_device *bdev, bool invalidate)
|
||||
{
|
||||
- if (invalidate)
|
||||
- invalidate_partitions(bdev->bd_disk, bdev);
|
||||
- else
|
||||
- rescan_partitions(bdev->bd_disk, bdev);
|
||||
+ if (disk_part_scan_enabled(bdev->bd_disk)) {
|
||||
+ if (invalidate)
|
||||
+ invalidate_partitions(bdev->bd_disk, bdev);
|
||||
+ else
|
||||
+ rescan_partitions(bdev->bd_disk, bdev);
|
||||
+ } else {
|
||||
+ check_disk_size_change(bdev->bd_disk, bdev, !invalidate);
|
||||
+ bdev->bd_invalidated = 0;
|
||||
+ }
|
||||
}
|
||||
|
||||
/*
|
||||
--
|
||||
2.21.0
|
||||
|
||||
|
|
@ -866,6 +866,10 @@ Patch535: 0001-libertas-fix-a-potential-NULL-pointer-dereference.patch
|
|||
# rhbz 1769600
|
||||
Patch536: powerpc-xive-skip-ioremap-of-ESB-pages-for-LSI-interrupts.patch
|
||||
|
||||
# rhbz 1781762
|
||||
Patch537: 0001-bdev-Factor-out-bdev-revalidation-into-a-common-help.patch
|
||||
Patch538: 0002-bdev-Refresh-bdev-size-for-disks-without-partitionin.patch
|
||||
|
||||
# END OF PATCH DEFINITIONS
|
||||
|
||||
%endif
|
||||
|
|
@ -2567,6 +2571,9 @@ fi
|
|||
#
|
||||
#
|
||||
%changelog
|
||||
* Tue Dec 10 2019 Laura Abbott <labbott@redhat.com>
|
||||
- Fix for DVD reading (rhbz 1781762)
|
||||
|
||||
* Wed Dec 04 2019 Jeremy Cline <jcline@redhat.com> - 5.4.2-300
|
||||
- Linux v5.4.2
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue