diff options
-rw-r--r-- | fs/gfs2/incore.h | 1 | ||||
-rw-r--r-- | fs/gfs2/ops_fstype.c | 27 | ||||
-rw-r--r-- | fs/gfs2/sys.c | 57 |
3 files changed, 80 insertions, 5 deletions
diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h index b5d7363b22da..8fcbce48a128 100644 --- a/fs/gfs2/incore.h +++ b/fs/gfs2/incore.h | |||
@@ -460,6 +460,7 @@ enum { | |||
460 | SDF_NOBARRIERS = 3, | 460 | SDF_NOBARRIERS = 3, |
461 | SDF_NORECOVERY = 4, | 461 | SDF_NORECOVERY = 4, |
462 | SDF_DEMOTE = 5, | 462 | SDF_DEMOTE = 5, |
463 | SDF_NOJOURNALID = 6, | ||
463 | }; | 464 | }; |
464 | 465 | ||
465 | #define GFS2_FSNAME_LEN 256 | 466 | #define GFS2_FSNAME_LEN 256 |
diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c index 3593b3a7290e..45a4a36195d8 100644 --- a/fs/gfs2/ops_fstype.c +++ b/fs/gfs2/ops_fstype.c | |||
@@ -76,7 +76,7 @@ static struct gfs2_sbd *init_sbd(struct super_block *sb) | |||
76 | 76 | ||
77 | sb->s_fs_info = sdp; | 77 | sb->s_fs_info = sdp; |
78 | sdp->sd_vfs = sb; | 78 | sdp->sd_vfs = sb; |
79 | 79 | set_bit(SDF_NOJOURNALID, &sdp->sd_flags); | |
80 | gfs2_tune_init(&sdp->sd_tune); | 80 | gfs2_tune_init(&sdp->sd_tune); |
81 | 81 | ||
82 | init_waitqueue_head(&sdp->sd_glock_wait); | 82 | init_waitqueue_head(&sdp->sd_glock_wait); |
@@ -1050,7 +1050,8 @@ static int gfs2_lm_mount(struct gfs2_sbd *sdp, int silent) | |||
1050 | ret = match_int(&tmp[0], &option); | 1050 | ret = match_int(&tmp[0], &option); |
1051 | if (ret || option < 0) | 1051 | if (ret || option < 0) |
1052 | goto hostdata_error; | 1052 | goto hostdata_error; |
1053 | ls->ls_jid = option; | 1053 | if (test_and_clear_bit(SDF_NOJOURNALID, &sdp->sd_flags)) |
1054 | ls->ls_jid = option; | ||
1054 | break; | 1055 | break; |
1055 | case Opt_id: | 1056 | case Opt_id: |
1056 | /* Obsolete, but left for backward compat purposes */ | 1057 | /* Obsolete, but left for backward compat purposes */ |
@@ -1102,6 +1103,24 @@ void gfs2_lm_unmount(struct gfs2_sbd *sdp) | |||
1102 | lm->lm_unmount(sdp); | 1103 | lm->lm_unmount(sdp); |
1103 | } | 1104 | } |
1104 | 1105 | ||
1106 | static int gfs2_journalid_wait(void *word) | ||
1107 | { | ||
1108 | if (signal_pending(current)) | ||
1109 | return -EINTR; | ||
1110 | schedule(); | ||
1111 | return 0; | ||
1112 | } | ||
1113 | |||
1114 | static int wait_on_journal(struct gfs2_sbd *sdp) | ||
1115 | { | ||
1116 | if (sdp->sd_args.ar_spectator) | ||
1117 | return 0; | ||
1118 | if (sdp->sd_lockstruct.ls_ops->lm_mount == NULL) | ||
1119 | return 0; | ||
1120 | |||
1121 | return wait_on_bit(&sdp->sd_flags, SDF_NOJOURNALID, gfs2_journalid_wait, TASK_INTERRUPTIBLE); | ||
1122 | } | ||
1123 | |||
1105 | void gfs2_online_uevent(struct gfs2_sbd *sdp) | 1124 | void gfs2_online_uevent(struct gfs2_sbd *sdp) |
1106 | { | 1125 | { |
1107 | struct super_block *sb = sdp->sd_vfs; | 1126 | struct super_block *sb = sdp->sd_vfs; |
@@ -1194,6 +1213,10 @@ static int fill_super(struct super_block *sb, struct gfs2_args *args, int silent | |||
1194 | if (error) | 1213 | if (error) |
1195 | goto fail_locking; | 1214 | goto fail_locking; |
1196 | 1215 | ||
1216 | error = wait_on_journal(sdp); | ||
1217 | if (error) | ||
1218 | goto fail_sb; | ||
1219 | |||
1197 | error = init_inodes(sdp, DO); | 1220 | error = init_inodes(sdp, DO); |
1198 | if (error) | 1221 | if (error) |
1199 | goto fail_sb; | 1222 | goto fail_sb; |
diff --git a/fs/gfs2/sys.c b/fs/gfs2/sys.c index 37f5393e68e6..d019d0d55e00 100644 --- a/fs/gfs2/sys.c +++ b/fs/gfs2/sys.c | |||
@@ -325,6 +325,30 @@ static ssize_t lkfirst_show(struct gfs2_sbd *sdp, char *buf) | |||
325 | return sprintf(buf, "%d\n", ls->ls_first); | 325 | return sprintf(buf, "%d\n", ls->ls_first); |
326 | } | 326 | } |
327 | 327 | ||
328 | static ssize_t lkfirst_store(struct gfs2_sbd *sdp, const char *buf, size_t len) | ||
329 | { | ||
330 | unsigned first; | ||
331 | int rv; | ||
332 | |||
333 | rv = sscanf(buf, "%u", &first); | ||
334 | if (rv != 1 || first > 1) | ||
335 | return -EINVAL; | ||
336 | spin_lock(&sdp->sd_jindex_spin); | ||
337 | rv = -EBUSY; | ||
338 | if (test_bit(SDF_NOJOURNALID, &sdp->sd_flags) == 0) | ||
339 | goto out; | ||
340 | rv = -EINVAL; | ||
341 | if (sdp->sd_args.ar_spectator) | ||
342 | goto out; | ||
343 | if (sdp->sd_lockstruct.ls_ops->lm_mount == NULL) | ||
344 | goto out; | ||
345 | sdp->sd_lockstruct.ls_first = first; | ||
346 | rv = 0; | ||
347 | out: | ||
348 | spin_unlock(&sdp->sd_jindex_spin); | ||
349 | return rv ? rv : len; | ||
350 | } | ||
351 | |||
328 | static ssize_t first_done_show(struct gfs2_sbd *sdp, char *buf) | 352 | static ssize_t first_done_show(struct gfs2_sbd *sdp, char *buf) |
329 | { | 353 | { |
330 | struct lm_lockstruct *ls = &sdp->sd_lockstruct; | 354 | struct lm_lockstruct *ls = &sdp->sd_lockstruct; |
@@ -377,14 +401,41 @@ static ssize_t jid_show(struct gfs2_sbd *sdp, char *buf) | |||
377 | return sprintf(buf, "%u\n", sdp->sd_lockstruct.ls_jid); | 401 | return sprintf(buf, "%u\n", sdp->sd_lockstruct.ls_jid); |
378 | } | 402 | } |
379 | 403 | ||
404 | static ssize_t jid_store(struct gfs2_sbd *sdp, const char *buf, size_t len) | ||
405 | { | ||
406 | unsigned jid; | ||
407 | int rv; | ||
408 | |||
409 | rv = sscanf(buf, "%u", &jid); | ||
410 | if (rv != 1) | ||
411 | return -EINVAL; | ||
412 | |||
413 | spin_lock(&sdp->sd_jindex_spin); | ||
414 | rv = -EINVAL; | ||
415 | if (sdp->sd_args.ar_spectator) | ||
416 | goto out; | ||
417 | if (sdp->sd_lockstruct.ls_ops->lm_mount == NULL) | ||
418 | goto out; | ||
419 | rv = -EBUSY; | ||
420 | if (test_and_clear_bit(SDF_NOJOURNALID, &sdp->sd_flags) == 0) | ||
421 | goto out; | ||
422 | sdp->sd_lockstruct.ls_jid = jid; | ||
423 | smp_mb__after_clear_bit(); | ||
424 | wake_up_bit(&sdp->sd_flags, SDF_NOJOURNALID); | ||
425 | rv = 0; | ||
426 | out: | ||
427 | spin_unlock(&sdp->sd_jindex_spin); | ||
428 | return rv ? rv : len; | ||
429 | } | ||
430 | |||
380 | #define GDLM_ATTR(_name,_mode,_show,_store) \ | 431 | #define GDLM_ATTR(_name,_mode,_show,_store) \ |
381 | static struct gfs2_attr gdlm_attr_##_name = __ATTR(_name,_mode,_show,_store) | 432 | static struct gfs2_attr gdlm_attr_##_name = __ATTR(_name,_mode,_show,_store) |
382 | 433 | ||
383 | GDLM_ATTR(proto_name, 0444, proto_name_show, NULL); | 434 | GDLM_ATTR(proto_name, 0444, proto_name_show, NULL); |
384 | GDLM_ATTR(block, 0644, block_show, block_store); | 435 | GDLM_ATTR(block, 0644, block_show, block_store); |
385 | GDLM_ATTR(withdraw, 0644, withdraw_show, withdraw_store); | 436 | GDLM_ATTR(withdraw, 0644, withdraw_show, withdraw_store); |
386 | GDLM_ATTR(jid, 0444, jid_show, NULL); | 437 | GDLM_ATTR(jid, 0644, jid_show, jid_store); |
387 | GDLM_ATTR(first, 0444, lkfirst_show, NULL); | 438 | GDLM_ATTR(first, 0644, lkfirst_show, lkfirst_store); |
388 | GDLM_ATTR(first_done, 0444, first_done_show, NULL); | 439 | GDLM_ATTR(first_done, 0444, first_done_show, NULL); |
389 | GDLM_ATTR(recover, 0600, NULL, recover_store); | 440 | GDLM_ATTR(recover, 0600, NULL, recover_store); |
390 | GDLM_ATTR(recover_done, 0444, recover_done_show, NULL); | 441 | GDLM_ATTR(recover_done, 0444, recover_done_show, NULL); |
@@ -564,7 +615,7 @@ static int gfs2_uevent(struct kset *kset, struct kobject *kobj, | |||
564 | 615 | ||
565 | add_uevent_var(env, "LOCKTABLE=%s", sdp->sd_table_name); | 616 | add_uevent_var(env, "LOCKTABLE=%s", sdp->sd_table_name); |
566 | add_uevent_var(env, "LOCKPROTO=%s", sdp->sd_proto_name); | 617 | add_uevent_var(env, "LOCKPROTO=%s", sdp->sd_proto_name); |
567 | if (!sdp->sd_args.ar_spectator) | 618 | if (!test_bit(SDF_NOJOURNALID, &sdp->sd_flags)) |
568 | add_uevent_var(env, "JOURNALID=%u", sdp->sd_lockstruct.ls_jid); | 619 | add_uevent_var(env, "JOURNALID=%u", sdp->sd_lockstruct.ls_jid); |
569 | if (gfs2_uuid_valid(uuid)) | 620 | if (gfs2_uuid_valid(uuid)) |
570 | add_uevent_var(env, "UUID=%pUB", uuid); | 621 | add_uevent_var(env, "UUID=%pUB", uuid); |