diff options
author | David Teigland <teigland@redhat.com> | 2012-01-09 17:18:05 -0500 |
---|---|---|
committer | Steven Whitehouse <swhiteho@redhat.com> | 2012-01-11 04:23:05 -0500 |
commit | e0c2a9aa1e68455dc3439e95d85cabcaff073666 (patch) | |
tree | 22e0dea3972d74defb0219fbbcd5c9d395c0bdb3 /fs/gfs2/sys.c | |
parent | e343a895a9f342f239c5e3c5ffc6c0b1707e6244 (diff) |
GFS2: dlm based recovery coordination
This new method of managing recovery is an alternative to
the previous approach of using the userland gfs_controld.
- use dlm slot numbers to assign journal id's
- use dlm recovery callbacks to initiate journal recovery
- use a dlm lock to determine the first node to mount fs
- use a dlm lock to track journals that need recovery
Signed-off-by: David Teigland <teigland@redhat.com>
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
Diffstat (limited to 'fs/gfs2/sys.c')
-rw-r--r-- | fs/gfs2/sys.c | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/fs/gfs2/sys.c b/fs/gfs2/sys.c index 443cabcfcd23..d33172c291ba 100644 --- a/fs/gfs2/sys.c +++ b/fs/gfs2/sys.c | |||
@@ -298,7 +298,7 @@ static ssize_t block_show(struct gfs2_sbd *sdp, char *buf) | |||
298 | ssize_t ret; | 298 | ssize_t ret; |
299 | int val = 0; | 299 | int val = 0; |
300 | 300 | ||
301 | if (test_bit(DFL_BLOCK_LOCKS, &ls->ls_flags)) | 301 | if (test_bit(DFL_BLOCK_LOCKS, &ls->ls_recover_flags)) |
302 | val = 1; | 302 | val = 1; |
303 | ret = sprintf(buf, "%d\n", val); | 303 | ret = sprintf(buf, "%d\n", val); |
304 | return ret; | 304 | return ret; |
@@ -313,9 +313,9 @@ static ssize_t block_store(struct gfs2_sbd *sdp, const char *buf, size_t len) | |||
313 | val = simple_strtol(buf, NULL, 0); | 313 | val = simple_strtol(buf, NULL, 0); |
314 | 314 | ||
315 | if (val == 1) | 315 | if (val == 1) |
316 | set_bit(DFL_BLOCK_LOCKS, &ls->ls_flags); | 316 | set_bit(DFL_BLOCK_LOCKS, &ls->ls_recover_flags); |
317 | else if (val == 0) { | 317 | else if (val == 0) { |
318 | clear_bit(DFL_BLOCK_LOCKS, &ls->ls_flags); | 318 | clear_bit(DFL_BLOCK_LOCKS, &ls->ls_recover_flags); |
319 | smp_mb__after_clear_bit(); | 319 | smp_mb__after_clear_bit(); |
320 | gfs2_glock_thaw(sdp); | 320 | gfs2_glock_thaw(sdp); |
321 | } else { | 321 | } else { |
@@ -350,8 +350,8 @@ static ssize_t lkfirst_store(struct gfs2_sbd *sdp, const char *buf, size_t len) | |||
350 | goto out; | 350 | goto out; |
351 | if (sdp->sd_lockstruct.ls_ops->lm_mount == NULL) | 351 | if (sdp->sd_lockstruct.ls_ops->lm_mount == NULL) |
352 | goto out; | 352 | goto out; |
353 | sdp->sd_lockstruct.ls_first = first; | 353 | sdp->sd_lockstruct.ls_first = first; |
354 | rv = 0; | 354 | rv = 0; |
355 | out: | 355 | out: |
356 | spin_unlock(&sdp->sd_jindex_spin); | 356 | spin_unlock(&sdp->sd_jindex_spin); |
357 | return rv ? rv : len; | 357 | return rv ? rv : len; |
@@ -360,19 +360,14 @@ out: | |||
360 | static ssize_t first_done_show(struct gfs2_sbd *sdp, char *buf) | 360 | static ssize_t first_done_show(struct gfs2_sbd *sdp, char *buf) |
361 | { | 361 | { |
362 | struct lm_lockstruct *ls = &sdp->sd_lockstruct; | 362 | struct lm_lockstruct *ls = &sdp->sd_lockstruct; |
363 | return sprintf(buf, "%d\n", ls->ls_first_done); | 363 | return sprintf(buf, "%d\n", !!test_bit(DFL_FIRST_MOUNT_DONE, &ls->ls_recover_flags)); |
364 | } | 364 | } |
365 | 365 | ||
366 | static ssize_t recover_store(struct gfs2_sbd *sdp, const char *buf, size_t len) | 366 | int gfs2_recover_set(struct gfs2_sbd *sdp, unsigned jid) |
367 | { | 367 | { |
368 | unsigned jid; | ||
369 | struct gfs2_jdesc *jd; | 368 | struct gfs2_jdesc *jd; |
370 | int rv; | 369 | int rv; |
371 | 370 | ||
372 | rv = sscanf(buf, "%u", &jid); | ||
373 | if (rv != 1) | ||
374 | return -EINVAL; | ||
375 | |||
376 | rv = -ESHUTDOWN; | 371 | rv = -ESHUTDOWN; |
377 | spin_lock(&sdp->sd_jindex_spin); | 372 | spin_lock(&sdp->sd_jindex_spin); |
378 | if (test_bit(SDF_NORECOVERY, &sdp->sd_flags)) | 373 | if (test_bit(SDF_NORECOVERY, &sdp->sd_flags)) |
@@ -389,6 +384,20 @@ static ssize_t recover_store(struct gfs2_sbd *sdp, const char *buf, size_t len) | |||
389 | } | 384 | } |
390 | out: | 385 | out: |
391 | spin_unlock(&sdp->sd_jindex_spin); | 386 | spin_unlock(&sdp->sd_jindex_spin); |
387 | return rv; | ||
388 | } | ||
389 | |||
390 | static ssize_t recover_store(struct gfs2_sbd *sdp, const char *buf, size_t len) | ||
391 | { | ||
392 | unsigned jid; | ||
393 | int rv; | ||
394 | |||
395 | rv = sscanf(buf, "%u", &jid); | ||
396 | if (rv != 1) | ||
397 | return -EINVAL; | ||
398 | |||
399 | rv = gfs2_recover_set(sdp, jid); | ||
400 | |||
392 | return rv ? rv : len; | 401 | return rv ? rv : len; |
393 | } | 402 | } |
394 | 403 | ||