u64 last_trans_log_full_commit;
        unsigned long mount_opt;
        unsigned long compress_type:4;
+       int commit_interval;
        /*
         * It is a suggestive number, the read side is safe even it gets a
         * wrong number because we will write out the data into a regular
 #define BTRFS_MOUNT_CHECK_INTEGRITY_INCLUDING_EXTENT_DATA (1 << 21)
 #define BTRFS_MOUNT_PANIC_ON_FATAL_ERROR       (1 << 22)
 
+#define BTRFS_DEFAULT_COMMIT_INTERVAL  (30)
+
 #define btrfs_clear_opt(o, opt)                ((o) &= ~BTRFS_MOUNT_##opt)
 #define btrfs_set_opt(o, opt)          ((o) |= BTRFS_MOUNT_##opt)
 #define btrfs_raw_test_opt(o, opt)     ((o) & BTRFS_MOUNT_##opt)
 
 
        do {
                cannot_commit = false;
-               delay = HZ * 30;
+               delay = HZ * root->fs_info->commit_interval;
                mutex_lock(&root->fs_info->transaction_kthread_mutex);
 
                spin_lock(&root->fs_info->trans_lock);
 
                now = get_seconds();
                if (cur->state < TRANS_STATE_BLOCKED &&
-                   (now < cur->start_time || now - cur->start_time < 30)) {
+                   (now < cur->start_time ||
+                    now - cur->start_time < root->fs_info->commit_interval)) {
                        spin_unlock(&root->fs_info->trans_lock);
                        delay = HZ * 5;
                        goto sleep;
        fs_info->defrag_inodes = RB_ROOT;
        fs_info->free_chunk_space = 0;
        fs_info->tree_mod_log = RB_ROOT;
+       fs_info->commit_interval = BTRFS_DEFAULT_COMMIT_INTERVAL;
 
        /* readahead state */
        INIT_RADIX_TREE(&fs_info->reada_tree, GFP_NOFS & ~__GFP_WAIT);
 
        Opt_no_space_cache, Opt_recovery, Opt_skip_balance,
        Opt_check_integrity, Opt_check_integrity_including_extent_data,
        Opt_check_integrity_print_mask, Opt_fatal_errors,
+       Opt_commit_interval,
        Opt_err,
 };
 
        {Opt_check_integrity_including_extent_data, "check_int_data"},
        {Opt_check_integrity_print_mask, "check_int_print_mask=%d"},
        {Opt_fatal_errors, "fatal_errors=%s"},
+       {Opt_commit_interval, "commit=%d"},
        {Opt_err, NULL},
 };
 
                                goto out;
                        }
                        break;
+               case Opt_commit_interval:
+                       intarg = 0;
+                       ret = match_int(&args[0], &intarg);
+                       if (ret < 0) {
+                               printk(KERN_ERR
+                                       "btrfs: invalid commit interval\n");
+                               ret = -EINVAL;
+                               goto out;
+                       }
+                       if (intarg > 0) {
+                               if (intarg > 300) {
+                                       printk(KERN_WARNING
+                                           "btrfs: excessive commit interval %d\n",
+                                                       intarg);
+                               }
+                               info->commit_interval = intarg;
+                       } else {
+                               printk(KERN_INFO
+                                   "btrfs: using default commit interval %ds\n",
+                                   BTRFS_DEFAULT_COMMIT_INTERVAL);
+                               info->commit_interval = BTRFS_DEFAULT_COMMIT_INTERVAL;
+                       }
+                       break;
                case Opt_err:
                        printk(KERN_INFO "btrfs: unrecognized mount option "
                               "'%s'\n", p);
                                info->metadata_ratio);
        if (btrfs_test_opt(root, PANIC_ON_FATAL_ERROR))
                seq_puts(seq, ",fatal_errors=panic");
+       if (info->commit_interval != BTRFS_DEFAULT_COMMIT_INTERVAL)
+               seq_printf(seq, ",commit=%d", info->commit_interval);
        return 0;
 }