1 | /* Copyright (c) 2012 Coraid, Inc. See COPYING for GPL terms. */ |
2 | /* |
3 | * aoemain.c |
4 | * Module initialization routines, discover timer |
5 | */ |
6 | |
7 | #include <linux/hdreg.h> |
8 | #include <linux/blkdev.h> |
9 | #include <linux/module.h> |
10 | #include <linux/skbuff.h> |
11 | #include "aoe.h" |
12 | |
13 | MODULE_LICENSE("GPL" ); |
14 | MODULE_AUTHOR("Sam Hopkins <sah@coraid.com>" ); |
15 | MODULE_DESCRIPTION("AoE block/char driver for 2.6.2 and newer 2.6 kernels" ); |
16 | MODULE_VERSION(VERSION); |
17 | |
18 | static struct timer_list timer; |
19 | struct workqueue_struct *aoe_wq; |
20 | |
21 | static void discover_timer(struct timer_list *t) |
22 | { |
23 | mod_timer(timer: t, expires: jiffies + HZ * 60); /* one minute */ |
24 | |
25 | aoecmd_cfg(aoemajor: 0xffff, aoeminor: 0xff); |
26 | } |
27 | |
28 | static void __exit |
29 | aoe_exit(void) |
30 | { |
31 | del_timer_sync(timer: &timer); |
32 | |
33 | aoenet_exit(); |
34 | unregister_blkdev(AOE_MAJOR, DEVICE_NAME); |
35 | aoecmd_exit(); |
36 | aoechr_exit(); |
37 | aoedev_exit(); |
38 | aoeblk_exit(); /* free cache after de-allocating bufs */ |
39 | destroy_workqueue(wq: aoe_wq); |
40 | } |
41 | |
42 | static int __init |
43 | aoe_init(void) |
44 | { |
45 | int ret; |
46 | |
47 | aoe_wq = alloc_workqueue(fmt: "aoe_wq" , flags: 0, max_active: 0); |
48 | if (!aoe_wq) |
49 | return -ENOMEM; |
50 | |
51 | ret = aoedev_init(); |
52 | if (ret) |
53 | goto dev_fail; |
54 | ret = aoechr_init(); |
55 | if (ret) |
56 | goto chr_fail; |
57 | ret = aoeblk_init(); |
58 | if (ret) |
59 | goto blk_fail; |
60 | ret = aoenet_init(); |
61 | if (ret) |
62 | goto net_fail; |
63 | ret = aoecmd_init(); |
64 | if (ret) |
65 | goto cmd_fail; |
66 | ret = register_blkdev(AOE_MAJOR, DEVICE_NAME); |
67 | if (ret < 0) { |
68 | printk(KERN_ERR "aoe: can't register major\n" ); |
69 | goto blkreg_fail; |
70 | } |
71 | printk(KERN_INFO "aoe: AoE v%s initialised.\n" , VERSION); |
72 | |
73 | timer_setup(&timer, discover_timer, 0); |
74 | discover_timer(t: &timer); |
75 | return 0; |
76 | blkreg_fail: |
77 | aoecmd_exit(); |
78 | cmd_fail: |
79 | aoenet_exit(); |
80 | net_fail: |
81 | aoeblk_exit(); |
82 | blk_fail: |
83 | aoechr_exit(); |
84 | chr_fail: |
85 | aoedev_exit(); |
86 | dev_fail: |
87 | destroy_workqueue(wq: aoe_wq); |
88 | |
89 | printk(KERN_INFO "aoe: initialisation failure.\n" ); |
90 | return ret; |
91 | } |
92 | |
93 | module_init(aoe_init); |
94 | module_exit(aoe_exit); |
95 | |
96 | |