Merge tag 'fixes-for-5.3-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/mtd...
[linux-2.6-microblaze.git] / fs / btrfs / zstd.c
index 6b9e29d..3837ca1 100644 (file)
@@ -90,6 +90,9 @@ static inline struct workspace *list_to_workspace(struct list_head *list)
        return container_of(list, struct workspace, list);
 }
 
+static void zstd_free_workspace(struct list_head *ws);
+static struct list_head *zstd_alloc_workspace(unsigned int level);
+
 /*
  * zstd_reclaim_timer_fn - reclaim timer
  * @t: timer
@@ -102,10 +105,10 @@ static void zstd_reclaim_timer_fn(struct timer_list *timer)
        unsigned long reclaim_threshold = jiffies - ZSTD_BTRFS_RECLAIM_JIFFIES;
        struct list_head *pos, *next;
 
-       spin_lock(&wsm.lock);
+       spin_lock_bh(&wsm.lock);
 
        if (list_empty(&wsm.lru_list)) {
-               spin_unlock(&wsm.lock);
+               spin_unlock_bh(&wsm.lock);
                return;
        }
 
@@ -124,7 +127,7 @@ static void zstd_reclaim_timer_fn(struct timer_list *timer)
                level = victim->level;
                list_del(&victim->lru_list);
                list_del(&victim->list);
-               wsm.ops->free_workspace(&victim->list);
+               zstd_free_workspace(&victim->list);
 
                if (list_empty(&wsm.idle_ws[level - 1]))
                        clear_bit(level - 1, &wsm.active_map);
@@ -134,7 +137,7 @@ static void zstd_reclaim_timer_fn(struct timer_list *timer)
        if (!list_empty(&wsm.lru_list))
                mod_timer(&wsm.timer, jiffies + ZSTD_BTRFS_RECLAIM_JIFFIES);
 
-       spin_unlock(&wsm.lock);
+       spin_unlock_bh(&wsm.lock);
 }
 
 /*
@@ -180,7 +183,7 @@ static void zstd_init_workspace_manager(void)
        for (i = 0; i < ZSTD_BTRFS_MAX_LEVEL; i++)
                INIT_LIST_HEAD(&wsm.idle_ws[i]);
 
-       ws = wsm.ops->alloc_workspace(ZSTD_BTRFS_MAX_LEVEL);
+       ws = zstd_alloc_workspace(ZSTD_BTRFS_MAX_LEVEL);
        if (IS_ERR(ws)) {
                pr_warn(
                "BTRFS: cannot preallocate zstd compression workspace\n");
@@ -195,17 +198,17 @@ static void zstd_cleanup_workspace_manager(void)
        struct workspace *workspace;
        int i;
 
-       spin_lock(&wsm.lock);
+       spin_lock_bh(&wsm.lock);
        for (i = 0; i < ZSTD_BTRFS_MAX_LEVEL; i++) {
                while (!list_empty(&wsm.idle_ws[i])) {
                        workspace = container_of(wsm.idle_ws[i].next,
                                                 struct workspace, list);
                        list_del(&workspace->list);
                        list_del(&workspace->lru_list);
-                       wsm.ops->free_workspace(&workspace->list);
+                       zstd_free_workspace(&workspace->list);
                }
        }
-       spin_unlock(&wsm.lock);
+       spin_unlock_bh(&wsm.lock);
 
        del_timer_sync(&wsm.timer);
 }
@@ -227,7 +230,7 @@ static struct list_head *zstd_find_workspace(unsigned int level)
        struct workspace *workspace;
        int i = level - 1;
 
-       spin_lock(&wsm.lock);
+       spin_lock_bh(&wsm.lock);
        for_each_set_bit_from(i, &wsm.active_map, ZSTD_BTRFS_MAX_LEVEL) {
                if (!list_empty(&wsm.idle_ws[i])) {
                        ws = wsm.idle_ws[i].next;
@@ -239,11 +242,11 @@ static struct list_head *zstd_find_workspace(unsigned int level)
                                list_del(&workspace->lru_list);
                        if (list_empty(&wsm.idle_ws[i]))
                                clear_bit(i, &wsm.active_map);
-                       spin_unlock(&wsm.lock);
+                       spin_unlock_bh(&wsm.lock);
                        return ws;
                }
        }
-       spin_unlock(&wsm.lock);
+       spin_unlock_bh(&wsm.lock);
 
        return NULL;
 }
@@ -272,7 +275,7 @@ again:
                return ws;
 
        nofs_flag = memalloc_nofs_save();
-       ws = wsm.ops->alloc_workspace(level);
+       ws = zstd_alloc_workspace(level);
        memalloc_nofs_restore(nofs_flag);
 
        if (IS_ERR(ws)) {
@@ -302,7 +305,7 @@ static void zstd_put_workspace(struct list_head *ws)
 {
        struct workspace *workspace = list_to_workspace(ws);
 
-       spin_lock(&wsm.lock);
+       spin_lock_bh(&wsm.lock);
 
        /* A node is only taken off the lru if we are the corresponding level */
        if (workspace->req_level == workspace->level) {
@@ -322,7 +325,7 @@ static void zstd_put_workspace(struct list_head *ws)
        list_add(&workspace->list, &wsm.idle_ws[workspace->level - 1]);
        workspace->req_level = 0;
 
-       spin_unlock(&wsm.lock);
+       spin_unlock_bh(&wsm.lock);
 
        if (workspace->level == ZSTD_BTRFS_MAX_LEVEL)
                cond_wake_up(&wsm.wait);