1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- /* 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 <[email protected]>");
- MODULE_DESCRIPTION("AoE block/char driver for 2.6.2 and newer 2.6 kernels");
- MODULE_VERSION(VERSION);
- static struct timer_list timer;
- struct workqueue_struct *aoe_wq;
- static void discover_timer(struct timer_list *t)
- {
- mod_timer(t, jiffies + HZ * 60); /* one minute */
- aoecmd_cfg(0xffff, 0xff);
- }
- static void __exit
- 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 */
- destroy_workqueue(aoe_wq);
- }
- static int __init
- aoe_init(void)
- {
- int ret;
- aoe_wq = alloc_workqueue("aoe_wq", 0, 0);
- if (!aoe_wq)
- return -ENOMEM;
- ret = aoedev_init();
- if (ret)
- goto dev_fail;
- 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();
- dev_fail:
- destroy_workqueue(aoe_wq);
- printk(KERN_INFO "aoe: initialisation failure.\n");
- return ret;
- }
- module_init(aoe_init);
- module_exit(aoe_exit);
|