Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
aoemain.c
Go to the documentation of this file.
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 <[email protected]>");
15 MODULE_DESCRIPTION("AoE block/char driver for 2.6.2 and newer 2.6 kernels");
17 
18 enum { TINIT, TRUN, TKILL };
19 
20 static void
21 discover_timer(ulong vp)
22 {
23  static struct timer_list t;
24  static volatile ulong die;
25  static spinlock_t lock;
26  ulong flags;
27  enum { DTIMERTICK = HZ * 60 }; /* one minute */
28 
29  switch (vp) {
30  case TINIT:
31  init_timer(&t);
32  spin_lock_init(&lock);
33  t.data = TRUN;
34  t.function = discover_timer;
35  die = 0;
36  case TRUN:
37  spin_lock_irqsave(&lock, flags);
38  if (!die) {
39  t.expires = jiffies + DTIMERTICK;
40  add_timer(&t);
41  }
42  spin_unlock_irqrestore(&lock, flags);
43 
44  aoecmd_cfg(0xffff, 0xff);
45  return;
46  case TKILL:
47  spin_lock_irqsave(&lock, flags);
48  die = 1;
49  spin_unlock_irqrestore(&lock, flags);
50 
51  del_timer_sync(&t);
52  default:
53  return;
54  }
55 }
56 
57 static void
58 aoe_exit(void)
59 {
60  discover_timer(TKILL);
61 
62  aoenet_exit();
64  aoecmd_exit();
65  aoechr_exit();
66  aoedev_exit();
67  aoeblk_exit(); /* free cache after de-allocating bufs */
68 }
69 
70 static int __init
71 aoe_init(void)
72 {
73  int ret;
74 
75  ret = aoedev_init();
76  if (ret)
77  return ret;
78  ret = aoechr_init();
79  if (ret)
80  goto chr_fail;
81  ret = aoeblk_init();
82  if (ret)
83  goto blk_fail;
84  ret = aoenet_init();
85  if (ret)
86  goto net_fail;
87  ret = aoecmd_init();
88  if (ret)
89  goto cmd_fail;
91  if (ret < 0) {
92  printk(KERN_ERR "aoe: can't register major\n");
93  goto blkreg_fail;
94  }
95  printk(KERN_INFO "aoe: AoE v%s initialised.\n", VERSION);
96  discover_timer(TINIT);
97  return 0;
98  blkreg_fail:
99  aoecmd_exit();
100  cmd_fail:
101  aoenet_exit();
102  net_fail:
103  aoeblk_exit();
104  blk_fail:
105  aoechr_exit();
106  chr_fail:
107  aoedev_exit();
108 
109  printk(KERN_INFO "aoe: initialisation failure.\n");
110  return ret;
111 }
112 
113 module_init(aoe_init);
114 module_exit(aoe_exit);
115