|
@@ -1145,7 +1145,7 @@ int pblk_line_recov_alloc(struct pblk *pblk, struct pblk_line *line)
|
|
}
|
|
}
|
|
spin_unlock(&l_mg->free_lock);
|
|
spin_unlock(&l_mg->free_lock);
|
|
|
|
|
|
- pblk_rl_free_lines_dec(&pblk->rl, line);
|
|
|
|
|
|
+ pblk_rl_free_lines_dec(&pblk->rl, line, true);
|
|
|
|
|
|
if (!pblk_line_init_bb(pblk, line, 0)) {
|
|
if (!pblk_line_init_bb(pblk, line, 0)) {
|
|
list_add(&line->list, &l_mg->free_list);
|
|
list_add(&line->list, &l_mg->free_list);
|
|
@@ -1233,7 +1233,7 @@ retry:
|
|
l_mg->data_line = retry_line;
|
|
l_mg->data_line = retry_line;
|
|
spin_unlock(&l_mg->free_lock);
|
|
spin_unlock(&l_mg->free_lock);
|
|
|
|
|
|
- pblk_rl_free_lines_dec(&pblk->rl, retry_line);
|
|
|
|
|
|
+ pblk_rl_free_lines_dec(&pblk->rl, line, false);
|
|
|
|
|
|
if (pblk_line_erase(pblk, retry_line))
|
|
if (pblk_line_erase(pblk, retry_line))
|
|
goto retry;
|
|
goto retry;
|
|
@@ -1252,7 +1252,6 @@ struct pblk_line *pblk_line_get_first_data(struct pblk *pblk)
|
|
{
|
|
{
|
|
struct pblk_line_mgmt *l_mg = &pblk->l_mg;
|
|
struct pblk_line_mgmt *l_mg = &pblk->l_mg;
|
|
struct pblk_line *line;
|
|
struct pblk_line *line;
|
|
- int is_next = 0;
|
|
|
|
|
|
|
|
spin_lock(&l_mg->free_lock);
|
|
spin_lock(&l_mg->free_lock);
|
|
line = pblk_line_get(pblk);
|
|
line = pblk_line_get(pblk);
|
|
@@ -1280,7 +1279,6 @@ struct pblk_line *pblk_line_get_first_data(struct pblk *pblk)
|
|
} else {
|
|
} else {
|
|
l_mg->data_next->seq_nr = l_mg->d_seq_nr++;
|
|
l_mg->data_next->seq_nr = l_mg->d_seq_nr++;
|
|
l_mg->data_next->type = PBLK_LINETYPE_DATA;
|
|
l_mg->data_next->type = PBLK_LINETYPE_DATA;
|
|
- is_next = 1;
|
|
|
|
}
|
|
}
|
|
spin_unlock(&l_mg->free_lock);
|
|
spin_unlock(&l_mg->free_lock);
|
|
|
|
|
|
@@ -1290,10 +1288,6 @@ struct pblk_line *pblk_line_get_first_data(struct pblk *pblk)
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
- pblk_rl_free_lines_dec(&pblk->rl, line);
|
|
|
|
- if (is_next)
|
|
|
|
- pblk_rl_free_lines_dec(&pblk->rl, l_mg->data_next);
|
|
|
|
-
|
|
|
|
retry_setup:
|
|
retry_setup:
|
|
if (!pblk_line_init_metadata(pblk, line, NULL)) {
|
|
if (!pblk_line_init_metadata(pblk, line, NULL)) {
|
|
line = pblk_line_retry(pblk, line);
|
|
line = pblk_line_retry(pblk, line);
|
|
@@ -1311,6 +1305,8 @@ retry_setup:
|
|
goto retry_setup;
|
|
goto retry_setup;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ pblk_rl_free_lines_dec(&pblk->rl, line, true);
|
|
|
|
+
|
|
return line;
|
|
return line;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1395,7 +1391,6 @@ struct pblk_line *pblk_line_replace_data(struct pblk *pblk)
|
|
struct pblk_line_mgmt *l_mg = &pblk->l_mg;
|
|
struct pblk_line_mgmt *l_mg = &pblk->l_mg;
|
|
struct pblk_line *cur, *new = NULL;
|
|
struct pblk_line *cur, *new = NULL;
|
|
unsigned int left_seblks;
|
|
unsigned int left_seblks;
|
|
- int is_next = 0;
|
|
|
|
|
|
|
|
cur = l_mg->data_line;
|
|
cur = l_mg->data_line;
|
|
new = l_mg->data_next;
|
|
new = l_mg->data_next;
|
|
@@ -1444,6 +1439,8 @@ retry_setup:
|
|
goto retry_setup;
|
|
goto retry_setup;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ pblk_rl_free_lines_dec(&pblk->rl, new, true);
|
|
|
|
+
|
|
/* Allocate next line for preparation */
|
|
/* Allocate next line for preparation */
|
|
spin_lock(&l_mg->free_lock);
|
|
spin_lock(&l_mg->free_lock);
|
|
l_mg->data_next = pblk_line_get(pblk);
|
|
l_mg->data_next = pblk_line_get(pblk);
|
|
@@ -1457,13 +1454,9 @@ retry_setup:
|
|
} else {
|
|
} else {
|
|
l_mg->data_next->seq_nr = l_mg->d_seq_nr++;
|
|
l_mg->data_next->seq_nr = l_mg->d_seq_nr++;
|
|
l_mg->data_next->type = PBLK_LINETYPE_DATA;
|
|
l_mg->data_next->type = PBLK_LINETYPE_DATA;
|
|
- is_next = 1;
|
|
|
|
}
|
|
}
|
|
spin_unlock(&l_mg->free_lock);
|
|
spin_unlock(&l_mg->free_lock);
|
|
|
|
|
|
- if (is_next)
|
|
|
|
- pblk_rl_free_lines_dec(&pblk->rl, l_mg->data_next);
|
|
|
|
-
|
|
|
|
out:
|
|
out:
|
|
return new;
|
|
return new;
|
|
}
|
|
}
|