generic: v6.6: update fitblk driver to work with Linux 6.6
authorDaniel Golle <daniel@makrotopia.org>
Fri, 1 Mar 2024 00:08:35 +0000 (00:08 +0000)
committerRobert Marko <robimarko@gmail.com>
Mon, 11 Mar 2024 19:17:26 +0000 (20:17 +0100)
Update fitblk driver which has previously been backported to Linux 6.1
so it can build and work with Linux 6.6.

Signed-off-by: Daniel Golle <daniel@makrotopia.org>
target/linux/generic/pending-6.6/510-block-add-uImage.FIT-subimage-block-driver.patch

index c565350dc0bd65860b00368db9f265057c75c6c9..117edbcef2d438ab72ac294c1f91afd46916740f 100644 (file)
@@ -81,7 +81,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
  swim_mod-y    := swim.o swim_asm.o
 --- /dev/null
 +++ b/drivers/block/fitblk.c
-@@ -0,0 +1,636 @@
+@@ -0,0 +1,659 @@
 +// SPDX-License-Identifier: GPL-2.0-only
 +/*
 + * uImage.FIT virtual block device driver.
@@ -199,9 +199,9 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 +      bool                    dead;
 +};
 +
-+static int fitblk_open(struct block_device *bdev, fmode_t mode)
++static int fitblk_open(struct gendisk *disk, fmode_t mode)
 +{
-+      struct fitblk *fitblk = bdev->bd_disk->private_data;
++      struct fitblk *fitblk = disk->private_data;
 +
 +      if (fitblk->dead)
 +              return -ENOENT;
@@ -209,7 +209,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 +      return 0;
 +}
 +
-+static void fitblk_release(struct gendisk *disk, fmode_t mode)
++static void fitblk_release(struct gendisk *disk)
 +{
 +      return;
 +}
@@ -283,7 +283,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 +
 +      if (refcount_dec_if_one(&num_devs)) {
 +              sysfs_remove_link(&pdev->dev.kobj, "lower_dev");
-+              blkdev_put(fitblk->lower_bdev, FMODE_READ | FMODE_EXCL);
++              blkdev_put(fitblk->lower_bdev, &_fitblk_claim_ptr);
 +      }
 +
 +      kfree(fitblk);
@@ -373,6 +373,29 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 +      return err;
 +}
 +
++static void fitblk_mark_dead(struct block_device *bdev, bool surprise)
++{
++      struct list_head *n, *tmp;
++      struct fitblk *fitblk;
++
++      mutex_lock(&devices_mutex);
++      list_for_each_safe(n, tmp, &fitblk_devices) {
++              fitblk = list_entry(n, struct fitblk, list);
++              if (fitblk->lower_bdev != bdev)
++                      continue;
++
++              fitblk->dead = true;
++              list_del(&fitblk->list);
++              /* removal needs to be deferred to avoid deadlock */
++              schedule_work(&fitblk->remove_work);
++      }
++      mutex_unlock(&devices_mutex);
++}
++
++static const struct blk_holder_ops fitblk_hops = {
++      .mark_dead = fitblk_mark_dead,
++};
++
 +static int parse_fit_on_dev(struct device *dev)
 +{
 +      struct block_device *bdev;
@@ -401,7 +424,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 +      unsigned int slot = 0;
 +
 +      /* Exclusive open the block device to receive holder notifications */
-+      bdev = blkdev_get_by_dev(dev->devt, FMODE_READ | FMODE_EXCL, &_fitblk_claim_ptr);
++      bdev = blkdev_get_by_dev(dev->devt, BLK_OPEN_READ, &_fitblk_claim_ptr, &fitblk_hops);
 +      if (!bdev)
 +              return -ENODEV;
 +
@@ -653,7 +676,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
 +      kfree(fit);
 +out_blkdev:
 +      if (!found || ret)
-+              blkdev_put(bdev, FMODE_READ | FMODE_EXCL);
++              blkdev_put(bdev, &_fitblk_claim_ptr);
 +
 +      return ret;
 +}