]> Pileus Git - ~andy/linux/blobdiff - fs/gfs2/recovery.c
Merge branch 'topic/convert-bint' into topic/hda
[~andy/linux] / fs / gfs2 / recovery.c
index f2a02edcac8f43e9de1dd22fd4c72ac7347f39a5..963b2d75200c7fc5ae62591f458133540178db30 100644 (file)
@@ -436,12 +436,16 @@ static void gfs2_recovery_done(struct gfs2_sbd *sdp, unsigned int jid,
        char env_status[20];
        char *envp[] = { env_jid, env_status, NULL };
        struct lm_lockstruct *ls = &sdp->sd_lockstruct;
+
         ls->ls_recover_jid_done = jid;
         ls->ls_recover_jid_status = message;
        sprintf(env_jid, "JID=%d", jid);
        sprintf(env_status, "RECOVERY=%s",
                message == LM_RD_SUCCESS ? "Done" : "Failed");
         kobject_uevent_env(&sdp->sd_kobj, KOBJ_CHANGE, envp);
+
+       if (sdp->sd_lockstruct.ls_ops->lm_recovery_result)
+               sdp->sd_lockstruct.ls_ops->lm_recovery_result(sdp, jid, message);
 }
 
 void gfs2_recover_func(struct work_struct *work)
@@ -512,7 +516,9 @@ void gfs2_recover_func(struct work_struct *work)
                if (error)
                        goto fail_gunlock_ji;
 
-               if (test_bit(SDF_JOURNAL_CHECKED, &sdp->sd_flags)) {
+               if (test_bit(SDF_RORECOVERY, &sdp->sd_flags)) {
+                       ro = 1;
+               } else if (test_bit(SDF_JOURNAL_CHECKED, &sdp->sd_flags)) {
                        if (!test_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags))
                                ro = 1;
                } else {
@@ -577,6 +583,7 @@ fail_gunlock_j:
 
        fs_info(sdp, "jid=%u: %s\n", jd->jd_jid, (error) ? "Failed" : "Done");
 fail:
+       jd->jd_recover_error = error;
        gfs2_recovery_done(sdp, jd->jd_jid, LM_RD_GAVEUP);
 done:
        clear_bit(JDF_RECOVERY, &jd->jd_flags);
@@ -605,6 +612,6 @@ int gfs2_recover_journal(struct gfs2_jdesc *jd, bool wait)
                wait_on_bit(&jd->jd_flags, JDF_RECOVERY, gfs2_recovery_wait,
                            TASK_UNINTERRUPTIBLE);
 
-       return 0;
+       return wait ? jd->jd_recover_error : 0;
 }