aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/compression.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/compression.c')
-rw-r--r--fs/btrfs/compression.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c
index 4d5cd9624bb3..38c058bcf359 100644
--- a/fs/btrfs/compression.c
+++ b/fs/btrfs/compression.c
@@ -761,10 +761,26 @@ void __init btrfs_init_compress(void)
761 int i; 761 int i;
762 762
763 for (i = 0; i < BTRFS_COMPRESS_TYPES; i++) { 763 for (i = 0; i < BTRFS_COMPRESS_TYPES; i++) {
764 struct list_head *workspace;
765
764 INIT_LIST_HEAD(&btrfs_comp_ws[i].idle_ws); 766 INIT_LIST_HEAD(&btrfs_comp_ws[i].idle_ws);
765 spin_lock_init(&btrfs_comp_ws[i].ws_lock); 767 spin_lock_init(&btrfs_comp_ws[i].ws_lock);
766 atomic_set(&btrfs_comp_ws[i].total_ws, 0); 768 atomic_set(&btrfs_comp_ws[i].total_ws, 0);
767 init_waitqueue_head(&btrfs_comp_ws[i].ws_wait); 769 init_waitqueue_head(&btrfs_comp_ws[i].ws_wait);
770
771 /*
772 * Preallocate one workspace for each compression type so
773 * we can guarantee forward progress in the worst case
774 */
775 workspace = btrfs_compress_op[i]->alloc_workspace();
776 if (IS_ERR(workspace)) {
777 printk(KERN_WARNING
778 "BTRFS: cannot preallocate compression workspace, will try later");
779 } else {
780 atomic_set(&btrfs_comp_ws[i].total_ws, 1);
781 btrfs_comp_ws[i].free_ws = 1;
782 list_add(workspace, &btrfs_comp_ws[i].idle_ws);
783 }
768 } 784 }
769} 785}
770 786