From: "Jörn Engel" <joern@wohnheim.fh-wedel.de>
To: "Gareth Bult (Encryptec)" <Gareth@Encryptec.net>
Cc: Linux MTD <linux-mtd@lists.infradead.org>
Subject: [PATCH 9/22] Change parameter interface to phram-style
Date: Tue, 21 Dec 2004 14:51:39 +0100 [thread overview]
Message-ID: <20041221135139.GO22636@wohnheim.fh-wedel.de> (raw)
In-Reply-To: <20041221134901.GN22636@wohnheim.fh-wedel.de>
Much nicer. Same interface at boot time, module load and runtime via
/sys/. It also groups by device, so you can add devices on the fly if
you wish to.
Signed-off-by: Jörn Engel <joern@wohnheim.fh-wedel.de>
---
blockmtd.c | 141 +++++++++++++++++++++++++++++++++++++++++--------------------
1 files changed, 97 insertions(+), 44 deletions(-)
--- linux-2.6.9cow/drivers/mtd/devices/blockmtd.c~blockmtd_interface 2004-12-20 21:38:46.000000000 +0100
+++ linux-2.6.9cow/drivers/mtd/devices/blockmtd.c 2004-12-20 22:07:09.000000000 +0100
@@ -33,6 +33,8 @@
#include <linux/mtd/mtd.h>
#include <linux/buffer_head.h>
+#define ERROR(fmt, args...) printk(KERN_ERR "blockmtd: " fmt , ## args)
+
#define err(format, arg...) printk(KERN_ERR "blkmtd: " format "\n" , ## arg)
#define info(format, arg...) printk(KERN_INFO "blkmtd: " format "\n" , ## arg)
#define warn(format, arg...) printk(KERN_WARNING "blkmtd: " format "\n" , ## arg)
@@ -57,18 +59,6 @@
#define MAX_DEVICES 4
-/* Module parameters passed by insmod/modprobe */
-char *device[MAX_DEVICES]; /* the block device to use */
-int erasesz[MAX_DEVICES]; /* optional default erase size */
-
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Simon Evans <spse@secret.org.uk>");
-MODULE_DESCRIPTION("Emulate an MTD using a block device");
-MODULE_PARM(device, "1-4s");
-MODULE_PARM_DESC(device, "block device to use");
-MODULE_PARM(erasesz, "1-4i");
-MODULE_PARM_DESC(erasesz, "optional erase size to use in KiB. eg 4=4KiB.");
#define PAGE_READAHEAD 64
@@ -516,63 +506,122 @@
return NULL;
}
-#ifndef MODULE
-/* Handle kernel boot params */
+static int ustrtoul(const char *cp, char **endp, unsigned int base)
+{
+ unsigned long result = simple_strtoul(cp, endp, base);
+ switch (**endp) {
+ case 'G' :
+ result *= 1024;
+ case 'M':
+ result *= 1024;
+ case 'k':
+ result *= 1024;
+ /* By dwmw2 editorial decree, "ki", "Mi" or "Gi" are to be used. */
+ if ((*endp)[1] == 'i')
+ (*endp) += 2;
+ }
+ return result;
+}
-static int __init param_blkmtd_device(char *str)
+static int parse_num32(u32 *num32, const char *token)
{
- int i;
+ char *endp;
+ unsigned long n;
- for (i = 0; i < MAX_DEVICES; i++) {
- device[i] = str;
- strsep(&str, ",");
- }
- return 1;
+ n = ustrtoul(token, &endp, 0);
+ if (*endp)
+ return -EINVAL;
+
+ *num32 = n;
+ return 0;
}
-static int __init param_blkmtd_erasesz(char *str)
+static int parse_name(char **pname, const char *token, size_t limit)
{
- int i;
- for (i = 0; i < MAX_DEVICES; i++) {
- char *val = strsep(&str, ",");
- if (val)
- erasesz[i] = simple_strtoul(val, NULL, 0);
- }
+ size_t len;
+ char *name;
- return 1;
-}
+ len = strlen(token) + 1;
+ if (len > limit)
+ return -ENOSPC;
+ name = kmalloc(len, GFP_KERNEL);
+ if (!name)
+ return -ENOMEM;
-__setup("blkmtd_device=", param_blkmtd_device);
-__setup("blkmtd_erasesz=", param_blkmtd_erasesz);
+ strcpy(name, token);
-#endif
+ *pname = name;
+ return 0;
+}
-static int __init blockmtd_init(void)
+#define parse_err(fmt, args...) do { \
+ ERROR("blockmtd: " fmt "\n", ## args); \
+ return 0; \
+} while (0)
+
+static int blockmtd_setup(const char *val, struct kernel_param *kp)
{
- int i;
+ char buf[80+12], *str=buf; /* 80 for device, 12 for erase size */
+ char *token[2];
+ char *name;
+ size_t erase_size = 0;
+ int i, ret;
- info("version " VERSION);
- /* Check args - device[0] is the bare minimum */
- if (!device[0]) {
- err("error: missing `device' name\n");
- return -EINVAL;
+ if (strnlen(val, sizeof(buf)) >= sizeof(buf))
+ parse_err("parameter too long");
+
+ strcpy(str, val);
+
+ for (i=0; i<2; i++)
+ token[i] = strsep(&str, ",");
+
+ { /* people dislike typing "echo -n". and it's simple enough */
+ char *newline = strrchr(token[1], '\n');
+ if (newline && !newline[1])
+ *newline = 0;
}
- for (i = 0; i < MAX_DEVICES; i++)
- add_device(device[i], erasesz[i] << 10);
+ if (str)
+ parse_err("too many arguments");
- if (list_empty(&blkmtd_device_list))
- return -EINVAL;
+ if (!token[0])
+ parse_err("no argument");
+
+ ret = parse_name(&name, token[0], 80);
+ if (ret == -ENOMEM)
+ parse_err("out of memory");
+ if (ret == -ENOSPC)
+ parse_err("name too long");
+ if (ret)
+ return 0;
+
+ if (token[1]) {
+ ret = parse_num32(&erase_size, token[1]);
+ if (ret)
+ parse_err("illegal erase size");
+ }
+
+ add_device(name, erase_size);
return 0;
}
+module_param_call(blockmtd, blockmtd_setup, NULL, NULL, 0200);
+MODULE_PARM_DESC(blockmtd, "Device to use. \"blockmtd=<dev>[,<erasesize>]\"");
+
+static int __init blockmtd_init(void)
+{
+ info("version " VERSION);
+ return 0;
+}
+
+
static void __devexit blockmtd_exit(void)
{
struct list_head *temp1, *temp2;
@@ -593,3 +642,7 @@
module_init(blockmtd_init);
module_exit(blockmtd_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Simon Evans <spse@secret.org.uk>");
+MODULE_DESCRIPTION("Emulate an MTD using a block device");
next prev parent reply other threads:[~2004-12-21 13:52 UTC|newest]
Thread overview: 70+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-12-15 23:19 JFFS2 mount time Gareth Bult (Encryptec)
2004-12-16 0:15 ` Josh Boyer
2004-12-16 1:02 ` Gareth Bult (Encryptec)
2004-12-16 12:53 ` Josh Boyer
2004-12-16 21:22 ` Gareth Bult (Encryptec)
2004-12-16 21:28 ` Josh Boyer
2004-12-16 21:47 ` Gareth Bult (Encryptec)
2004-12-17 12:54 ` Josh Boyer
2004-12-17 15:33 ` Gareth Bult (Encryptec)
2004-12-17 16:02 ` Josh Boyer
2004-12-17 16:46 ` Gareth Bult (Encryptec)
2004-12-17 17:08 ` Artem B. Bityuckiy
2004-12-17 17:10 ` Josh Boyer
2004-12-17 17:26 ` Gareth Bult (Encryptec)
2004-12-17 17:35 ` Josh Boyer
2004-12-17 18:09 ` Gareth Bult (Encryptec)
2004-12-17 19:14 ` jasmine
2004-12-17 20:55 ` Gareth Bult (Encryptec)
2004-12-18 16:02 ` Jörn Engel
2004-12-20 16:34 ` Josh Boyer
2004-12-20 17:12 ` Gareth Bult (Encryptec)
2004-12-21 13:09 ` Jörn Engel
2004-12-21 13:24 ` Gareth Bult (Encryptec)
2004-12-21 13:34 ` Jörn Engel
2004-12-18 16:19 ` Jörn Engel
2004-12-18 17:32 ` Gareth Bult (Encryptec)
2004-12-18 17:52 ` Jörn Engel
2004-12-18 18:11 ` Jörn Engel
2004-12-18 20:48 ` Gareth Bult (Encryptec)
2004-12-19 2:44 ` Jörn Engel
2004-12-21 13:30 ` Jörn Engel
2004-12-21 13:39 ` [PATCH 1/22] Add drivers/mtd/devices/blockmtd.c Jörn Engel
2004-12-21 13:41 ` [PATCH 2/22] Add copyrights Jörn Engel
2004-12-21 13:42 ` [PATCH 3/22] Remove read-only option Jörn Engel
2004-12-21 13:44 ` [PATCH 4/22] Change init/exit functions Jörn Engel
2004-12-21 13:45 ` [PATCH 5/22] Remove gcc warnings Jörn Engel
2004-12-21 13:47 ` [PATCH 6/22] Remove debug macros Jörn Engel
2004-12-21 13:48 ` [PATCH 7/22] Lindent Jörn Engel
2004-12-21 13:49 ` [PATCH 8/22] Remove sync interface Jörn Engel
2004-12-21 13:51 ` Jörn Engel [this message]
2004-12-21 13:53 ` [PATCH 10/22] Cleanup macro usage Jörn Engel
2004-12-21 13:54 ` [PATCH 11/22] kfree simplifications Jörn Engel
2004-12-21 13:55 ` [PATCH 12/22] change blockmtd_sync Jörn Engel
2004-12-21 13:57 ` [PATCH 13/22] remove erase regions Jörn Engel
2004-12-21 14:01 ` [PATCH 14/22] Change add_device Jörn Engel
2004-12-21 14:02 ` [PATCH 15/22] Rename unreadable mutex Jörn Engel
2004-12-21 14:03 ` [PATCH 16/22] list changes Jörn Engel
2004-12-21 14:04 ` [PATCH 17/22] Rename central struct Jörn Engel
2004-12-21 14:06 ` [PATCH 18/22] Function renaming Jörn Engel
2004-12-21 14:09 ` [PATCH 19/22] Fold various erase functions Jörn Engel
2004-12-21 14:10 ` [PATCH 20/22] Fold various write functions Jörn Engel
2004-12-21 14:11 ` [PATCH 21/22] Default erase size Jörn Engel
2004-12-21 14:13 ` [PATCH 22/22] Readahead Jörn Engel
2004-12-21 18:42 ` [PATCH 13/22] remove erase regions Christopher Hoover
2004-12-21 18:49 ` Jörn Engel
2004-12-21 21:09 ` Christopher Hoover
2004-12-22 2:47 ` Eric W. Biederman
2004-12-22 8:59 ` Jörn Engel
2004-12-22 10:05 ` Eric W. Biederman
2004-12-22 10:41 ` Jörn Engel
2004-12-21 13:42 ` [PATCH 1/22] Add drivers/mtd/devices/blockmtd.c Gareth Bult (Encryptec)
2004-12-21 14:15 ` Jörn Engel
2004-12-21 13:40 ` JFFS2 mount time Gareth Bult (Encryptec)
2004-12-21 15:00 ` David Woodhouse
[not found] ` <1103644945.10792.175.camel@squizzey.bult.co.uk>
2004-12-21 16:04 ` Jörn Engel
2004-12-16 13:43 ` Ferenc Havasi
2004-12-20 16:01 ` Gareth Bult (Encryptec)
2004-12-20 16:09 ` Ferenc Havasi
2004-12-20 16:39 ` Gareth Bult (Encryptec)
2004-12-20 17:48 ` Gareth Bult (Encryptec)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20041221135139.GO22636@wohnheim.fh-wedel.de \
--to=joern@wohnheim.fh-wedel.de \
--cc=Gareth@Encryptec.net \
--cc=linux-mtd@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox