static struct xor_block_template *active_template;
 
 void
-xor_block(unsigned int count, unsigned int bytes, void **ptr)
+xor_blocks(unsigned int count, unsigned int bytes, void **ptr)
 {
        unsigned long *p0, *p1, *p2, *p3, *p4;
 
        p4 = (unsigned long *) ptr[4];
        active_template->do_5(bytes, p0, p1, p2, p3, p4);
 }
+EXPORT_SYMBOL(xor_blocks);
 
 /* Set of all registered templates.  */
 static struct xor_block_template *template_list;
                now = jiffies;
                count = 0;
                while (jiffies == now) {
-                       mb();
+                       mb(); /* prevent loop optimzation */
                        tmpl->do_2(BENCH_SIZE, b1, b2);
                        mb();
                        count++;
        speed = max * (HZ * BENCH_SIZE / 1024);
        tmpl->speed = speed;
 
-       printk("   %-10s: %5d.%03d MB/sec\n", tmpl->name,
+       printk(KERN_INFO "   %-10s: %5d.%03d MB/sec\n", tmpl->name,
               speed / 1000, speed % 1000);
 }
 
-static int
-calibrate_xor_block(void)
+static int __init
+calibrate_xor_blocks(void)
 {
        void *b1, *b2;
        struct xor_block_template *f, *fastest;
 
        b1 = (void *) __get_free_pages(GFP_KERNEL, 2);
-       if (! b1) {
-               printk("raid5: Yikes!  No memory available.\n");
+       if (!b1) {
+               printk(KERN_WARNING "xor: Yikes!  No memory available.\n");
                return -ENOMEM;
        }
        b2 = b1 + 2*PAGE_SIZE + BENCH_SIZE;
 
        /*
-        * If this arch/cpu has a short-circuited selection, don't loop through all
-        * the possible functions, just test the best one
+        * If this arch/cpu has a short-circuited selection, don't loop through
+        * all the possible functions, just test the best one
         */
 
        fastest = NULL;
 #define xor_speed(templ)       do_xor_speed((templ), b1, b2)
 
        if (fastest) {
-               printk(KERN_INFO "raid5: automatically using best checksumming function: %s\n",
+               printk(KERN_INFO "xor: automatically using best "
+                       "checksumming function: %s\n",
                        fastest->name);
                xor_speed(fastest);
        } else {
-               printk(KERN_INFO "raid5: measuring checksumming speed\n");
+               printk(KERN_INFO "xor: measuring checksumming speed\n");
                XOR_TRY_TEMPLATES;
                fastest = template_list;
                for (f = fastest; f; f = f->next)
                                fastest = f;
        }
 
-       printk("raid5: using function: %s (%d.%03d MB/sec)\n",
+       printk(KERN_INFO "xor: using function: %s (%d.%03d MB/sec)\n",
               fastest->name, fastest->speed / 1000, fastest->speed % 1000);
 
 #undef xor_speed
 
 static __exit void xor_exit(void) { }
 
-EXPORT_SYMBOL(xor_block);
 MODULE_LICENSE("GPL");
 
-module_init(calibrate_xor_block);
+/* when built-in xor.o must initialize before drivers/md/md.o */
+core_initcall(calibrate_xor_blocks);
 module_exit(xor_exit);
 
 hostprogs-y    := mktables
 
 # Note: link order is important.  All raid personalities
-# and xor.o must come before md.o, as they each initialise 
+# and must come before md.o, as they each initialise 
 # themselves, and md.o may use the personalities when it 
 # auto-initialised.
 
 obj-$(CONFIG_MD_RAID0)         += raid0.o
 obj-$(CONFIG_MD_RAID1)         += raid1.o
 obj-$(CONFIG_MD_RAID10)                += raid10.o
-obj-$(CONFIG_MD_RAID456)       += raid456.o xor.o
+obj-$(CONFIG_MD_RAID456)       += raid456.o
 obj-$(CONFIG_MD_MULTIPATH)     += multipath.o
 obj-$(CONFIG_MD_FAULTY)                += faulty.o
 obj-$(CONFIG_BLK_DEV_MD)       += md-mod.o
 
 
 #define check_xor()    do {                                            \
                           if (count == MAX_XOR_BLOCKS) {               \
-                               xor_block(count, STRIPE_SIZE, ptr);     \
+                               xor_blocks(count, STRIPE_SIZE, ptr);    \
                                count = 1;                              \
                           }                                            \
                        } while(0)
                check_xor();
        }
        if (count != 1)
-               xor_block(count, STRIPE_SIZE, ptr);
+               xor_blocks(count, STRIPE_SIZE, ptr);
        set_bit(R5_UPTODATE, &sh->dev[dd_idx].flags);
 }
 
                break;
        }
        if (count>1) {
-               xor_block(count, STRIPE_SIZE, ptr);
+               xor_blocks(count, STRIPE_SIZE, ptr);
                count = 1;
        }
        
                        }
        }
        if (count != 1)
-               xor_block(count, STRIPE_SIZE, ptr);
+               xor_blocks(count, STRIPE_SIZE, ptr);
        
        if (method != CHECK_PARITY) {
                set_bit(R5_UPTODATE, &sh->dev[pd_idx].flags);
                        check_xor();
                }
                if (count != 1)
-                       xor_block(count, STRIPE_SIZE, ptr);
+                       xor_blocks(count, STRIPE_SIZE, ptr);
                if (!nozero) set_bit(R5_UPTODATE, &sh->dev[dd_idx].flags);
                else clear_bit(R5_UPTODATE, &sh->dev[dd_idx].flags);
        }