set_bit(EXT4_FLAGS_SHUTDOWN, &sbi->s_ext4_flags);
                if (sbi->s_journal && !is_journal_aborted(sbi->s_journal)) {
                        (void) ext4_force_commit(sb);
-                       jbd2_journal_abort(sbi->s_journal, 0);
+                       jbd2_journal_abort(sbi->s_journal, -ESHUTDOWN);
                }
                break;
        case EXT4_GOING_FLAGS_NOLOGFLUSH:
                set_bit(EXT4_FLAGS_SHUTDOWN, &sbi->s_ext4_flags);
                if (sbi->s_journal && !is_journal_aborted(sbi->s_journal))
-                       jbd2_journal_abort(sbi->s_journal, 0);
+                       jbd2_journal_abort(sbi->s_journal, -ESHUTDOWN);
                break;
        default:
                return -EINVAL;
 
 void jbd2_journal_update_sb_errno(journal_t *journal)
 {
        journal_superblock_t *sb = journal->j_superblock;
+       int errcode;
 
        read_lock(&journal->j_state_lock);
-       jbd_debug(1, "JBD2: updating superblock error (errno %d)\n",
-                 journal->j_errno);
-       sb->s_errno    = cpu_to_be32(journal->j_errno);
+       errcode = journal->j_errno;
        read_unlock(&journal->j_state_lock);
+       if (errcode == -ESHUTDOWN)
+               errcode = 0;
+       jbd_debug(1, "JBD2: updating superblock error (errno %d)\n", errcode);
+       sb->s_errno    = cpu_to_be32(errcode);
 
        jbd2_write_superblock(journal, REQ_SYNC | REQ_FUA);
 }
  * but don't do any other IO. */
 static void __journal_abort_soft (journal_t *journal, int errno)
 {
-       if (journal->j_flags & JBD2_ABORT)
-               return;
+       int old_errno;
 
-       if (!journal->j_errno)
+       write_lock(&journal->j_state_lock);
+       old_errno = journal->j_errno;
+       if (!journal->j_errno || errno == -ESHUTDOWN)
                journal->j_errno = errno;
 
+       if (journal->j_flags & JBD2_ABORT) {
+               write_unlock(&journal->j_state_lock);
+               if (!old_errno && old_errno != -ESHUTDOWN &&
+                   errno == -ESHUTDOWN)
+                       jbd2_journal_update_sb_errno(journal);
+               return;
+       }
+       write_unlock(&journal->j_state_lock);
+
        __jbd2_journal_abort_hard(journal);
 
        if (errno) {