diff --git a/0001-bdev-Factor-out-bdev-revalidation-into-a-common-help.patch b/0001-bdev-Factor-out-bdev-revalidation-into-a-common-help.patch new file mode 100644 index 0000000..1e979a1 --- /dev/null +++ b/0001-bdev-Factor-out-bdev-revalidation-into-a-common-help.patch @@ -0,0 +1,68 @@ +From aea39223667868c77936546004b84716a623a438 Mon Sep 17 00:00:00 2001 +From: Jan Kara +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 +Signed-off-by: Jens Axboe +--- + 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 + diff --git a/0002-bdev-Refresh-bdev-size-for-disks-without-partitionin.patch b/0002-bdev-Refresh-bdev-size-for-disks-without-partitionin.patch new file mode 100644 index 0000000..c988fa6 --- /dev/null +++ b/0002-bdev-Refresh-bdev-size-for-disks-without-partitionin.patch @@ -0,0 +1,61 @@ +From 91ee136f5e2179a0994985ea043468bbbcd400d4 Mon Sep 17 00:00:00 2001 +From: Jan Kara +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 +Signed-off-by: Jens Axboe +--- + 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 + diff --git a/kernel.spec b/kernel.spec index 7f2c508..052b0fa 100644 --- a/kernel.spec +++ b/kernel.spec @@ -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 +- Fix for DVD reading (rhbz 1781762) + * Wed Dec 04 2019 Jeremy Cline - 5.4.2-300 - Linux v5.4.2