aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/md.c
diff options
context:
space:
mode:
authorGoldwyn Rodrigues <rgoldwyn@suse.com>2014-03-29 11:01:53 -0400
committerGoldwyn Rodrigues <rgoldwyn@suse.com>2015-02-23 08:28:42 -0500
commitedb39c9deda87da5aad9c090e2e8eaf8470c852c (patch)
tree22b789f9e6bdcfd892d9f6a7e757e1fe58579795 /drivers/md/md.c
parent47741b7ca7b389d1b45d7cf15edc279c9be32fa8 (diff)
Introduce md_cluster_operations to handle cluster functions
This allows dynamic registering of cluster hooks. Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com>
Diffstat (limited to 'drivers/md/md.c')
-rw-r--r--drivers/md/md.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index c8d2bac4e28b..57ecb51ec5fd 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -53,6 +53,7 @@
53#include <linux/slab.h> 53#include <linux/slab.h>
54#include "md.h" 54#include "md.h"
55#include "bitmap.h" 55#include "bitmap.h"
56#include "md-cluster.h"
56 57
57#ifndef MODULE 58#ifndef MODULE
58static void autostart_arrays(int part); 59static void autostart_arrays(int part);
@@ -66,6 +67,10 @@ static void autostart_arrays(int part);
66static LIST_HEAD(pers_list); 67static LIST_HEAD(pers_list);
67static DEFINE_SPINLOCK(pers_lock); 68static DEFINE_SPINLOCK(pers_lock);
68 69
70struct md_cluster_operations *md_cluster_ops;
71struct module *md_cluster_mod;
72EXPORT_SYMBOL(md_cluster_mod);
73
69static DECLARE_WAIT_QUEUE_HEAD(resync_wait); 74static DECLARE_WAIT_QUEUE_HEAD(resync_wait);
70static struct workqueue_struct *md_wq; 75static struct workqueue_struct *md_wq;
71static struct workqueue_struct *md_misc_wq; 76static struct workqueue_struct *md_misc_wq;
@@ -7231,6 +7236,53 @@ int unregister_md_personality(struct md_personality *p)
7231} 7236}
7232EXPORT_SYMBOL(unregister_md_personality); 7237EXPORT_SYMBOL(unregister_md_personality);
7233 7238
7239int register_md_cluster_operations(struct md_cluster_operations *ops, struct module *module)
7240{
7241 if (md_cluster_ops != NULL)
7242 return -EALREADY;
7243 spin_lock(&pers_lock);
7244 md_cluster_ops = ops;
7245 md_cluster_mod = module;
7246 spin_unlock(&pers_lock);
7247 return 0;
7248}
7249EXPORT_SYMBOL(register_md_cluster_operations);
7250
7251int unregister_md_cluster_operations(void)
7252{
7253 spin_lock(&pers_lock);
7254 md_cluster_ops = NULL;
7255 spin_unlock(&pers_lock);
7256 return 0;
7257}
7258EXPORT_SYMBOL(unregister_md_cluster_operations);
7259
7260int md_setup_cluster(struct mddev *mddev, int nodes)
7261{
7262 int err;
7263
7264 err = request_module("md-cluster");
7265 if (err) {
7266 pr_err("md-cluster module not found.\n");
7267 return err;
7268 }
7269
7270 spin_lock(&pers_lock);
7271 if (!md_cluster_ops || !try_module_get(md_cluster_mod)) {
7272 spin_unlock(&pers_lock);
7273 return -ENOENT;
7274 }
7275 spin_unlock(&pers_lock);
7276
7277 return md_cluster_ops->join(mddev);
7278}
7279
7280void md_cluster_stop(struct mddev *mddev)
7281{
7282 md_cluster_ops->leave(mddev);
7283 module_put(md_cluster_mod);
7284}
7285
7234static int is_mddev_idle(struct mddev *mddev, int init) 7286static int is_mddev_idle(struct mddev *mddev, int init)
7235{ 7287{
7236 struct md_rdev *rdev; 7288 struct md_rdev *rdev;