diff options
| -rw-r--r-- | drivers/md/bitmap.c | 1 | ||||
| -rw-r--r-- | drivers/md/bitmap.h | 4 | ||||
| -rw-r--r-- | drivers/md/md-cluster.c | 62 | ||||
| -rw-r--r-- | drivers/md/md-cluster.h | 3 | ||||
| -rw-r--r-- | drivers/md/md.c | 2 | ||||
| -rw-r--r-- | drivers/md/md.h | 1 | 
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; | 
| 641 | out: | 642 | out: | 
| 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 { | |||
| 30 | struct md_cluster_info { | 30 | struct 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 | ||
| 141 | static void recover_prep(void *arg) | ||
| 142 | { | ||
| 143 | } | ||
| 144 | |||
| 145 | static 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 | |||
| 156 | static 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 | |||
| 167 | static 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 | |||
| 139 | static int join(struct mddev *mddev, int nodes) | 173 | static 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; | 
| 167 | err: | 206 | err: | 
| 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 | */ | ||
| 230 | static 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 | |||
| 186 | static struct md_cluster_operations cluster_ops = { | 237 | static 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 | ||
| 191 | static int __init cluster_init(void) | 243 | static 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 @@ | |||
| 8 | struct mddev; | 8 | struct mddev; | 
| 9 | 9 | ||
| 10 | struct md_cluster_operations { | 10 | struct 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 | ||
| 7283 | void md_cluster_stop(struct mddev *mddev) | 7283 | void 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 */ | 
