diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index 7728a4c..8888815 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -290,10 +290,53 @@ int __ext4_journal_stop(const char *where,
unsigned int line, handle_t *handle)
       return err;
 }

+/* record error messages after journal super block */
+static void ext4_record_journal_err(struct super_block *sb, const char *where,
+               const char *function, const char *fmt, va_list args)
+{
+#define MSGLEN 256
+       journal_t *journal = EXT4_SB(sb)->s_journal;
+       char *buf;
+       unsigned long offset;
+       int len;
+
+       if (!journal)
+               return;
+
+       buf = (char *)journal->j_superblock;
+       offset = (unsigned long)buf % sb->s_blocksize;
+       buf += sizeof(journal_superblock_t);
+       offset += sizeof(journal_superblock_t);
+
+       /* seek to end of message buffer */
+       while (offset < sb->s_blocksize && *buf) {
+               buf += MSGLEN;
+               offset += MSGLEN;
+       }
+
+       if (offset+MSGLEN > sb->s_blocksize)
+               /* no space left in message buffer */
+               return;
+
+       len = snprintf(buf, MSGLEN, "%s: %s: ", where, function);
+       len += vsnprintf(buf+len, MSGLEN-len, fmt, args);
+}
+
+static void ext4_record_journal_errstr(struct super_block *sb,
+               const char *where, const char *function, ...)
+{
+       va_list args;
+
+       va_start(args, function);
+       ext4_record_journal_err(sb, where, function, "%s\n", args);
+       va_end(args);
+}
+
 void ext4_journal_abort_handle(const char *caller, unsigned int line,
                              const char *err_fn, struct buffer_head *bh,
                              handle_t *handle, int err)
 {
+       struct super_block *sb = handle->h_transaction->t_journal->j_private;
       char nbuf[16];
       const char *errstr = ext4_decode_error(NULL, err, nbuf);
