mtd: block2mtd: factor the early block device open logic into a helper
authorChristoph Hellwig <hch@lst.de>
Wed, 31 May 2023 12:55:33 +0000 (14:55 +0200)
committerJens Axboe <axboe@kernel.dk>
Mon, 5 Jun 2023 17:10:10 +0000 (11:10 -0600)
Simplify add_device a bit by splitting out the cumbersome early boot logic
into a separate helper.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com>
Link: https://lore.kernel.org/r/20230531125535.676098-23-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/mtd/devices/block2mtd.c

index a127cdd..457774e 100644 (file)
@@ -215,34 +215,18 @@ static void block2mtd_free_device(struct block2mtd_dev *dev)
        kfree(dev);
 }
 
-
-static struct block2mtd_dev *add_device(char *devname, int erase_size,
-               char *label, int timeout)
+static struct block_device *mdtblock_early_get_bdev(const char *devname,
+               fmode_t mode, int timeout, struct block2mtd_dev *dev)
 {
+       struct block_device *bdev = ERR_PTR(-ENODEV);
 #ifndef MODULE
        int i;
-#endif
-       const fmode_t mode = FMODE_READ | FMODE_WRITE | FMODE_EXCL;
-       struct block_device *bdev;
-       struct block2mtd_dev *dev;
-       char *name;
-
-       if (!devname)
-               return NULL;
-
-       dev = kzalloc(sizeof(struct block2mtd_dev), GFP_KERNEL);
-       if (!dev)
-               return NULL;
 
-       /* Get a handle on the device */
-       bdev = blkdev_get_by_path(devname, mode, dev, NULL);
-
-#ifndef MODULE
        /*
         * We might not have the root device mounted at this point.
         * Try to resolve the device name by other means.
         */
-       for (i = 0; IS_ERR(bdev) && i <= timeout; i++) {
+       for (i = 0; i <= timeout; i++) {
                dev_t devt;
 
                if (i)
@@ -254,12 +238,35 @@ static struct block2mtd_dev *add_device(char *devname, int erase_size,
                        msleep(1000);
                wait_for_device_probe();
 
-               if (early_lookup_bdev(devname, &devt))
-                       continue;
-               bdev = blkdev_get_by_dev(devt, mode, dev, NULL);
+               if (!early_lookup_bdev(devname, &devt)) {
+                       bdev = blkdev_get_by_dev(devt, mode, dev, NULL);
+                       if (!IS_ERR(bdev))
+                               break;
+               }
        }
 #endif
+       return bdev;
+}
+
+static struct block2mtd_dev *add_device(char *devname, int erase_size,
+               char *label, int timeout)
+{
+       const fmode_t mode = FMODE_READ | FMODE_WRITE | FMODE_EXCL;
+       struct block_device *bdev;
+       struct block2mtd_dev *dev;
+       char *name;
 
+       if (!devname)
+               return NULL;
+
+       dev = kzalloc(sizeof(struct block2mtd_dev), GFP_KERNEL);
+       if (!dev)
+               return NULL;
+
+       /* Get a handle on the device */
+       bdev = blkdev_get_by_path(devname, mode, dev, NULL);
+       if (IS_ERR(bdev))
+               bdev = mdtblock_early_get_bdev(devname, mode, timeout, dev);
        if (IS_ERR(bdev)) {
                pr_err("error: cannot open device %s\n", devname);
                goto err_free_block2mtd;