/* BTRFS_BALANCE_ARGS_* */
        __le64 flags;
 
-       __le64 unused[8];
+       /* BTRFS_BALANCE_ARGS_LIMIT value */
+       __le64 limit;
+
+       __le64 unused[7];
 } __attribute__ ((__packed__));
 
 /*
        cpu->vend = le64_to_cpu(disk->vend);
        cpu->target = le64_to_cpu(disk->target);
        cpu->flags = le64_to_cpu(disk->flags);
+       cpu->limit = le64_to_cpu(disk->limit);
 }
 
 static inline void
        disk->vend = cpu_to_le64(cpu->vend);
        disk->target = cpu_to_le64(cpu->target);
        disk->flags = cpu_to_le64(cpu->flags);
+       disk->limit = cpu_to_le64(cpu->limit);
 }
 
 /* struct btrfs_super_block */
 
                return 0;
        }
 
+       /*
+        * limited by count, must be the last filter
+        */
+       if ((bargs->flags & BTRFS_BALANCE_ARGS_LIMIT)) {
+               if (bargs->limit == 0)
+                       return 0;
+               else
+                       bargs->limit--;
+       }
+
        return 1;
 }
 
        int ret;
        int enospc_errors = 0;
        bool counting = true;
+       u64 limit_data = bctl->data.limit;
+       u64 limit_meta = bctl->meta.limit;
+       u64 limit_sys = bctl->sys.limit;
 
        /* step one make some room on all the devices */
        devices = &fs_info->fs_devices->devices;
        memset(&bctl->stat, 0, sizeof(bctl->stat));
        spin_unlock(&fs_info->balance_lock);
 again:
+       if (!counting) {
+               bctl->data.limit = limit_data;
+               bctl->meta.limit = limit_meta;
+               bctl->sys.limit = limit_sys;
+       }
        key.objectid = BTRFS_FIRST_CHUNK_TREE_OBJECTID;
        key.offset = (u64)-1;
        key.type = BTRFS_CHUNK_ITEM_KEY;
 
 #define BTRFS_BALANCE_ARGS_DEVID       (1ULL << 2)
 #define BTRFS_BALANCE_ARGS_DRANGE      (1ULL << 3)
 #define BTRFS_BALANCE_ARGS_VRANGE      (1ULL << 4)
+#define BTRFS_BALANCE_ARGS_LIMIT       (1ULL << 5)
 
 /*
  * Profile changing flags.  When SOFT is set we won't relocate chunk if
 
 
        __u64 flags;
 
-       __u64 unused[8];
+       __u64 limit;            /* limit number of processed chunks */
+       __u64 unused[7];
 } __attribute__ ((__packed__));
 
 /* report balance progress to userspace */