Re: [PATCH] link failur in Linux 2.4.9-ac16 around apm.o and sysrq.o

Randy.Dunlap (rddunlap@osdlab.org)
Fri, 28 Sep 2001 08:41:53 -0700


junio@siamese.dhis.twinsun.com wrote:
>
> >>>>> "JNH" == junio <junio@siamese.dhis.twinsun.com> writes:
>
> JNH> 2.4.9-ac16 fails to link with CONFIG_APM=y and
> JNH> CONFIG_MAGIC_SYSRQ=n. This is because apm.c unconditionally
> JNH> makes calls to functions (__sysrq_lock_table and friends)
> JNH> defined in sysrq.c.
>
> JNH> I can think of a couple of different approaches to work this
> JNH> around, but is there an established proper way to resolve this
> JNH> kind of dependency in the kernel code?
>
> The approaches I listed as (1) and (3) in my previous message
> are non solutions, since it will result in a kernel where apm.o
> makes calls into sysrq functions, whose proper operations would
> depend on sysrq.o to have been properly initialized by other
> parts of the kernel, which still think CONFIG_MAGIC_SYSRQ is not
> defined.
>
> The below should be a better fix.
>
> --- 2.4.9-ac16.sffix/arch/i386/kernel/apm.c Thu Sep 27 12:46:43 2001
> +++ 2.4.9-ac16.sffix/arch/i386/kernel/apm.c Thu Sep 27 22:41:53 2001
> @@ -201,7 +201,9 @@
> #include <asm/uaccess.h>
> #include <asm/desc.h>
>
> +#ifdef CONFIG_MAGIC_SYSRQ
> #include <linux/sysrq.h>
> +#endif
>
> extern unsigned long get_cmos_time(void);
> extern void machine_real_restart(unsigned char *, int);
> @@ -697,12 +699,16 @@
> struct kbd_struct *kbd, struct tty_struct *tty) {
> apm_power_off();
> }
> +#ifdef CONFIG_MAGIC_SYSRQ
> struct sysrq_key_op sysrq_poweroff_op = {
> handler: handle_poweroff,
> help_msg: "Off",
> action_msg: "Power Off\n"
> };
> -
> +#else
> +# define register_sysrq_key(ig,no) /*re*/
> +# define unregister_sysrq_key(ig,no) /*re*/
> +#endif
>
> #ifdef CONFIG_APM_DO_ENABLE
> static int apm_enable_power_management(int enable)

Yes, that looks like a decent temporary workaround for apm.c.

What should be done (IMO of course) is that
linux/include/linux/sysrq.h should provide empty/null definitions
of [un]register_sysrq_key()... and it did do that until
2.4.9-ac15, but those #defines are( were) untyped, and they
should be typed (i.e., return 0), just as the versions
of them that are present when CONFIG_MAGIC_SYSRQ is #defined.

~Randy
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/