diff options
author | Goldwyn Rodrigues <rgoldwyn@suse.com> | 2014-03-29 11:01:53 -0400 |
---|---|---|
committer | Goldwyn Rodrigues <rgoldwyn@suse.com> | 2015-02-23 08:28:42 -0500 |
commit | edb39c9deda87da5aad9c090e2e8eaf8470c852c (patch) | |
tree | 22b789f9e6bdcfd892d9f6a7e757e1fe58579795 /drivers/md/md.c | |
parent | 47741b7ca7b389d1b45d7cf15edc279c9be32fa8 (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.c | 52 |
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 |
58 | static void autostart_arrays(int part); | 59 | static void autostart_arrays(int part); |
@@ -66,6 +67,10 @@ static void autostart_arrays(int part); | |||
66 | static LIST_HEAD(pers_list); | 67 | static LIST_HEAD(pers_list); |
67 | static DEFINE_SPINLOCK(pers_lock); | 68 | static DEFINE_SPINLOCK(pers_lock); |
68 | 69 | ||
70 | struct md_cluster_operations *md_cluster_ops; | ||
71 | struct module *md_cluster_mod; | ||
72 | EXPORT_SYMBOL(md_cluster_mod); | ||
73 | |||
69 | static DECLARE_WAIT_QUEUE_HEAD(resync_wait); | 74 | static DECLARE_WAIT_QUEUE_HEAD(resync_wait); |
70 | static struct workqueue_struct *md_wq; | 75 | static struct workqueue_struct *md_wq; |
71 | static struct workqueue_struct *md_misc_wq; | 76 | static struct workqueue_struct *md_misc_wq; |
@@ -7231,6 +7236,53 @@ int unregister_md_personality(struct md_personality *p) | |||
7231 | } | 7236 | } |
7232 | EXPORT_SYMBOL(unregister_md_personality); | 7237 | EXPORT_SYMBOL(unregister_md_personality); |
7233 | 7238 | ||
7239 | int 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 | } | ||
7249 | EXPORT_SYMBOL(register_md_cluster_operations); | ||
7250 | |||
7251 | int 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 | } | ||
7258 | EXPORT_SYMBOL(unregister_md_cluster_operations); | ||
7259 | |||
7260 | int 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 | |||
7280 | void md_cluster_stop(struct mddev *mddev) | ||
7281 | { | ||
7282 | md_cluster_ops->leave(mddev); | ||
7283 | module_put(md_cluster_mod); | ||
7284 | } | ||
7285 | |||
7234 | static int is_mddev_idle(struct mddev *mddev, int init) | 7286 | static int is_mddev_idle(struct mddev *mddev, int init) |
7235 | { | 7287 | { |
7236 | struct md_rdev *rdev; | 7288 | struct md_rdev *rdev; |