diff options
| -rw-r--r-- | fs/btrfs/compression.c | 16 |
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 | ||
