linux/drivers/block/aoe/aoemain.c
<<
>>
Prefs
   1/* Copyright (c) 2007 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        aoechr_exit();
  65        aoedev_exit();
  66        aoeblk_exit();          /* free cache after de-allocating bufs */
  67}
  68
  69static int __init
  70aoe_init(void)
  71{
  72        int ret;
  73
  74        ret = aoedev_init();
  75        if (ret)
  76                return ret;
  77        ret = aoechr_init();
  78        if (ret)
  79                goto chr_fail;
  80        ret = aoeblk_init();
  81        if (ret)
  82                goto blk_fail;
  83        ret = aoenet_init();
  84        if (ret)
  85                goto net_fail;
  86        ret = register_blkdev(AOE_MAJOR, DEVICE_NAME);
  87        if (ret < 0) {
  88                printk(KERN_ERR "aoe: can't register major\n");
  89                goto blkreg_fail;
  90        }
  91
  92        printk(KERN_INFO "aoe: AoE v%s initialised.\n", VERSION);
  93        discover_timer(TINIT);
  94        return 0;
  95
  96 blkreg_fail:
  97        aoenet_exit();
  98 net_fail:
  99        aoeblk_exit();
 100 blk_fail:
 101        aoechr_exit();
 102 chr_fail:
 103        aoedev_exit();
 104        
 105        printk(KERN_INFO "aoe: initialisation failure.\n");
 106        return ret;
 107}
 108
 109module_init(aoe_init);
 110module_exit(aoe_exit);
 111
 112