Linus,
here is a patch for test12 which cleans up the initialisation of raid
personalities. I didn't include it in the previous raid init cleanup
because I hadn't figured out the inner mysteries of link order
completely. The linux-kbuild list helped there.
This patch arranges that each personaility auto-initialised, and
makes sure that all personaility are initialised before md.o gets
initialised.
An earlier form of this (which didn't get the Makefile quite right)
went into test11ac??.
NeilBrown
--- ./drivers/md/Makefile 2000/11/29 05:46:23 1.3
+++ ./drivers/md/Makefile 2000/11/29 06:04:25 1.4
@@ -16,10 +16,13 @@
obj-n :=
obj- :=
-# NOTE: xor.o must link *before* md.o so that auto-detect
-# of raid5 arrays works (and doesn't Oops). Fortunately
-# they are both export-objs, so setting the order here
-# works.
+# Note: link order is important. All raid personalities
+# and xor.o must come before md.o, as they each initialise
+# themselves, and md.o may use the personalities when it
+# auto-initialised.
+# The use of MIX_OBJS allows link order to be maintained even
+# though some are export-objs and some aren't.
+
obj-$(CONFIG_MD_LINEAR) += linear.o
obj-$(CONFIG_MD_RAID0) += raid0.o
obj-$(CONFIG_MD_RAID1) += raid1.o
@@ -28,10 +31,11 @@
obj-$(CONFIG_BLK_DEV_LVM) += lvm-mod.o
# Translate to Rules.make lists.
-O_OBJS := $(filter-out $(export-objs), $(obj-y))
-OX_OBJS := $(filter $(export-objs), $(obj-y))
-M_OBJS := $(sort $(filter-out $(export-objs), $(obj-m)))
-MX_OBJS := $(sort $(filter $(export-objs), $(obj-m)))
+active-objs := $(sort $(obj-y) $(obj-m))
+
+O_OBJS := $(obj-y)
+M_OBJS := $(obj-m)
+MIX_OBJS := $(filter $(export-objs), $(active-objs))
include $(TOPDIR)/Rules.make
--- ./drivers/md/md.c 2000/11/29 04:55:47 1.4
+++ ./drivers/md/md.c 2000/11/29 06:04:25 1.5
@@ -3576,12 +3576,6 @@
create_proc_read_entry("mdstat", 0, NULL, md_status_read_proc, NULL);
#endif
}
-void hsm_init (void);
-void translucent_init (void);
-void linear_init (void);
-void raid0_init (void);
-void raid1_init (void);
-void raid5_init (void);
int md__init md_init (void)
{
@@ -3617,18 +3611,6 @@
md_register_reboot_notifier(&md_notifier);
raid_table_header = register_sysctl_table(raid_root_table, 1);
-#ifdef CONFIG_MD_LINEAR
- linear_init ();
-#endif
-#ifdef CONFIG_MD_RAID0
- raid0_init ();
-#endif
-#ifdef CONFIG_MD_RAID1
- raid1_init ();
-#endif
-#ifdef CONFIG_MD_RAID5
- raid5_init ();
-#endif
md_geninit();
return (0);
}
--- ./drivers/md/raid5.c 2000/11/29 04:16:29 1.2
+++ ./drivers/md/raid5.c 2000/11/29 06:04:25 1.3
@@ -2352,19 +2352,16 @@
sync_request: raid5_sync_request
};
-int raid5_init (void)
+static int md__init raid5_init (void)
{
return register_md_personality (RAID5, &raid5_personality);
}
-#ifdef MODULE
-int init_module (void)
-{
- return raid5_init();
-}
-
-void cleanup_module (void)
+static void raid5_exit (void)
{
unregister_md_personality (RAID5);
}
-#endif
+
+module_init(raid5_init);
+module_exit(raid5_exit);
+
--- ./drivers/md/linear.c 2000/11/29 05:45:04 1.1
+++ ./drivers/md/linear.c 2000/11/29 06:04:25 1.2
@@ -190,24 +190,16 @@
status: linear_status,
};
-#ifndef MODULE
-
-void md__init linear_init (void)
-{
- register_md_personality (LINEAR, &linear_personality);
-}
-
-#else
-
-int init_module (void)
+static int md__init linear_init (void)
{
- return (register_md_personality (LINEAR, &linear_personality));
+ return register_md_personality (LINEAR, &linear_personality);
}
-void cleanup_module (void)
+static void linear_exit (void)
{
unregister_md_personality (LINEAR);
}
-#endif
+module_init(linear_init);
+module_exit(linear_exit);
--- ./drivers/md/raid0.c 2000/11/29 05:45:04 1.1
+++ ./drivers/md/raid0.c 2000/11/29 06:04:25 1.2
@@ -333,24 +333,17 @@
status: raid0_status,
};
-#ifndef MODULE
-
-void raid0_init (void)
-{
- register_md_personality (RAID0, &raid0_personality);
-}
-
-#else
-
-int init_module (void)
+static int md__init raid0_init (void)
{
- return (register_md_personality (RAID0, &raid0_personality));
+ return register_md_personality (RAID0, &raid0_personality);
}
-void cleanup_module (void)
+static void raid0_exit (void)
{
unregister_md_personality (RAID0);
}
-#endif
+module_init(raid0_init);
+module_exit(raid0_exit);
+
--- ./drivers/md/raid1.c 2000/11/29 05:45:04 1.1
+++ ./drivers/md/raid1.c 2000/11/29 06:04:25 1.2
@@ -1882,19 +1882,16 @@
sync_request: raid1_sync_request
};
-int raid1_init (void)
+static int md__init raid1_init (void)
{
return register_md_personality (RAID1, &raid1_personality);
}
-#ifdef MODULE
-int init_module (void)
-{
- return raid1_init();
-}
-
-void cleanup_module (void)
+static void raid1_exit (void)
{
unregister_md_personality (RAID1);
}
-#endif
+
+module_init(raid1_init);
+module_exit(raid1_exit);
+
-
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to [EMAIL PROTECTED]