aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/md/bitmap.c1
-rw-r--r--drivers/md/bitmap.h4
-rw-r--r--drivers/md/md-cluster.c62
-rw-r--r--drivers/md/md-cluster.h3
-rw-r--r--drivers/md/md.c2
-rw-r--r--drivers/md/md.h1
6 files changed, 64 insertions, 9 deletions
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c
index e2aacca46911..b43a75a246e7 100644
--- a/drivers/md/bitmap.c
+++ b/drivers/md/bitmap.c
@@ -637,6 +637,7 @@ static int bitmap_read_sb(struct bitmap *bitmap)
637 if (le32_to_cpu(sb->version) == BITMAP_MAJOR_HOSTENDIAN) 637 if (le32_to_cpu(sb->version) == BITMAP_MAJOR_HOSTENDIAN)
638 set_bit(BITMAP_HOSTENDIAN, &bitmap->flags); 638 set_bit(BITMAP_HOSTENDIAN, &bitmap->flags);
639 bitmap->events_cleared = le64_to_cpu(sb->events_cleared); 639 bitmap->events_cleared = le64_to_cpu(sb->events_cleared);
640 strlcpy(bitmap->mddev->bitmap_info.cluster_name, sb->cluster_name, 64);
640 err = 0; 641 err = 0;
641out: 642out:
642 kunmap_atomic(sb); 643 kunmap_atomic(sb);
diff --git a/drivers/md/bitmap.h b/drivers/md/bitmap.h
index f4e53eadb083..ec9032f105b8 100644
--- a/drivers/md/bitmap.h
+++ b/drivers/md/bitmap.h
@@ -130,9 +130,9 @@ typedef struct bitmap_super_s {
130 __le32 write_behind; /* 60 number of outstanding write-behind writes */ 130 __le32 write_behind; /* 60 number of outstanding write-behind writes */
131 __le32 sectors_reserved; /* 64 number of 512-byte sectors that are 131 __le32 sectors_reserved; /* 64 number of 512-byte sectors that are
132 * reserved for the bitmap. */ 132 * reserved for the bitmap. */
133
134 __le32 nodes; /* 68 the maximum number of nodes in cluster. */ 133 __le32 nodes; /* 68 the maximum number of nodes in cluster. */
135 __u8 pad[256 - 72]; /* set to zero */ 134 __u8 cluster_name[64]; /* 72 cluster name to which this md belongs */
135 __u8 pad[256 - 136]; /* set to zero */
136} bitmap_super_t; 136} bitmap_super_t;
137 137
138/* notes: 138/* notes:
diff --git a/drivers/md/md-cluster.c b/drivers/md/md-cluster.c
index d141d4812c8c..1f3c8f39ecb2 100644
--- a/drivers/md/md-cluster.c
+++ b/drivers/md/md-cluster.c
@@ -30,6 +30,8 @@ struct dlm_lock_resource {
30struct md_cluster_info { 30struct md_cluster_info {
31 /* dlm lock space and resources for clustered raid. */ 31 /* dlm lock space and resources for clustered raid. */
32 dlm_lockspace_t *lockspace; 32 dlm_lockspace_t *lockspace;
33 int slot_number;
34 struct completion completion;
33 struct dlm_lock_resource *sb_lock; 35 struct dlm_lock_resource *sb_lock;
34 struct mutex sb_mutex; 36 struct mutex sb_mutex;
35}; 37};
@@ -136,10 +138,42 @@ static char *pretty_uuid(char *dest, char *src)
136 return dest; 138 return dest;
137} 139}
138 140
141static void recover_prep(void *arg)
142{
143}
144
145static void recover_slot(void *arg, struct dlm_slot *slot)
146{
147 struct mddev *mddev = arg;
148 struct md_cluster_info *cinfo = mddev->cluster_info;
149
150 pr_info("md-cluster: %s Node %d/%d down. My slot: %d. Initiating recovery.\n",
151 mddev->bitmap_info.cluster_name,
152 slot->nodeid, slot->slot,
153 cinfo->slot_number);
154}
155
156static void recover_done(void *arg, struct dlm_slot *slots,
157 int num_slots, int our_slot,
158 uint32_t generation)
159{
160 struct mddev *mddev = arg;
161 struct md_cluster_info *cinfo = mddev->cluster_info;
162
163 cinfo->slot_number = our_slot;
164 complete(&cinfo->completion);
165}
166
167static const struct dlm_lockspace_ops md_ls_ops = {
168 .recover_prep = recover_prep,
169 .recover_slot = recover_slot,
170 .recover_done = recover_done,
171};
172
139static int join(struct mddev *mddev, int nodes) 173static int join(struct mddev *mddev, int nodes)
140{ 174{
141 struct md_cluster_info *cinfo; 175 struct md_cluster_info *cinfo;
142 int ret; 176 int ret, ops_rv;
143 char str[64]; 177 char str[64];
144 178
145 if (!try_module_get(THIS_MODULE)) 179 if (!try_module_get(THIS_MODULE))
@@ -149,24 +183,30 @@ static int join(struct mddev *mddev, int nodes)
149 if (!cinfo) 183 if (!cinfo)
150 return -ENOMEM; 184 return -ENOMEM;
151 185
186 init_completion(&cinfo->completion);
187
188 mutex_init(&cinfo->sb_mutex);
189 mddev->cluster_info = cinfo;
190
152 memset(str, 0, 64); 191 memset(str, 0, 64);
153 pretty_uuid(str, mddev->uuid); 192 pretty_uuid(str, mddev->uuid);
154 ret = dlm_new_lockspace(str, NULL, DLM_LSFL_FS, LVB_SIZE, 193 ret = dlm_new_lockspace(str, mddev->bitmap_info.cluster_name,
155 NULL, NULL, NULL, &cinfo->lockspace); 194 DLM_LSFL_FS, LVB_SIZE,
195 &md_ls_ops, mddev, &ops_rv, &cinfo->lockspace);
156 if (ret) 196 if (ret)
157 goto err; 197 goto err;
198 wait_for_completion(&cinfo->completion);
158 cinfo->sb_lock = lockres_init(mddev, "cmd-super", 199 cinfo->sb_lock = lockres_init(mddev, "cmd-super",
159 NULL, 0); 200 NULL, 0);
160 if (!cinfo->sb_lock) { 201 if (!cinfo->sb_lock) {
161 ret = -ENOMEM; 202 ret = -ENOMEM;
162 goto err; 203 goto err;
163 } 204 }
164 mutex_init(&cinfo->sb_mutex);
165 mddev->cluster_info = cinfo;
166 return 0; 205 return 0;
167err: 206err:
168 if (cinfo->lockspace) 207 if (cinfo->lockspace)
169 dlm_release_lockspace(cinfo->lockspace, 2); 208 dlm_release_lockspace(cinfo->lockspace, 2);
209 mddev->cluster_info = NULL;
170 kfree(cinfo); 210 kfree(cinfo);
171 module_put(THIS_MODULE); 211 module_put(THIS_MODULE);
172 return ret; 212 return ret;
@@ -183,9 +223,21 @@ static int leave(struct mddev *mddev)
183 return 0; 223 return 0;
184} 224}
185 225
226/* slot_number(): Returns the MD slot number to use
227 * DLM starts the slot numbers from 1, wheras cluster-md
228 * wants the number to be from zero, so we deduct one
229 */
230static int slot_number(struct mddev *mddev)
231{
232 struct md_cluster_info *cinfo = mddev->cluster_info;
233
234 return cinfo->slot_number - 1;
235}
236
186static struct md_cluster_operations cluster_ops = { 237static struct md_cluster_operations cluster_ops = {
187 .join = join, 238 .join = join,
188 .leave = leave, 239 .leave = leave,
240 .slot_number = slot_number,
189}; 241};
190 242
191static int __init cluster_init(void) 243static int __init cluster_init(void)
diff --git a/drivers/md/md-cluster.h b/drivers/md/md-cluster.h
index aa9f07bd6b96..52a21e0d6dbc 100644
--- a/drivers/md/md-cluster.h
+++ b/drivers/md/md-cluster.h
@@ -8,8 +8,9 @@
8struct mddev; 8struct mddev;
9 9
10struct md_cluster_operations { 10struct md_cluster_operations {
11 int (*join)(struct mddev *mddev); 11 int (*join)(struct mddev *mddev, int nodes);
12 int (*leave)(struct mddev *mddev); 12 int (*leave)(struct mddev *mddev);
13 int (*slot_number)(struct mddev *mddev);
13}; 14};
14 15
15#endif /* _MD_CLUSTER_H */ 16#endif /* _MD_CLUSTER_H */
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 5ed57688e5c5..8f310d98f082 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -7277,7 +7277,7 @@ int md_setup_cluster(struct mddev *mddev, int nodes)
7277 } 7277 }
7278 spin_unlock(&pers_lock); 7278 spin_unlock(&pers_lock);
7279 7279
7280 return md_cluster_ops->join(mddev); 7280 return md_cluster_ops->join(mddev, nodes);
7281} 7281}
7282 7282
7283void md_cluster_stop(struct mddev *mddev) 7283void md_cluster_stop(struct mddev *mddev)
diff --git a/drivers/md/md.h b/drivers/md/md.h
index 80fc89976915..81e568090d8f 100644
--- a/drivers/md/md.h
+++ b/drivers/md/md.h
@@ -434,6 +434,7 @@ struct mddev {
434 unsigned long max_write_behind; /* write-behind mode */ 434 unsigned long max_write_behind; /* write-behind mode */
435 int external; 435 int external;
436 int nodes; /* Maximum number of nodes in the cluster */ 436 int nodes; /* Maximum number of nodes in the cluster */
437 char cluster_name[64]; /* Name of the cluster */
437 } bitmap_info; 438 } bitmap_info;
438 439
439 atomic_t max_corr_read_errors; /* max read retries */ 440 atomic_t max_corr_read_errors; /* max read retries */