aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/md/md-cluster.c18
-rw-r--r--drivers/md/md-cluster.h15
-rw-r--r--drivers/md/md.c52
-rw-r--r--drivers/md/md.h7
4 files changed, 92 insertions, 0 deletions
diff --git a/drivers/md/md-cluster.c b/drivers/md/md-cluster.c
index bc8ea9d76875..e2235600a72b 100644
--- a/drivers/md/md-cluster.c
+++ b/drivers/md/md-cluster.c
@@ -13,6 +13,7 @@
13#include <linux/dlm.h> 13#include <linux/dlm.h>
14#include <linux/sched.h> 14#include <linux/sched.h>
15#include "md.h" 15#include "md.h"
16#include "md-cluster.h"
16 17
17#define LVB_SIZE 64 18#define LVB_SIZE 64
18 19
@@ -113,15 +114,32 @@ static void lockres_free(struct dlm_lock_resource *res)
113 kfree(res); 114 kfree(res);
114} 115}
115 116
117static int join(struct mddev *mddev, int nodes)
118{
119 return 0;
120}
121
122static int leave(struct mddev *mddev)
123{
124 return 0;
125}
126
127static struct md_cluster_operations cluster_ops = {
128 .join = join,
129 .leave = leave,
130};
131
116static int __init cluster_init(void) 132static int __init cluster_init(void)
117{ 133{
118 pr_warn("md-cluster: EXPERIMENTAL. Use with caution\n"); 134 pr_warn("md-cluster: EXPERIMENTAL. Use with caution\n");
119 pr_info("Registering Cluster MD functions\n"); 135 pr_info("Registering Cluster MD functions\n");
136 register_md_cluster_operations(&cluster_ops, THIS_MODULE);
120 return 0; 137 return 0;
121} 138}
122 139
123static void cluster_exit(void) 140static void cluster_exit(void)
124{ 141{
142 unregister_md_cluster_operations();
125} 143}
126 144
127module_init(cluster_init); 145module_init(cluster_init);
diff --git a/drivers/md/md-cluster.h b/drivers/md/md-cluster.h
new file mode 100644
index 000000000000..aa9f07bd6b96
--- /dev/null
+++ b/drivers/md/md-cluster.h
@@ -0,0 +1,15 @@
1
2
3#ifndef _MD_CLUSTER_H
4#define _MD_CLUSTER_H
5
6#include "md.h"
7
8struct mddev;
9
10struct md_cluster_operations {
11 int (*join)(struct mddev *mddev);
12 int (*leave)(struct mddev *mddev);
13};
14
15#endif /* _MD_CLUSTER_H */
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;
diff --git a/drivers/md/md.h b/drivers/md/md.h
index 318ca8fd430f..018593197c4d 100644
--- a/drivers/md/md.h
+++ b/drivers/md/md.h
@@ -23,6 +23,7 @@
23#include <linux/timer.h> 23#include <linux/timer.h>
24#include <linux/wait.h> 24#include <linux/wait.h>
25#include <linux/workqueue.h> 25#include <linux/workqueue.h>
26#include "md-cluster.h"
26 27
27#define MaxSector (~(sector_t)0) 28#define MaxSector (~(sector_t)0)
28 29
@@ -608,6 +609,11 @@ static inline void safe_put_page(struct page *p)
608 609
609extern int register_md_personality(struct md_personality *p); 610extern int register_md_personality(struct md_personality *p);
610extern int unregister_md_personality(struct md_personality *p); 611extern int unregister_md_personality(struct md_personality *p);
612extern int register_md_cluster_operations(struct md_cluster_operations *ops,
613 struct module *module);
614extern int unregister_md_cluster_operations(void);
615extern int md_setup_cluster(struct mddev *mddev, int nodes);
616extern void md_cluster_stop(struct mddev *mddev);
611extern struct md_thread *md_register_thread( 617extern struct md_thread *md_register_thread(
612 void (*run)(struct md_thread *thread), 618 void (*run)(struct md_thread *thread),
613 struct mddev *mddev, 619 struct mddev *mddev,
@@ -669,4 +675,5 @@ static inline void rdev_dec_pending(struct md_rdev *rdev, struct mddev *mddev)
669 } 675 }
670} 676}
671 677
678extern struct md_cluster_operations *md_cluster_ops;
672#endif /* _MD_MD_H */ 679#endif /* _MD_MD_H */