linux/drivers/block/aoe/aoemain.c
<<
>>
Prefs
   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
  13MODULE_LICENSE("GPL");
  14MODULE_AUTHOR("Sam Hopkins <sah@coraid.com>");
  15MODULE_DESCRIPTION("AoE block/char driver for 2.6.2 and newer 2.6 kernels");
  16MODULE_VERSION(VERSION);
  17
  18enum { TINIT, TRUN, TKILL };
  19
  20static void
  21discover_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
  57static void
  58aoe_exit(void)
  59{
  60        discover_timer(TKILL);
  61
  62        aoenet_exit();
  63        unregister_blkdev(AOE_MAJOR, DEVICE_NAME);
  64        aoecmd_exit();
  65        aoechr_exit();
  66        aoedev_exit();
  67        aoeblk_exit();          /* free cache after de-allocating bufs */
  68}
  69
  70static int __init
  71aoe_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;
  90        ret = register_blkdev(AOE_MAJOR, DEVICE_NAME);
  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
 113module_init(aoe_init);
 114module_exit(aoe_exit);
 115
 116