return 0;
 }
 
-handle_t *__ext4_journal_start_sb(struct super_block *sb, unsigned int line,
+handle_t *__ext4_journal_start_sb(struct inode *inode,
+                                 struct super_block *sb, unsigned int line,
                                  int type, int blocks, int rsv_blocks,
                                  int revoke_creds)
 {
        journal_t *journal;
        int err;
-
-       trace_ext4_journal_start(sb, blocks, rsv_blocks, revoke_creds,
-                                _RET_IP_);
+       if (inode)
+               trace_ext4_journal_start_inode(inode, blocks, rsv_blocks,
+                                       revoke_creds, type,
+                                       _RET_IP_);
+       else
+               trace_ext4_journal_start_sb(sb, blocks, rsv_blocks,
+                                       revoke_creds, type,
+                                       _RET_IP_);
        err = ext4_journal_check_start(sb);
        if (err < 0)
                return ERR_PTR(err);
 
        __ext4_handle_dirty_metadata(__func__, __LINE__, (handle), (inode), \
                                     (bh))
 
-handle_t *__ext4_journal_start_sb(struct super_block *sb, unsigned int line,
-                                 int type, int blocks, int rsv_blocks,
-                                 int revoke_creds);
+handle_t *__ext4_journal_start_sb(struct inode *inode, struct super_block *sb,
+                                 unsigned int line, int type, int blocks,
+                                 int rsv_blocks, int revoke_creds);
 int __ext4_journal_stop(const char *where, unsigned int line, handle_t *handle);
 
 #define EXT4_NOJOURNAL_MAX_REF_COUNT ((unsigned long) 4096)
 }
 
 #define ext4_journal_start_sb(sb, type, nblocks)                       \
-       __ext4_journal_start_sb((sb), __LINE__, (type), (nblocks), 0,   \
+       __ext4_journal_start_sb(NULL, (sb), __LINE__, (type), (nblocks), 0,\
                                ext4_trans_default_revoke_credits(sb))
 
 #define ext4_journal_start(inode, type, nblocks)                       \
                                             int blocks, int rsv_blocks,
                                             int revoke_creds)
 {
-       return __ext4_journal_start_sb(inode->i_sb, line, type, blocks,
+       return __ext4_journal_start_sb(inode, inode->i_sb, line, type, blocks,
                                       rsv_blocks, revoke_creds);
 }
 
 
                  (unsigned long) __entry->ino)
 );
 
-TRACE_EVENT(ext4_journal_start,
+TRACE_EVENT(ext4_journal_start_sb,
        TP_PROTO(struct super_block *sb, int blocks, int rsv_blocks,
-                int revoke_creds, unsigned long IP),
+                int revoke_creds, int type, unsigned long IP),
 
-       TP_ARGS(sb, blocks, rsv_blocks, revoke_creds, IP),
+       TP_ARGS(sb, blocks, rsv_blocks, revoke_creds, type, IP),
 
        TP_STRUCT__entry(
-               __field(        dev_t,  dev                     )
-               __field(unsigned long,  ip                      )
-               __field(          int,  blocks                  )
-               __field(          int,  rsv_blocks              )
-               __field(          int,  revoke_creds            )
+               __field(        dev_t,          dev             )
+               __field(        unsigned long,  ip              )
+               __field(        int,            blocks          )
+               __field(        int,            rsv_blocks      )
+               __field(        int,            revoke_creds    )
+               __field(        int,            type            )
        ),
 
        TP_fast_assign(
                __entry->blocks          = blocks;
                __entry->rsv_blocks      = rsv_blocks;
                __entry->revoke_creds    = revoke_creds;
+               __entry->type            = type;
+       ),
+
+       TP_printk("dev %d,%d blocks %d, rsv_blocks %d, revoke_creds %d,"
+                 " type %d, caller %pS", MAJOR(__entry->dev),
+                 MINOR(__entry->dev), __entry->blocks, __entry->rsv_blocks,
+                 __entry->revoke_creds, __entry->type, (void *)__entry->ip)
+);
+
+TRACE_EVENT(ext4_journal_start_inode,
+       TP_PROTO(struct inode *inode, int blocks, int rsv_blocks,
+                int revoke_creds, int type, unsigned long IP),
+
+       TP_ARGS(inode, blocks, rsv_blocks, revoke_creds, type, IP),
+
+       TP_STRUCT__entry(
+               __field(        unsigned long,  ino             )
+               __field(        dev_t,          dev             )
+               __field(        unsigned long,  ip              )
+               __field(        int,            blocks          )
+               __field(        int,            rsv_blocks      )
+               __field(        int,            revoke_creds    )
+               __field(        int,            type            )
+       ),
+
+       TP_fast_assign(
+               __entry->dev             = inode->i_sb->s_dev;
+               __entry->ip              = IP;
+               __entry->blocks          = blocks;
+               __entry->rsv_blocks      = rsv_blocks;
+               __entry->revoke_creds    = revoke_creds;
+               __entry->type            = type;
+               __entry->ino             = inode->i_ino;
        ),
 
-       TP_printk("dev %d,%d blocks %d, rsv_blocks %d, revoke_creds %d, "
-                 "caller %pS", MAJOR(__entry->dev), MINOR(__entry->dev),
-                 __entry->blocks, __entry->rsv_blocks, __entry->revoke_creds,
+       TP_printk("dev %d,%d blocks %d, rsv_blocks %d, revoke_creds %d,"
+                 " type %d, ino %lu, caller %pS", MAJOR(__entry->dev),
+                 MINOR(__entry->dev), __entry->blocks, __entry->rsv_blocks,
+                 __entry->revoke_creds, __entry->type, __entry->ino,
                  (void *)__entry->ip)
 );