|
@@ -445,7 +445,7 @@ static void rrpc_lun_gc(struct work_struct *work)
|
|
|
if (nr_blocks_need < rrpc->nr_luns)
|
|
|
nr_blocks_need = rrpc->nr_luns;
|
|
|
|
|
|
- spin_lock(&lun->lock);
|
|
|
+ spin_lock(&rlun->lock);
|
|
|
while (nr_blocks_need > lun->nr_free_blocks &&
|
|
|
!list_empty(&rlun->prio_list)) {
|
|
|
struct rrpc_block *rblock = block_prio_find_max(rlun);
|
|
@@ -454,16 +454,16 @@ static void rrpc_lun_gc(struct work_struct *work)
|
|
|
if (!rblock->nr_invalid_pages)
|
|
|
break;
|
|
|
|
|
|
+ gcb = mempool_alloc(rrpc->gcb_pool, GFP_ATOMIC);
|
|
|
+ if (!gcb)
|
|
|
+ break;
|
|
|
+
|
|
|
list_del_init(&rblock->prio);
|
|
|
|
|
|
BUG_ON(!block_is_full(rrpc, rblock));
|
|
|
|
|
|
pr_debug("rrpc: selected block '%lu' for GC\n", block->id);
|
|
|
|
|
|
- gcb = mempool_alloc(rrpc->gcb_pool, GFP_ATOMIC);
|
|
|
- if (!gcb)
|
|
|
- break;
|
|
|
-
|
|
|
gcb->rrpc = rrpc;
|
|
|
gcb->rblk = rblock;
|
|
|
INIT_WORK(&gcb->ws_gc, rrpc_block_gc);
|
|
@@ -472,7 +472,7 @@ static void rrpc_lun_gc(struct work_struct *work)
|
|
|
|
|
|
nr_blocks_need--;
|
|
|
}
|
|
|
- spin_unlock(&lun->lock);
|
|
|
+ spin_unlock(&rlun->lock);
|
|
|
|
|
|
/* TODO: Hint that request queue can be started again */
|
|
|
}
|