]> git.proxmox.com Git - pve-kernel.git/commitdiff
Revert "block: remove the -ERESTARTSYS handling in blkdev_get_by_dev"
authorThomas Lamprecht <t.lamprecht@proxmox.com>
Tue, 9 Nov 2021 11:53:44 +0000 (12:53 +0100)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Tue, 9 Nov 2021 11:56:54 +0000 (12:56 +0100)
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
Tested-by: Stoiko Ivanov <s.ivanov@proxmox.com>
patches/kernel/0009-Revert-block-remove-the-ERESTARTSYS-handling-in-blkd.patch [new file with mode: 0644]

diff --git a/patches/kernel/0009-Revert-block-remove-the-ERESTARTSYS-handling-in-blkd.patch b/patches/kernel/0009-Revert-block-remove-the-ERESTARTSYS-handling-in-blkd.patch
new file mode 100644 (file)
index 0000000..03d3b25
--- /dev/null
@@ -0,0 +1,40 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Thomas Lamprecht <t.lamprecht@proxmox.com>
+Date: Tue, 9 Nov 2021 12:01:12 +0100
+Subject: [PATCH] Revert "block: remove the -ERESTARTSYS handling in
+ blkdev_get_by_dev"
+
+This reverts commit a8ed1a0607cfa5478ff6009539f44790c4d0956d.
+
+It breaks ZFS sometimes:
+https://github.com/openzfs/zfs/issues/12301#issuecomment-873303739
+
+Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
+---
+ fs/block_dev.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/fs/block_dev.c b/fs/block_dev.c
+index e4a80bd4ddf1..4a14d28dd923 100644
+--- a/fs/block_dev.c
++++ b/fs/block_dev.c
+@@ -1436,6 +1436,10 @@ struct block_device *blkdev_get_by_dev(dev_t dev, fmode_t mode, void *holder)
+       if (ret)
+               return ERR_PTR(ret);
++      /*
++       * If we lost a race with 'disk' being deleted, try again.  See md.c.
++       */
++retry:
+       bdev = blkdev_get_no_open(dev);
+       if (!bdev)
+               return ERR_PTR(-ENXIO);
+@@ -1482,6 +1486,8 @@ struct block_device *blkdev_get_by_dev(dev_t dev, fmode_t mode, void *holder)
+       disk_unblock_events(disk);
+ put_blkdev:
+       blkdev_put_no_open(bdev);
++      if (ret == -ERESTARTSYS)
++              goto retry;
+       return ERR_PTR(ret);
+ }
+ EXPORT_SYMBOL(blkdev_get_by_dev);