summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaura Abbott <labbott@redhat.com>2019-12-10 11:26:06 -0500
committerLaura Abbott <labbott@redhat.com>2019-12-10 11:26:06 -0500
commitff4083bf76232e77c18e92fad712caf85ffdf730 (patch)
tree6d20d447948a8e161a8acd441c92dcc69a5f5241
parentd8f382cfcc1767c99f7fa680d21de3096899422d (diff)
downloadkernel-ff4083bf76232e77c18e92fad712caf85ffdf730.tar.gz
kernel-ff4083bf76232e77c18e92fad712caf85ffdf730.tar.xz
kernel-ff4083bf76232e77c18e92fad712caf85ffdf730.zip
Fix for DVD reading (rhbz 1781762)
-rw-r--r--0001-bdev-Factor-out-bdev-revalidation-into-a-common-help.patch68
-rw-r--r--0002-bdev-Refresh-bdev-size-for-disks-without-partitionin.patch61
-rw-r--r--kernel.spec7
3 files changed, 136 insertions, 0 deletions
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 000000000..1e979a1fa
--- /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 <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
+
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 000000000..c988fa6a8
--- /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 <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
+
diff --git a/kernel.spec b/kernel.spec
index 7f2c50817..052b0fa6c 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 <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