struct kobj_attribute *a, char *buf)
 {
        struct btrfs_fs_info *fs_info = to_fs_info(kobj);
+       u64 now = ktime_get_ns();
+       u64 start_time = fs_info->commit_stats.critical_section_start_time;
+       u64 pending = 0;
+
+       if (start_time)
+               pending = now - start_time;
 
        return sysfs_emit(buf,
                "commits %llu\n"
+               "cur_commit_ms %llu\n"
                "last_commit_ms %llu\n"
                "max_commit_ms %llu\n"
                "total_commit_ms %llu\n",
                fs_info->commit_stats.commit_count,
+               div_u64(pending, NSEC_PER_MSEC),
                div_u64(fs_info->commit_stats.last_commit_dur, NSEC_PER_MSEC),
                div_u64(fs_info->commit_stats.max_commit_dur, NSEC_PER_MSEC),
                div_u64(fs_info->commit_stats.total_commit_dur, NSEC_PER_MSEC));
 
        list_add(&trans->pending_snapshot->list, &cur_trans->pending_snapshots);
 }
 
-static void update_commit_stats(struct btrfs_fs_info *fs_info, ktime_t interval)
+static void update_commit_stats(struct btrfs_fs_info *fs_info)
 {
+       ktime_t now = ktime_get_ns();
+       ktime_t interval = now - fs_info->commit_stats.critical_section_start_time;
+
+       ASSERT(fs_info->commit_stats.critical_section_start_time);
+
        fs_info->commit_stats.commit_count++;
        fs_info->commit_stats.last_commit_dur = interval;
        fs_info->commit_stats.max_commit_dur =
                        max_t(u64, fs_info->commit_stats.max_commit_dur, interval);
        fs_info->commit_stats.total_commit_dur += interval;
+       fs_info->commit_stats.critical_section_start_time = 0;
 }
 
 int btrfs_commit_transaction(struct btrfs_trans_handle *trans)
        struct btrfs_transaction *cur_trans = trans->transaction;
        struct btrfs_transaction *prev_trans = NULL;
        int ret;
-       ktime_t start_time;
-       ktime_t interval;
 
        ASSERT(refcount_read(&trans->use_count) == 1);
        btrfs_trans_state_lockdep_acquire(fs_info, BTRFS_LOCKDEP_TRANS_COMMIT_PREP);
         * Get the time spent on the work done by the commit thread and not
         * the time spent waiting on a previous commit
         */
-       start_time = ktime_get_ns();
-
+       fs_info->commit_stats.critical_section_start_time = ktime_get_ns();
        extwriter_counter_dec(cur_trans, trans->type);
 
        ret = btrfs_start_delalloc_flush(fs_info);
        if (ret)
                goto scrub_continue;
 
+       update_commit_stats(fs_info);
        /*
         * We needn't acquire the lock here because there is no other task
         * which can change it.
 
        trace_btrfs_transaction_commit(fs_info);
 
-       interval = ktime_get_ns() - start_time;
-
        btrfs_scrub_continue(fs_info);
 
        if (current->journal_info == trans)
 
        kmem_cache_free(btrfs_trans_handle_cachep, trans);
 
-       update_commit_stats(fs_info, interval);
-
        return ret;
 
 unlock_reloc: