block: remove cmdline-parser.c
authorChristoph Hellwig <hch@lst.de>
Wed, 28 Jul 2021 05:37:56 +0000 (07:37 +0200)
committerJens Axboe <axboe@kernel.dk>
Mon, 2 Aug 2021 19:37:28 +0000 (13:37 -0600)
cmdline-parser.c is only used by the cmdline faux partition format,
so merge the code into that and avoid an indirect call.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20210728053756.409654-1-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
arch/m68k/configs/stmark2_defconfig
block/Kconfig
block/Makefile
block/cmdline-parser.c [deleted file]
block/partitions/Kconfig
block/partitions/cmdline.c
include/linux/cmdline-parser.h [deleted file]

index d923064..8898ae3 100644 (file)
@@ -22,7 +22,6 @@ CONFIG_RAMSIZE=0x8000000
 CONFIG_VECTORBASE=0x40000000
 CONFIG_KERNELBASE=0x40001000
 # CONFIG_BLK_DEV_BSG is not set
-CONFIG_BLK_CMDLINE_PARSER=y
 CONFIG_BINFMT_FLAT=y
 CONFIG_BINFMT_ZFLAT=y
 CONFIG_BINFMT_MISC=y
index fd732ae..15dfb76 100644 (file)
@@ -114,16 +114,6 @@ config BLK_DEV_THROTTLING_LOW
 
        Note, this is an experimental interface and could be changed someday.
 
-config BLK_CMDLINE_PARSER
-       bool "Block device command line partition parser"
-       help
-       Enabling this option allows you to specify the partition layout from
-       the kernel boot args.  This is typically of use for embedded devices
-       which don't otherwise have any standardized method for listing the
-       partitions on a block device.
-
-       See Documentation/block/cmdline-partition.rst for more information.
-
 config BLK_WBT
        bool "Enable support for block device writeback throttling"
        help
index bfbe4e1..c72592b 100644 (file)
@@ -28,7 +28,6 @@ obj-$(CONFIG_MQ_IOSCHED_KYBER)        += kyber-iosched.o
 bfq-y                          := bfq-iosched.o bfq-wf2q.o bfq-cgroup.o
 obj-$(CONFIG_IOSCHED_BFQ)      += bfq.o
 
-obj-$(CONFIG_BLK_CMDLINE_PARSER)       += cmdline-parser.o
 obj-$(CONFIG_BLK_DEV_INTEGRITY) += bio-integrity.o blk-integrity.o
 obj-$(CONFIG_BLK_DEV_INTEGRITY_T10)    += t10-pi.o
 obj-$(CONFIG_BLK_MQ_PCI)       += blk-mq-pci.o
diff --git a/block/cmdline-parser.c b/block/cmdline-parser.c
deleted file mode 100644 (file)
index f2a1457..0000000
+++ /dev/null
@@ -1,255 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Parse command line, get partition information
- *
- * Written by Cai Zhiyong <caizhiyong@huawei.com>
- *
- */
-#include <linux/export.h>
-#include <linux/cmdline-parser.h>
-
-static int parse_subpart(struct cmdline_subpart **subpart, char *partdef)
-{
-       int ret = 0;
-       struct cmdline_subpart *new_subpart;
-
-       *subpart = NULL;
-
-       new_subpart = kzalloc(sizeof(struct cmdline_subpart), GFP_KERNEL);
-       if (!new_subpart)
-               return -ENOMEM;
-
-       if (*partdef == '-') {
-               new_subpart->size = (sector_t)(~0ULL);
-               partdef++;
-       } else {
-               new_subpart->size = (sector_t)memparse(partdef, &partdef);
-               if (new_subpart->size < (sector_t)PAGE_SIZE) {
-                       pr_warn("cmdline partition size is invalid.");
-                       ret = -EINVAL;
-                       goto fail;
-               }
-       }
-
-       if (*partdef == '@') {
-               partdef++;
-               new_subpart->from = (sector_t)memparse(partdef, &partdef);
-       } else {
-               new_subpart->from = (sector_t)(~0ULL);
-       }
-
-       if (*partdef == '(') {
-               int length;
-               char *next = strchr(++partdef, ')');
-
-               if (!next) {
-                       pr_warn("cmdline partition format is invalid.");
-                       ret = -EINVAL;
-                       goto fail;
-               }
-
-               length = min_t(int, next - partdef,
-                              sizeof(new_subpart->name) - 1);
-               strncpy(new_subpart->name, partdef, length);
-               new_subpart->name[length] = '\0';
-
-               partdef = ++next;
-       } else
-               new_subpart->name[0] = '\0';
-
-       new_subpart->flags = 0;
-
-       if (!strncmp(partdef, "ro", 2)) {
-               new_subpart->flags |= PF_RDONLY;
-               partdef += 2;
-       }
-
-       if (!strncmp(partdef, "lk", 2)) {
-               new_subpart->flags |= PF_POWERUP_LOCK;
-               partdef += 2;
-       }
-
-       *subpart = new_subpart;
-       return 0;
-fail:
-       kfree(new_subpart);
-       return ret;
-}
-
-static void free_subpart(struct cmdline_parts *parts)
-{
-       struct cmdline_subpart *subpart;
-
-       while (parts->subpart) {
-               subpart = parts->subpart;
-               parts->subpart = subpart->next_subpart;
-               kfree(subpart);
-       }
-}
-
-static int parse_parts(struct cmdline_parts **parts, const char *bdevdef)
-{
-       int ret = -EINVAL;
-       char *next;
-       int length;
-       struct cmdline_subpart **next_subpart;
-       struct cmdline_parts *newparts;
-       char buf[BDEVNAME_SIZE + 32 + 4];
-
-       *parts = NULL;
-
-       newparts = kzalloc(sizeof(struct cmdline_parts), GFP_KERNEL);
-       if (!newparts)
-               return -ENOMEM;
-
-       next = strchr(bdevdef, ':');
-       if (!next) {
-               pr_warn("cmdline partition has no block device.");
-               goto fail;
-       }
-
-       length = min_t(int, next - bdevdef, sizeof(newparts->name) - 1);
-       strncpy(newparts->name, bdevdef, length);
-       newparts->name[length] = '\0';
-       newparts->nr_subparts = 0;
-
-       next_subpart = &newparts->subpart;
-
-       while (next && *(++next)) {
-               bdevdef = next;
-               next = strchr(bdevdef, ',');
-
-               length = (!next) ? (sizeof(buf) - 1) :
-                       min_t(int, next - bdevdef, sizeof(buf) - 1);
-
-               strncpy(buf, bdevdef, length);
-               buf[length] = '\0';
-
-               ret = parse_subpart(next_subpart, buf);
-               if (ret)
-                       goto fail;
-
-               newparts->nr_subparts++;
-               next_subpart = &(*next_subpart)->next_subpart;
-       }
-
-       if (!newparts->subpart) {
-               pr_warn("cmdline partition has no valid partition.");
-               ret = -EINVAL;
-               goto fail;
-       }
-
-       *parts = newparts;
-
-       return 0;
-fail:
-       free_subpart(newparts);
-       kfree(newparts);
-       return ret;
-}
-
-void cmdline_parts_free(struct cmdline_parts **parts)
-{
-       struct cmdline_parts *next_parts;
-
-       while (*parts) {
-               next_parts = (*parts)->next_parts;
-               free_subpart(*parts);
-               kfree(*parts);
-               *parts = next_parts;
-       }
-}
-EXPORT_SYMBOL(cmdline_parts_free);
-
-int cmdline_parts_parse(struct cmdline_parts **parts, const char *cmdline)
-{
-       int ret;
-       char *buf;
-       char *pbuf;
-       char *next;
-       struct cmdline_parts **next_parts;
-
-       *parts = NULL;
-
-       next = pbuf = buf = kstrdup(cmdline, GFP_KERNEL);
-       if (!buf)
-               return -ENOMEM;
-
-       next_parts = parts;
-
-       while (next && *pbuf) {
-               next = strchr(pbuf, ';');
-               if (next)
-                       *next = '\0';
-
-               ret = parse_parts(next_parts, pbuf);
-               if (ret)
-                       goto fail;
-
-               if (next)
-                       pbuf = ++next;
-
-               next_parts = &(*next_parts)->next_parts;
-       }
-
-       if (!*parts) {
-               pr_warn("cmdline partition has no valid partition.");
-               ret = -EINVAL;
-               goto fail;
-       }
-
-       ret = 0;
-done:
-       kfree(buf);
-       return ret;
-
-fail:
-       cmdline_parts_free(parts);
-       goto done;
-}
-EXPORT_SYMBOL(cmdline_parts_parse);
-
-struct cmdline_parts *cmdline_parts_find(struct cmdline_parts *parts,
-                                        const char *bdev)
-{
-       while (parts && strncmp(bdev, parts->name, sizeof(parts->name)))
-               parts = parts->next_parts;
-       return parts;
-}
-EXPORT_SYMBOL(cmdline_parts_find);
-
-/*
- *  add_part()
- *    0 success.
- *    1 can not add so many partitions.
- */
-int cmdline_parts_set(struct cmdline_parts *parts, sector_t disk_size,
-                     int slot,
-                     int (*add_part)(int, struct cmdline_subpart *, void *),
-                     void *param)
-{
-       sector_t from = 0;
-       struct cmdline_subpart *subpart;
-
-       for (subpart = parts->subpart; subpart;
-            subpart = subpart->next_subpart, slot++) {
-               if (subpart->from == (sector_t)(~0ULL))
-                       subpart->from = from;
-               else
-                       from = subpart->from;
-
-               if (from >= disk_size)
-                       break;
-
-               if (subpart->size > (disk_size - from))
-                       subpart->size = disk_size - from;
-
-               from += subpart->size;
-
-               if (add_part(slot, subpart, param))
-                       break;
-       }
-
-       return slot;
-}
-EXPORT_SYMBOL(cmdline_parts_set);
index 6e2a649..278593b 100644 (file)
@@ -264,7 +264,6 @@ config SYSV68_PARTITION
 
 config CMDLINE_PARTITION
        bool "Command line partition support" if PARTITION_ADVANCED
