From: Rusty Russell <rusty@rustcorp.com.au>
To: akpm@osdl.org
Cc: linux-kernel@vger.kernel.org
Subject: [PATCH] Module Alias back compat code
Date: Fri, 19 Dec 2003 14:08:47 +1100 [thread overview]
Message-ID: <20031219031034.A38502C06C@lists.samba.org> (raw)
The provides backwards compat for old char and block aliases.
MODULE_ALIAS_BLOCK() and MODULE_ALIAS_CHAR() define aliases of form
"XXX-<major>-<minor>", so we should probe for modules using this
form. Unfortunately in 2.4, block aliases were "XXX-<major>" and
char aliases were of both forms.
Ideally, all modules would now be using MODULE_ALIAS() macros to
define their aliases, and the old configuration files wouldn't
matter as much. Unfortunately, this hasn't happened, so we make
request_module() return the exit status of modprobe, and then
do fallback when probing for char and block devices.
Please apply.
Rusty.
Name: Backwards Compatibility For Old block and char Aliases
Author: Rusty Russell
Status: Tested on 2.6.0
D: MODULE_ALIAS_BLOCK() and MODULE_ALIAS_CHAR() define aliases of form
D: "XXX-<major>-<minor>", so we should probe for modules using this
D: form. Unfortunately in 2.4, block aliases were "XXX-<major>" and
D: char aliases were of both forms.
D:
D: Ideally, all modules would now be using MODULE_ALIAS() macros to
D: define their aliases, and the old configuration files wouldn't
D: matter as much. Unfortunately, this hasn't happened, so we make
D: request_module() return the exit status of modprobe, and then
D: do fallback when probing for char and block devices.
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .1494-linux-2.6.0/drivers/block/genhd.c .1494-linux-2.6.0.updated/drivers/block/genhd.c
--- .1494-linux-2.6.0/drivers/block/genhd.c 2003-10-09 18:02:51.000000000 +1000
+++ .1494-linux-2.6.0.updated/drivers/block/genhd.c 2003-12-19 13:40:15.000000000 +1100
@@ -296,7 +296,9 @@ extern int blk_dev_init(void);
static struct kobject *base_probe(dev_t dev, int *part, void *data)
{
- request_module("block-major-%d", MAJOR(dev));
+ if (request_module("block-major-%d-%d", MAJOR(dev), MINOR(dev)) > 0)
+ /* Make old-style 2.4 aliases work */
+ request_module("block-major-%d", MAJOR(dev));
return NULL;
}
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .1494-linux-2.6.0/fs/char_dev.c .1494-linux-2.6.0.updated/fs/char_dev.c
--- .1494-linux-2.6.0/fs/char_dev.c 2003-11-24 15:42:32.000000000 +1100
+++ .1494-linux-2.6.0.updated/fs/char_dev.c 2003-12-19 13:40:23.000000000 +1100
@@ -434,7 +434,9 @@ void cdev_init(struct cdev *cdev, struct
static struct kobject *base_probe(dev_t dev, int *part, void *data)
{
- request_module("char-major-%d-%d", MAJOR(dev), MINOR(dev));
+ if (request_module("char-major-%d-%d", MAJOR(dev), MINOR(dev)) > 0)
+ /* Make old-style 2.4 aliases work */
+ request_module("char-major-%d", MAJOR(dev));
return NULL;
}
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .1494-linux-2.6.0/include/linux/kmod.h .1494-linux-2.6.0.updated/include/linux/kmod.h
--- .1494-linux-2.6.0/include/linux/kmod.h 2003-09-22 10:28:12.000000000 +1000
+++ .1494-linux-2.6.0.updated/include/linux/kmod.h 2003-12-19 13:26:50.000000000 +1100
@@ -24,6 +24,8 @@
#include <linux/compiler.h>
#ifdef CONFIG_KMOD
+/* modprobe exit status on success, -ve on error. Return value
+ * usually useless though. */
extern int request_module(const char * name, ...) __attribute__ ((format (printf, 1, 2)));
#else
static inline int request_module(const char * name, ...) { return -ENOSYS; }
diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .1494-linux-2.6.0/kernel/kmod.c .1494-linux-2.6.0.updated/kernel/kmod.c
--- .1494-linux-2.6.0/kernel/kmod.c 2003-10-26 14:52:50.000000000 +1100
+++ .1494-linux-2.6.0.updated/kernel/kmod.c 2003-12-19 13:25:48.000000000 +1100
@@ -182,16 +182,21 @@ static int wait_for_helper(void *data)
{
struct subprocess_info *sub_info = data;
pid_t pid;
+ struct k_sigaction sa;
+
+ /* Install a handler: if SIGCLD isn't handled sys_wait4 won't
+ * populate the status, but will return -ECHILD. */
+ sa.sa.sa_handler = SIG_IGN;
+ sa.sa.sa_flags = 0;
+ siginitset(&sa.sa.sa_mask, sigmask(SIGCHLD));
+ do_sigaction(SIGCHLD, &sa, (struct k_sigaction *)0);
+ allow_signal(SIGCHLD);
- sub_info->retval = 0;
pid = kernel_thread(____call_usermodehelper, sub_info, SIGCHLD);
if (pid < 0)
sub_info->retval = pid;
else
- /* We don't have a SIGCHLD signal handler, so this
- * always returns -ECHILD, but the important thing is
- * that it blocks. */
- sys_wait4(pid, NULL, 0, NULL);
+ sys_wait4(pid, &sub_info->retval, 0, NULL);
complete(sub_info->complete);
return 0;
--
Anyone who quotes me in their sig is an idiot. -- Rusty Russell.
next reply other threads:[~2003-12-19 3:10 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-12-19 3:08 Rusty Russell [this message]
2003-12-19 16:16 ` [PATCH] Module Alias back compat code OGAWA Hirofumi
2003-12-21 23:59 ` Rusty Russell
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=20031219031034.A38502C06C@lists.samba.org \
--to=rusty@rustcorp.com.au \
--cc=akpm@osdl.org \
--cc=linux-kernel@vger.kernel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.