diff options
-rw-r--r-- | drivers/md/md-cluster.c | 18 | ||||
-rw-r--r-- | drivers/md/md-cluster.h | 15 | ||||
-rw-r--r-- | drivers/md/md.c | 52 | ||||
-rw-r--r-- | drivers/md/md.h | 7 |
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 | ||
117 | static int join(struct mddev *mddev, int nodes) | ||
118 | { | ||
119 | return 0; | ||
120 | } | ||
121 | |||
122 | static int leave(struct mddev *mddev) | ||
123 | { | ||
124 | return 0; | ||
125 | } | ||
126 | |||
127 | static struct md_cluster_operations cluster_ops = { | ||
128 | .join = join, | ||
129 | .leave = leave, | ||
130 | }; | ||
131 | |||
116 | static int __init cluster_init(void) | 132 | static 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 | ||
123 | static void cluster_exit(void) | 140 | static void cluster_exit(void) |
124 | { | 141 | { |
142 | unregister_md_cluster_operations(); | ||
125 | } | 143 | } |
126 | 144 | ||
127 | module_init(cluster_init); | 145 | module_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 | |||
8 | struct mddev; | ||
9 | |||
10 | struct 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 |
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; |
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 | ||
609 | extern int register_md_personality(struct md_personality *p); | 610 | extern int register_md_personality(struct md_personality *p); |
610 | extern int unregister_md_personality(struct md_personality *p); | 611 | extern int unregister_md_personality(struct md_personality *p); |
612 | extern int register_md_cluster_operations(struct md_cluster_operations *ops, | ||
613 | struct module *module); | ||
614 | extern int unregister_md_cluster_operations(void); | ||
615 | extern int md_setup_cluster(struct mddev *mddev, int nodes); | ||
616 | extern void md_cluster_stop(struct mddev *mddev); | ||
611 | extern struct md_thread *md_register_thread( | 617 | extern 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 | ||
678 | extern struct md_cluster_operations *md_cluster_ops; | ||
672 | #endif /* _MD_MD_H */ | 679 | #endif /* _MD_MD_H */ |