-       select BLK_CMDLINE_PARSER
        help
          Say Y here if you want to read the partition table from bootargs.
          The format for the command line is just like mtdparts.
index 8f545c3..482a29e 100644 (file)
  * For further information, see "Documentation/block/cmdline-partition.rst"
  *
  */
+#include <linux/blkdev.h>
+#include <linux/fs.h>
+#include <linux/slab.h>
+#include "check.h"
 
-#include <linux/cmdline-parser.h>
 
-#include "check.h"
+/* partition flags */
+#define PF_RDONLY                   0x01 /* Device is read only */
+#define PF_POWERUP_LOCK             0x02 /* Always locked after reset */
+
+struct cmdline_subpart {
+       char name[BDEVNAME_SIZE]; /* partition name, such as 'rootfs' */
+       sector_t from;
+       sector_t size;
+       int flags;
+       struct cmdline_subpart *next_subpart;
+};
+
+struct cmdline_parts {
+       char name[BDEVNAME_SIZE]; /* block device, such as 'mmcblk0' */
+       unsigned int nr_subparts;
+       struct cmdline_subpart *subpart;
+       struct cmdline_parts *next_parts;
+};
+
+static int parse_subpart(struct cmdline_subpart **subpart, char *partdef)
+{
+       int ret = 0;
+       struct cmdline_subpart *new_subpart;
+
+       *subpart = NULL;
+
+       new_subpart = kzalloc(sizeof(struct cmdline_subpart), GFP_KERNEL);
+       if (!new_subpart)
+               return -ENOMEM;
+
+       if (*partdef == '-') {
+               new_subpart->size = (sector_t)(~0ULL);
+               partdef++;
+       } else {
+               new_subpart->size = (sector_t)memparse(partdef, &partdef);
+               if (new_subpart->size < (sector_t)PAGE_SIZE) {
+                       pr_warn("cmdline partition size is invalid.");
+                       ret = -EINVAL;
+                       goto fail;
+               }
+       }
+
+       if (*partdef == '@') {
+               partdef++;
+               new_subpart->from = (sector_t)memparse(partdef, &partdef);
+       } else {
+               new_subpart->from = (sector_t)(~0ULL);
+       }
+
+       if (*partdef == '(') {
+               int length;
+               char *next = strchr(++partdef, ')');
+
+               if (!next) {
+                       pr_warn("cmdline partition format is invalid.");
+                       ret = -EINVAL;
+                       goto fail;
+               }
+
+               length = min_t(int, next - partdef,
+                              sizeof(new_subpart->name) - 1);
+               strncpy(new_subpart->name, partdef, length);
+               new_subpart->name[length] = '\0';
+
+               partdef = ++next;
+       } else
+               new_subpart->name[0] = '\0';
+
+       new_subpart->flags = 0;
+
+       if (!strncmp(partdef, "ro", 2)) {
+               new_subpart->flags |= PF_RDONLY;
+               partdef += 2;
+       }
+
+       if (!strncmp(partdef, "lk", 2)) {
+               new_subpart->flags |= PF_POWERUP_LOCK;
+               partdef += 2;
+       }
+
+       *subpart = new_subpart;
+       return 0;
+fail:
+       kfree(new_subpart);
+       return ret;
+}
+
+static void free_subpart(struct cmdline_parts *parts)
+{
+       struct cmdline_subpart *subpart;
+
+       while (parts->subpart) {
+               subpart = parts->subpart;
+               parts->subpart = subpart->next_subpart;
+               kfree(subpart);
+       }
+}
+
+static int parse_parts(struct cmdline_parts **parts, const char *bdevdef)
+{
+       int ret = -EINVAL;
+       char *next;
+       int length;
+       struct cmdline_subpart **next_subpart;
+       struct cmdline_parts *newparts;
+       char buf[BDEVNAME_SIZE + 32 + 4];
+
+       *parts = NULL;
+
+       newparts = kzalloc(sizeof(struct cmdline_parts), GFP_KERNEL);
+       if (!newparts)
+               return -ENOMEM;
+
+       next = strchr(bdevdef, ':');
+       if (!next) {
+               pr_warn("cmdline partition has no block device.");
+               goto fail;
+       }
+
+       length = min_t(int, next - bdevdef, sizeof(newparts->name) - 1);
+       strncpy(newparts->name, bdevdef, length);
+       newparts->name[length] = '\0';
+       newparts->nr_subparts = 0;
+
+       next_subpart = &newparts->subpart;
+
+       while (next && *(++next)) {
+               bdevdef = next;
+               next = strchr(bdevdef, ',');
+
+               length = (!next) ? (sizeof(buf) - 1) :
+                       min_t(int, next - bdevdef, sizeof(buf) - 1);
+
+               strncpy(buf, bdevdef, length);
+               buf[length] = '\0';
+
+               ret = parse_subpart(next_subpart, buf);
+               if (ret)
+                       goto fail;
+
+               newparts->nr_subparts++;
+               next_subpart = &(*next_subpart)->next_subpart;
+       }
+
+       if (!newparts->subpart) {
+               pr_warn("cmdline partition has no valid partition.");
+               ret = -EINVAL;
+               goto fail;
+       }
+
+       *parts = newparts;
+
+       return 0;
+fail:
+       free_subpart(newparts);
+       kfree(newparts);
+       return ret;
+}
+
+static void cmdline_parts_free(struct cmdline_parts **parts)
+{
+       struct cmdline_parts *next_parts;
+
+       while (*parts) {
+               next_parts = (*parts)->next_parts;
+               free_subpart(*parts);
+               kfree(*parts);
+               *parts = next_parts;
+       }
+}
+
+static int cmdline_parts_parse(struct cmdline_parts **parts,
+               const char *cmdline)
+{
+       int ret;
+       char *buf;
+       char *pbuf;
+       char *next;
+       struct cmdline_parts **next_parts;
+
+       *parts = NULL;
+
+       next = pbuf = buf = kstrdup(cmdline, GFP_KERNEL);
+       if (!buf)
+               return -ENOMEM;
+
+       next_parts = parts;
+
+       while (next && *pbuf) {
+               next = strchr(pbuf, ';');
+               if (next)
+                       *next = '\0';
+
+               ret = parse_parts(next_parts, pbuf);
+               if (ret)
+                       goto fail;
+
+               if (next)
+                       pbuf = ++next;
+
+               next_parts = &(*next_parts)->next_parts;
+       }
+
+       if (!*parts) {
+               pr_warn("cmdline partition has no valid partition.");
+               ret = -EINVAL;
+               goto fail;
+       }
+
+       ret = 0;
+done:
+       kfree(buf);
+       return ret;
+
+fail:
+       cmdline_parts_free(parts);
+       goto done;
+}
+
+static struct cmdline_parts *cmdline_parts_find(struct cmdline_parts *parts,
+                                        const char *bdev)
+{
+       while (parts && strncmp(bdev, parts->name, sizeof(parts->name)))
+               parts = parts->next_parts;
+       return parts;
+}
 
 static char *cmdline;
 static struct cmdline_parts *bdev_parts;
 
