| /* Copyright (c) 2012 Coraid, Inc. See COPYING for GPL terms. */ |
| /* |
| * aoemain.c |
| * Module initialization routines, discover timer |
| */ |
| |
| #include <linux/hdreg.h> |
| #include <linux/blkdev.h> |
| #include <linux/module.h> |
| #include <linux/skbuff.h> |
| #include "aoe.h" |
| |
| MODULE_LICENSE("GPL"); |
| MODULE_AUTHOR("Sam Hopkins <sah@coraid.com>"); |
| MODULE_DESCRIPTION("AoE block/char driver for 2.6.2 and newer 2.6 kernels"); |
| MODULE_VERSION(VERSION); |
| |
| static struct timer_list timer; |
| |
| static void discover_timer(struct timer_list *t) |
| { |
| mod_timer(t, jiffies + HZ * 60); /* one minute */ |
| |
| aoecmd_cfg(0xffff, 0xff); |
| } |
| |
| static void |
| aoe_exit(void) |
| { |
| del_timer_sync(&timer); |
| |
| aoenet_exit(); |
| unregister_blkdev(AOE_MAJOR, DEVICE_NAME); |
| aoecmd_exit(); |
| aoechr_exit(); |
| aoedev_exit(); |
| aoeblk_exit(); /* free cache after de-allocating bufs */ |
| } |
| |
| static int __init |
| aoe_init(void) |
| { |
| int ret; |
| |
| ret = aoedev_init(); |
| if (ret) |
| return ret; |
| ret = aoechr_init(); |
| if (ret) |
| goto chr_fail; |
| ret = aoeblk_init(); |
| if (ret) |
| goto blk_fail; |
| ret = aoenet_init(); |
| if (ret) |
| goto net_fail; |
| ret = aoecmd_init(); |
| if (ret) |
| goto cmd_fail; |
| ret = register_blkdev(AOE_MAJOR, DEVICE_NAME); |
| if (ret < 0) { |
| printk(KERN_ERR "aoe: can't register major\n"); |
| goto blkreg_fail; |
| } |
| printk(KERN_INFO "aoe: AoE v%s initialised.\n", VERSION); |
| |
| timer_setup(&timer, discover_timer, 0); |
| discover_timer(&timer); |
| return 0; |
| blkreg_fail: |
| aoecmd_exit(); |
| cmd_fail: |
| aoenet_exit(); |
| net_fail: |
| aoeblk_exit(); |
| blk_fail: |
| aoechr_exit(); |
| chr_fail: |
| aoedev_exit(); |
| |
| printk(KERN_INFO "aoe: initialisation failure.\n"); |
| return ret; |
| } |
| |
| module_init(aoe_init); |
| module_exit(aoe_exit); |
| |