From b2baa57475e3a24bb9ad27bb9047ea3be94627f5 Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Wed, 31 May 2023 14:55:33 +0200 Subject: [PATCH] mtd: block2mtd: factor the early block device open logic into a helper Simplify add_device a bit by splitting out the cumbersome early boot logic into a separate helper. Signed-off-by: Christoph Hellwig Reviewed-by: Miquel Raynal Link: https://lore.kernel.org/r/20230531125535.676098-23-hch@lst.de Signed-off-by: Jens Axboe --- drivers/mtd/devices/block2mtd.c | 61 ++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 27 deletions(-) diff --git a/drivers/mtd/devices/block2mtd.c b/drivers/mtd/devices/block2mtd.c index a127cdde03b7..457774eef4d0 100644 --- a/drivers/mtd/devices/block2mtd.c +++ b/drivers/mtd/devices/block2mtd.c @@ -215,13 +215,42 @@ static void block2mtd_free_device(struct block2mtd_dev *dev) kfree(dev); } +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; + + /* + * We might not have the root device mounted at this point. + * Try to resolve the device name by other means. + */ + for (i = 0; i <= timeout; i++) { + dev_t devt; + + if (i) + /* + * Calling wait_for_device_probe in the first loop + * was not enough, sleep for a bit in subsequent + * go-arounds. + */ + msleep(1000); + wait_for_device_probe(); + + 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) { -#ifndef MODULE - int i; -#endif const fmode_t mode = FMODE_READ | FMODE_WRITE | FMODE_EXCL; struct block_device *bdev; struct block2mtd_dev *dev; @@ -236,30 +265,8 @@ static struct block2mtd_dev *add_device(char *devname, int erase_size, /* 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++) { - dev_t devt; - - if (i) - /* - * Calling wait_for_device_probe in the first loop - * was not enough, sleep for a bit in subsequent - * go-arounds. - */ - msleep(1000); - wait_for_device_probe(); - - if (early_lookup_bdev(devname, &devt)) - continue; - bdev = blkdev_get_by_dev(devt, mode, dev, NULL); - } -#endif - + 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;