-static int add_part(int slot, struct cmdline_subpart *subpart, void *param)
+static int add_part(int slot, struct cmdline_subpart *subpart,
+               struct parsed_partitions *state)
 {
        int label_min;
        struct partition_meta_info *info;
        char tmp[sizeof(info->volname) + 4];
-       struct parsed_partitions *state = (struct parsed_partitions *)param;
 
        if (slot >= state->limit)
                return 1;
@@ -50,6 +278,35 @@ static int add_part(int slot, struct cmdline_subpart *subpart, void *param)
        return 0;
 }
 
+static int cmdline_parts_set(struct cmdline_parts *parts, sector_t disk_size,
+               struct parsed_partitions *state)
+{
+       sector_t from = 0;
+       struct cmdline_subpart *subpart;
+       int slot = 1;
+
+       for (subpart = parts->subpart; subpart;
+            subpart = subpart->next_subpart, slot++) {
+               if (subpart->from == (sector_t)(~0ULL))
+                       subpart->from = from;
+               else
+                       from = subpart->from;
+
+               if (from >= disk_size)
+                       break;
+
+               if (subpart->size > (disk_size - from))
+                       subpart->size = disk_size - from;
+
+               from += subpart->size;
+
+               if (add_part(slot, subpart, state))
+                       break;
+       }
+
+       return slot;
+}
+
 static int __init cmdline_parts_setup(char *s)
 {
        cmdline = s;
@@ -147,7 +404,7 @@ int cmdline_partition(struct parsed_partitions *state)
 
        disk_size = get_capacity(state->bdev->bd_disk) << 9;
 
-       cmdline_parts_set(parts, disk_size, 1, add_part, (void *)state);
+       cmdline_parts_set(parts, disk_size, state);
        cmdline_parts_verifier(1, state);
 
        strlcat(state->pp_buf, "\n", PAGE_SIZE);
diff --git a/include/linux/cmdline-parser.h b/include/linux/cmdline-parser.h
deleted file mode 100644 (file)
index 68a5418..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Parsing command line, get the partitions information.
- *
- * Written by Cai Zhiyong <caizhiyong@huawei.com>
- *
- */
-#ifndef CMDLINEPARSEH
-#define CMDLINEPARSEH
-
-#include <linux/blkdev.h>
-#include <linux/fs.h>
-#include <linux/slab.h>
-
-/* partition flags */
-#define PF_RDONLY                   0x01 /* Device is read only */
-#define PF_POWERUP_LOCK             0x02 /* Always locked after reset */
-
-struct cmdline_subpart {
-       char name[BDEVNAME_SIZE]; /* partition name, such as 'rootfs' */
-       sector_t from;
-       sector_t size;
-       int flags;
-       struct cmdline_subpart *next_subpart;
-};
-
-struct cmdline_parts {
-       char name[BDEVNAME_SIZE]; /* block device, such as 'mmcblk0' */
-       unsigned int nr_subparts;
-       struct cmdline_subpart *subpart;
-       struct cmdline_parts *next_parts;
-};
-
-void cmdline_parts_free(struct cmdline_parts **parts);
-
-int cmdline_parts_parse(struct cmdline_parts **parts, const char *cmdline);
-
-struct cmdline_parts *cmdline_parts_find(struct cmdline_parts *parts,
-                                        const char *bdev);
-
-int cmdline_parts_set(struct cmdline_parts *parts, sector_t disk_size,
-                     int slot,
-                     int (*add_part)(int, struct cmdline_subpart *, void *),
-                     void *param);
-
-#endif /* CMDLINEPARSEH */