aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGoldwyn Rodrigues <rgoldwyn@suse.com>2014-03-30 01:42:49 -0400
committerGoldwyn Rodrigues <rgoldwyn@suse.com>2015-02-23 08:30:11 -0500
commitcf921cc19cf7c1e99f730a2faa02d80817d684a2 (patch)
tree702ad727e3310bc64b890bbe3195e50c3944370f
parentca8895d9bb41e743271c42a4438a296de891b73b (diff)
Add node recovery callbacks
DLM offers callbacks when a node fails and the lock remastery is performed: 1. recover_prep: called when DLM discovers a node is down 2. recover_slot: called when DLM identifies the node and recovery can start 3. recover_done: called when all nodes have completed recover_slot recover_slot() and recover_done() are also called when the node joins initially in order to inform the node with its slot number. These slot numbers start from one, so we deduct one to make it start with zero which the cluster-md code uses. Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com>
-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 */