Rename [pl]blk_alloc to [pl]bat
This commit is contained in:
parent
b80d80215b
commit
8ff29f0262
|
@ -58,17 +58,17 @@ struct zone_cache {
|
|||
u8* lz4_wrkmem;
|
||||
u8* lz4_cbuf;
|
||||
|
||||
/* Currently cached zone pblk alloc info (if any) */
|
||||
u32 pblk_alloc_idx;
|
||||
bool pblk_alloc_dirty;
|
||||
void* pblk_alloc;
|
||||
/* Currently cached zone pbat (if any) */
|
||||
bool pbat_data_cached;
|
||||
bool pbat_data_dirty;
|
||||
void* pbat_buf;
|
||||
|
||||
/* Currently cached zone lblk alloc info (if any) */
|
||||
u64 lblk_alloc_pblk;
|
||||
u32 lblk_alloc_len;
|
||||
void* lblk_alloc;
|
||||
u64 lblk_alloc_elem_lblk;
|
||||
struct lblk_alloc_elem* lblk_alloc_elem;
|
||||
u64 lbat_data_pblk;
|
||||
u32 lbat_data_len;
|
||||
void* lbat_buf;
|
||||
u64 lbat_elem_lblk;
|
||||
struct lbat_elem* lbat_elem;
|
||||
|
||||
/* Currently cached lblk data (if any) */
|
||||
u64 lblk_num;
|
||||
|
@ -265,35 +265,35 @@ blkdev_pblk_write(struct dm_compress* dc, u64 pblk, u32 count, void *data)
|
|||
**************************************/
|
||||
|
||||
static int
|
||||
pblk_alloc_write(struct dm_compress* dc, struct zone_cache* zc)
|
||||
pbat_write(struct dm_compress* dc, struct zone_cache* zc)
|
||||
{
|
||||
u64 pblk;
|
||||
u32 count;
|
||||
void* pg;
|
||||
|
||||
BUG_ON(zc->pblk_alloc_idx == ZONE_NONE);
|
||||
pblk = pblk_alloc_off(&dc->params, zc->pblk_alloc_idx);
|
||||
count = pblk_alloc_len(&dc->params);
|
||||
BUG_ON(!zc->pbat_data_cached);
|
||||
pblk = pbat_off(&dc->params, zc->zone);
|
||||
count = pbat_len(&dc->params);
|
||||
|
||||
pg = compress_alloc_pages(PBLK_SIZE);
|
||||
if (!pg) {
|
||||
return -ENOMEM;
|
||||
}
|
||||
memcpy(pg, zc->pblk_alloc, count * PBLK_SIZE);
|
||||
memcpy(pg, zc->pbat_buf, count * PBLK_SIZE);
|
||||
blkdev_pblk_write(dc, pblk, count, pg);
|
||||
|
||||
zc->pblk_alloc_dirty = false;
|
||||
zc->pbat_data_dirty = false;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
pblk_alloc_flush(struct dm_compress* dc, struct zone_cache* zc)
|
||||
pbat_flush(struct dm_compress* dc, struct zone_cache* zc)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
if (zc->pblk_alloc_dirty) {
|
||||
ret = pblk_alloc_write(dc, zc);
|
||||
if (zc->pbat_data_dirty) {
|
||||
ret = pbat_write(dc, zc);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
@ -301,64 +301,60 @@ pblk_alloc_flush(struct dm_compress* dc, struct zone_cache* zc)
|
|||
|
||||
/* Read zone physical block alloc bitmap */
|
||||
static int
|
||||
pblk_alloc_read(struct dm_compress* dc, struct zone_cache* zc)
|
||||
pbat_read(struct dm_compress* dc, struct zone_cache* zc)
|
||||
{
|
||||
int ret;
|
||||
u64 pblk;
|
||||
u32 count;
|
||||
|
||||
if (zc->pblk_alloc_idx == zc->zone) {
|
||||
if (zc->pbat_data_cached) {
|
||||
return 0;
|
||||
}
|
||||
ret = pblk_alloc_flush(dc, zc);
|
||||
ret = pbat_flush(dc, zc);
|
||||
if (ret) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
pblk = pblk_alloc_off(&dc->params, zc->zone);
|
||||
count = pblk_alloc_len(&dc->params);
|
||||
pblk = pbat_off(&dc->params, zc->zone);
|
||||
count = pbat_len(&dc->params);
|
||||
|
||||
ret = blkdev_pblk_read(dc, pblk, count, zc->pblk_alloc);
|
||||
ret = blkdev_pblk_read(dc, pblk, count, zc->pbat_buf);
|
||||
if (ret) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
zc->pblk_alloc_idx = zc->zone;
|
||||
zc->pbat_data_cached = true;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static u64
|
||||
__pblk_alloc_get(struct dm_compress* dc, struct zone_cache* zc)
|
||||
__pbat_alloc(struct dm_compress* dc, struct zone_cache* zc)
|
||||
{
|
||||
u32 pblk_count = pblk_alloc_len(&dc->params) * PBLK_SIZE_BITS;
|
||||
u32 pblk_count = pbat_len(&dc->params) * PBLK_SIZE_BITS;
|
||||
u32 idx;
|
||||
|
||||
if (pblk_alloc_read(dc, zc) != 0) {
|
||||
printk(KERN_ERR "%s: pblk_alloc_read failed\n", __func__);
|
||||
if (pbat_read(dc, zc) != 0) {
|
||||
printk(KERN_ERR "%s: pbat_read failed\n", __func__);
|
||||
return PBLK_NONE;
|
||||
}
|
||||
idx = cbd_bitmap_alloc(zc->pblk_alloc, pblk_count);
|
||||
idx = cbd_bitmap_alloc(zc->pbat_buf, pblk_count);
|
||||
if (idx == pblk_count) {
|
||||
return PBLK_NONE;
|
||||
}
|
||||
zc->pblk_alloc_dirty = true;
|
||||
zc->pbat_data_dirty = true;
|
||||
|
||||
return idx;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get (allocate) one pblk from the currently cached zone pblk alloc bitmap.
|
||||
* XXX: get rid of this function and use pblk_alloc directly in lblk_write().
|
||||
*/
|
||||
static u64
|
||||
pblk_alloc_get(struct dm_compress* dc, struct zone_cache* zc_hint)
|
||||
pbat_alloc(struct dm_compress* dc, struct zone_cache* zc_hint)
|
||||
{
|
||||
u64 pblk;
|
||||
u32 zone_off;
|
||||
struct zone_cache* zc;
|
||||
|
||||
pblk = __pblk_alloc_get(dc, zc_hint);
|
||||
pblk = __pbat_alloc(dc, zc_hint);
|
||||
if (pblk != PBLK_NONE) {
|
||||
return zone_data_off(&dc->params, zc_hint->zone) + pblk;
|
||||
}
|
||||
|
@ -368,7 +364,7 @@ pblk_alloc_get(struct dm_compress* dc, struct zone_cache* zc_hint)
|
|||
if (zone_off <= zc_hint->zone) {
|
||||
zc = zone_cache_get(dc, zc_hint->zone - zone_off);
|
||||
if (zc) {
|
||||
pblk = __pblk_alloc_get(dc, zc);
|
||||
pblk = __pbat_alloc(dc, zc);
|
||||
if (zone_cache_put(dc, zc) != 0) {
|
||||
return PBLK_NONE;
|
||||
}
|
||||
|
@ -380,7 +376,7 @@ pblk_alloc_get(struct dm_compress* dc, struct zone_cache* zc_hint)
|
|||
if (zc_hint->zone + zone_off < dc->params.nr_zones) {
|
||||
zc = zone_cache_get(dc, zc_hint->zone + zone_off);
|
||||
if (zc) {
|
||||
pblk = __pblk_alloc_get(dc, zc);
|
||||
pblk = __pbat_alloc(dc, zc);
|
||||
if (zone_cache_put(dc, zc) != 0) {
|
||||
return PBLK_NONE;
|
||||
}
|
||||
|
@ -396,13 +392,13 @@ pblk_alloc_get(struct dm_compress* dc, struct zone_cache* zc_hint)
|
|||
}
|
||||
|
||||
/*
|
||||
* Put (free) one pblk into the currently cached zone pblk alloc bitmap.
|
||||
* XXX: get rid of this function and use pblk_free directly in lblk_write().
|
||||
* XXX: When fine grained locking is in place, we won't need the zc param
|
||||
* or the put_zone flag.
|
||||
*/
|
||||
static int
|
||||
pblk_alloc_put(struct dm_compress* dc, struct zone_cache* zc, u64 pblk)
|
||||
pbat_free(struct dm_compress* dc, struct zone_cache* zc, u64 pblk)
|
||||
{
|
||||
u32 zone_pblk_count = pblk_alloc_len(&dc->params) * PBLK_SIZE_BITS;
|
||||
u32 zone_pblk_count = pbat_len(&dc->params) * PBLK_SIZE_BITS;
|
||||
bool put_zone = false;
|
||||
u32 zone;
|
||||
u32 idx;
|
||||
|
@ -432,12 +428,12 @@ pblk_alloc_put(struct dm_compress* dc, struct zone_cache* zc, u64 pblk)
|
|||
put_zone = true;
|
||||
}
|
||||
|
||||
ret = pblk_alloc_read(dc, zc);
|
||||
ret = pbat_read(dc, zc);
|
||||
if (ret) {
|
||||
goto out_put;
|
||||
}
|
||||
cbd_bitmap_free(zc->pblk_alloc, idx);
|
||||
zc->pblk_alloc_dirty = true;
|
||||
cbd_bitmap_free(zc->pbat_buf, idx);
|
||||
zc->pbat_data_dirty = true;
|
||||
|
||||
out_put:
|
||||
if (put_zone) {
|
||||
|
@ -452,7 +448,7 @@ out_put:
|
|||
**************************************/
|
||||
|
||||
static int
|
||||
lblk_alloc_elem_write(struct dm_compress* dc, struct zone_cache* zc)
|
||||
lbat_elem_write(struct dm_compress* dc, struct zone_cache* zc)
|
||||
{
|
||||
u32 zone;
|
||||
u32 zone_lblk;
|
||||
|
@ -464,32 +460,32 @@ lblk_alloc_elem_write(struct dm_compress* dc, struct zone_cache* zc)
|
|||
u8* buf;
|
||||
void* pg;
|
||||
|
||||
BUG_ON(zc->lblk_alloc_elem_lblk == LBLK_NONE);
|
||||
BUG_ON(zc->lblk_alloc_pblk == PBLK_NONE);
|
||||
BUG_ON(zc->lblk_alloc_len == 0);
|
||||
BUG_ON(zc->lbat_elem_lblk == LBLK_NONE);
|
||||
BUG_ON(zc->lbat_data_pblk == PBLK_NONE);
|
||||
BUG_ON(zc->lbat_data_len == 0);
|
||||
|
||||
zone = zc->lblk_alloc_elem_lblk / dc->params.lblk_per_zone;
|
||||
zone_lblk = zc->lblk_alloc_elem_lblk - (zc->zone * dc->params.lblk_per_zone);
|
||||
elem_off = lblk_alloc_elem_len(&dc->params) * zone_lblk;
|
||||
elem_end = elem_off + lblk_alloc_elem_len(&dc->params);
|
||||
zone = zc->lbat_elem_lblk / dc->params.lblk_per_zone;
|
||||
zone_lblk = zc->lbat_elem_lblk - (zc->zone * dc->params.lblk_per_zone);
|
||||
elem_off = lbat_elem_len(&dc->params) * zone_lblk;
|
||||
elem_end = elem_off + lbat_elem_len(&dc->params);
|
||||
rel_pblk = elem_off / PBLK_SIZE;
|
||||
count = zc->lblk_alloc_len;
|
||||
pblk = zc->lblk_alloc_pblk;
|
||||
buf = zc->lblk_alloc + (elem_off - rel_pblk * PBLK_SIZE);
|
||||
lblk_alloc_elem_put(&dc->params, buf, zc->lblk_alloc_elem);
|
||||
count = zc->lbat_data_len;
|
||||
pblk = zc->lbat_data_pblk;
|
||||
buf = zc->lbat_buf + (elem_off - rel_pblk * PBLK_SIZE);
|
||||
lbat_elem_put(&dc->params, buf, zc->lbat_elem);
|
||||
|
||||
pg = compress_alloc_pages(count * PBLK_SIZE);
|
||||
if (!pg) {
|
||||
return -ENOMEM;
|
||||
}
|
||||
memcpy(pg, zc->lblk_alloc, count * PBLK_SIZE);
|
||||
memcpy(pg, zc->lbat_buf, count * PBLK_SIZE);
|
||||
blkdev_pblk_write(dc, pblk, count, pg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
lblk_alloc_elem_read(struct dm_compress* dc, struct zone_cache* zc, u64 lblk)
|
||||
lbat_elem_read(struct dm_compress* dc, struct zone_cache* zc, u64 lblk)
|
||||
{
|
||||
int ret;
|
||||
u32 zone;
|
||||
|
@ -501,28 +497,28 @@ lblk_alloc_elem_read(struct dm_compress* dc, struct zone_cache* zc, u64 lblk)
|
|||
u64 pblk;
|
||||
u8* buf;
|
||||
|
||||
if (zc->lblk_alloc_elem_lblk == lblk) {
|
||||
if (zc->lbat_elem_lblk == lblk) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
zone = lblk / dc->params.lblk_per_zone;
|
||||
zone_lblk = lblk - (zone * dc->params.lblk_per_zone);
|
||||
elem_off = lblk_alloc_elem_len(&dc->params) * zone_lblk;
|
||||
elem_end = elem_off + lblk_alloc_elem_len(&dc->params);
|
||||
elem_off = lbat_elem_len(&dc->params) * zone_lblk;
|
||||
elem_end = elem_off + lbat_elem_len(&dc->params);
|
||||
rel_pblk = elem_off / PBLK_SIZE;
|
||||
count = 1 + (elem_end - 1) / PBLK_SIZE - (elem_off / PBLK_SIZE);
|
||||
pblk = lblk_alloc_off(&dc->params, zone) + rel_pblk;
|
||||
if (zc->lblk_alloc_pblk != pblk || zc->lblk_alloc_len < count) {
|
||||
ret = blkdev_pblk_read(dc, pblk, count, zc->lblk_alloc);
|
||||
pblk = lbat_off(&dc->params, zone) + rel_pblk;
|
||||
if (zc->lbat_data_pblk != pblk || zc->lbat_data_len < count) {
|
||||
ret = blkdev_pblk_read(dc, pblk, count, zc->lbat_buf);
|
||||
if (ret != 0) {
|
||||
return ret;
|
||||
}
|
||||
zc->lblk_alloc_pblk = pblk;
|
||||
zc->lblk_alloc_len = count;
|
||||
zc->lbat_data_pblk = pblk;
|
||||
zc->lbat_data_len = count;
|
||||
}
|
||||
buf = zc->lblk_alloc + (elem_off - rel_pblk * PBLK_SIZE);
|
||||
lblk_alloc_elem_get(&dc->params, buf, zc->lblk_alloc_elem);
|
||||
zc->lblk_alloc_elem_lblk = lblk;
|
||||
buf = zc->lbat_buf + (elem_off - rel_pblk * PBLK_SIZE);
|
||||
lbat_elem_get(&dc->params, buf, zc->lbat_elem);
|
||||
zc->lbat_elem_lblk = lblk;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -600,7 +596,6 @@ lblk_write(struct dm_compress* dc, struct zone_cache* zc)
|
|||
int ret;
|
||||
u32 zone;
|
||||
u32 zone_lblk;
|
||||
u8* elem_buf;
|
||||
size_t d_len;
|
||||
size_t c_len;
|
||||
u8* c_buf;
|
||||
|
@ -609,16 +604,15 @@ lblk_write(struct dm_compress* dc, struct zone_cache* zc)
|
|||
|
||||
zone = zc->zone;
|
||||
zone_lblk = zc->lblk_num - (zone * dc->params.lblk_per_zone);
|
||||
elem_buf = zc->lblk_alloc + zone_lblk * lblk_alloc_elem_len(&dc->params);
|
||||
|
||||
/* We must have a cached lblk elem */
|
||||
BUG_ON(zc->lblk_alloc_elem_lblk == LBLK_NONE);
|
||||
BUG_ON(zc->lbat_elem_lblk == LBLK_NONE);
|
||||
|
||||
d_len = PBLK_SIZE * lblk_per_pblk(&dc->params);
|
||||
if (lblk_is_zeros(&dc->params, zc)) {
|
||||
c_len = 0;
|
||||
c_buf = NULL;
|
||||
zc->lblk_alloc_elem->len = 0;
|
||||
zc->lbat_elem->len = 0;
|
||||
}
|
||||
else {
|
||||
c_len = lblk_compress(&dc->params, zc);
|
||||
|
@ -628,26 +622,26 @@ lblk_write(struct dm_compress* dc, struct zone_cache* zc)
|
|||
memset(zc->lz4_cbuf + c_len, 0, c_blkrem);
|
||||
}
|
||||
c_buf = zc->lz4_cbuf;
|
||||
zc->lblk_alloc_elem->len = c_len;
|
||||
zc->lbat_elem->len = c_len;
|
||||
}
|
||||
else {
|
||||
c_len = d_len;
|
||||
c_buf = zc->lblk;
|
||||
zc->lblk_alloc_elem->len = CBD_UNCOMPRESSED;
|
||||
zc->lbat_elem->len = CBD_UNCOMPRESSED;
|
||||
}
|
||||
}
|
||||
|
||||
for (n = 0; n < lblk_per_pblk(&dc->params); ++n) {
|
||||
if (c_len > PBLK_SIZE * n) {
|
||||
void* pg;
|
||||
pblk = zc->lblk_alloc_elem->pblk[n];
|
||||
pblk = zc->lbat_elem->pblk[n];
|
||||
if (!pblk) {
|
||||
pblk = pblk_alloc_get(dc, zc);
|
||||
pblk = pbat_alloc(dc, zc);
|
||||
if (pblk == 0) {
|
||||
printk(KERN_ERR " pblk_alloc_get failed\n");
|
||||
printk(KERN_ERR " pbat_alloc failed\n");
|
||||
return -ENOSPC;
|
||||
}
|
||||
zc->lblk_alloc_elem->pblk[n] = pblk;
|
||||
zc->lbat_elem->pblk[n] = pblk;
|
||||
}
|
||||
pg = compress_alloc_pages(PBLK_SIZE);
|
||||
if (!pg) {
|
||||
|
@ -658,26 +652,26 @@ lblk_write(struct dm_compress* dc, struct zone_cache* zc)
|
|||
c_buf += PBLK_SIZE;
|
||||
}
|
||||
else {
|
||||
pblk = zc->lblk_alloc_elem->pblk[n];
|
||||
pblk = zc->lbat_elem->pblk[n];
|
||||
if (pblk) {
|
||||
zc->lblk_alloc_elem->pblk[n] = 0;
|
||||
ret = pblk_alloc_put(dc, zc, pblk);
|
||||
zc->lbat_elem->pblk[n] = 0;
|
||||
ret = pbat_free(dc, zc, pblk);
|
||||
if (ret != 0) {
|
||||
printk(KERN_ERR " pblk_alloc_put failed\n");
|
||||
printk(KERN_ERR " pbat_free failed\n");
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ret = lblk_alloc_elem_write(dc, zc);
|
||||
ret = lbat_elem_write(dc, zc);
|
||||
if (ret != 0) {
|
||||
printk(KERN_ERR " lblk_alloc_elem_write failed\n");
|
||||
printk(KERN_ERR " lbat_elem_write failed\n");
|
||||
return ret;
|
||||
}
|
||||
ret = pblk_alloc_flush(dc, zc);
|
||||
ret = pbat_flush(dc, zc);
|
||||
if (ret != 0) {
|
||||
printk(KERN_ERR " pblk_alloc_flush failed\n");
|
||||
printk(KERN_ERR " pbat_flush failed\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -707,7 +701,6 @@ lblk_read(struct dm_compress* dc, struct zone_cache* zc, u64 idx)
|
|||
int ret;
|
||||
u32 zone;
|
||||
u32 zone_lblk;
|
||||
u8* elem_buf;
|
||||
u32 c_len;
|
||||
u64 pblk;
|
||||
|
||||
|
@ -721,15 +714,14 @@ lblk_read(struct dm_compress* dc, struct zone_cache* zc, u64 idx)
|
|||
|
||||
zone = idx / dc->params.lblk_per_zone;
|
||||
zone_lblk = idx - (zone * dc->params.lblk_per_zone);
|
||||
elem_buf = zc->lblk_alloc + zone_lblk * lblk_alloc_elem_len(&dc->params);
|
||||
|
||||
ret = lblk_alloc_elem_read(dc, zc, idx);
|
||||
ret = lbat_elem_read(dc, zc, idx);
|
||||
if (ret != 0) {
|
||||
printk(KERN_ERR " lblk_alloc_elem_read failed\n");
|
||||
printk(KERN_ERR " lbat_elem_read failed\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
c_len = zc->lblk_alloc_elem->len;
|
||||
c_len = zc->lbat_elem->len;
|
||||
if (c_len == 0) {
|
||||
memset(zc->lblk, 0, PBLK_SIZE * lblk_per_pblk(&dc->params));
|
||||
}
|
||||
|
@ -745,7 +737,7 @@ lblk_read(struct dm_compress* dc, struct zone_cache* zc, u64 idx)
|
|||
}
|
||||
p = zc->lz4_cbuf;
|
||||
for (n = 0; n * PBLK_SIZE < c_len; ++n, p += PBLK_SIZE) {
|
||||
pblk = zc->lblk_alloc_elem->pblk[n];
|
||||
pblk = zc->lbat_elem->pblk[n];
|
||||
BUG_ON(pblk == 0);
|
||||
ret = blkdev_pblk_read(dc, pblk, 1, p);
|
||||
if (ret != 0) {
|
||||
|
@ -776,11 +768,11 @@ static void
|
|||
zone_cache_reset(struct zone_cache* zc, u32 zone)
|
||||
{
|
||||
zc->zone = zone;
|
||||
zc->pblk_alloc_idx = ZONE_NONE;
|
||||
zc->pblk_alloc_dirty = false;
|
||||
zc->lblk_alloc_pblk = PBLK_NONE;
|
||||
zc->lblk_alloc_len = 0;
|
||||
zc->lblk_alloc_elem_lblk = LBLK_NONE;
|
||||
zc->pbat_data_cached = false;
|
||||
zc->pbat_data_dirty = false;
|
||||
zc->lbat_data_pblk = PBLK_NONE;
|
||||
zc->lbat_data_len = 0;
|
||||
zc->lbat_elem_lblk = LBLK_NONE;
|
||||
zc->lblk_num = LBLK_NONE;
|
||||
zc->lblk_dirty = false;
|
||||
}
|
||||
|
@ -794,7 +786,7 @@ zone_cache_flush(struct dm_compress* dc, struct zone_cache* zc)
|
|||
if (ret) {
|
||||
return ret;
|
||||
}
|
||||
ret = pblk_alloc_flush(dc, zc);
|
||||
ret = pbat_flush(dc, zc);
|
||||
if (ret) {
|
||||
return ret;
|
||||
}
|
||||
|
@ -860,14 +852,14 @@ zone_cache_dtr(struct dm_compress* dc, struct zone_cache* zc)
|
|||
compress_free_pages(zc->lblk, PBLK_SIZE * lblk_per_pblk(&dc->params));
|
||||
zc->lblk = NULL;
|
||||
|
||||
kfree(zc->lblk_alloc_elem);
|
||||
zc->lblk_alloc_elem = NULL;
|
||||
kfree(zc->lbat_elem);
|
||||
zc->lbat_elem = NULL;
|
||||
|
||||
compress_free_pages(zc->lblk_alloc, PBLK_SIZE * 2);
|
||||
zc->lblk_alloc = NULL;
|
||||
compress_free_pages(zc->lbat_buf, PBLK_SIZE * 2);
|
||||
zc->lbat_buf = NULL;
|
||||
|
||||
compress_free_pages(zc->pblk_alloc, PBLK_SIZE * pblk_alloc_len(&dc->params));
|
||||
zc->pblk_alloc = NULL;
|
||||
compress_free_pages(zc->pbat_buf, PBLK_SIZE * pbat_len(&dc->params));
|
||||
zc->pbat_buf = NULL;
|
||||
|
||||
compress_free_pages(zc->lz4_cbuf, PBLK_SIZE * lblk_per_pblk(&dc->params));
|
||||
zc->lz4_cbuf = NULL;
|
||||
|
@ -892,24 +884,24 @@ zone_cache_ctr(struct dm_compress* dc, struct zone_cache* zc)
|
|||
printk(KERN_ERR "%s: Failed to alloc lz4_cmem\n", __func__);
|
||||
goto out_nomem;
|
||||
}
|
||||
zc->pblk_alloc_idx = ZONE_NONE;
|
||||
zc->pblk_alloc_dirty = false;
|
||||
zc->pblk_alloc = compress_alloc_pages(PBLK_SIZE * pblk_alloc_len(&dc->params));
|
||||
if (!zc->pblk_alloc) {
|
||||
printk(KERN_ERR "%s: Failed to alloc pblk_alloc\n", __func__);
|
||||
zc->pbat_data_cached = false;
|
||||
zc->pbat_data_dirty = false;
|
||||
zc->pbat_buf = compress_alloc_pages(PBLK_SIZE * pbat_len(&dc->params));
|
||||
if (!zc->pbat_buf) {
|
||||
printk(KERN_ERR "%s: Failed to alloc pbat_buf\n", __func__);
|
||||
goto out_nomem;
|
||||
}
|
||||
zc->lblk_alloc_pblk = PBLK_NONE;
|
||||
zc->lblk_alloc_len = 0;
|
||||
zc->lblk_alloc = compress_alloc_pages(PBLK_SIZE * 2);
|
||||
if (!zc->lblk_alloc) {
|
||||
printk(KERN_ERR "%s: Failed to alloc lblk_alloc\n", __func__);
|
||||
zc->lbat_data_pblk = PBLK_NONE;
|
||||
zc->lbat_data_len = 0;
|
||||
zc->lbat_buf = compress_alloc_pages(PBLK_SIZE * 2);
|
||||
if (!zc->lbat_buf) {
|
||||
printk(KERN_ERR "%s: Failed to alloc lbat_buf\n", __func__);
|
||||
goto out_nomem;
|
||||
}
|
||||
zc->lblk_alloc_elem_lblk = LBLK_NONE;
|
||||
zc->lblk_alloc_elem = kmalloc(offsetof(struct lblk_alloc_elem, pblk[lblk_per_pblk(&dc->params)]), GFP_KERNEL);
|
||||
if (!zc->lblk_alloc_elem) {
|
||||
printk(KERN_ERR "%s: Failed to alloc lblk_alloc_elem\n", __func__);
|
||||
zc->lbat_elem_lblk = LBLK_NONE;
|
||||
zc->lbat_elem = kmalloc(offsetof(struct lbat_elem, pblk[lblk_per_pblk(&dc->params)]), GFP_KERNEL);
|
||||
if (!zc->lbat_elem) {
|
||||
printk(KERN_ERR "%s: Failed to alloc lbat_elem\n", __func__);
|
||||
goto out_nomem;
|
||||
}
|
||||
zc->lblk_num = LBLK_NONE;
|
||||
|
|
|
@ -48,7 +48,7 @@ struct cbd_header {
|
|||
struct cbd_params params;
|
||||
};
|
||||
|
||||
struct lblk_alloc_elem
|
||||
struct lbat_elem
|
||||
{
|
||||
u32 len; /* Compressed length */
|
||||
u64 pblk[1]; /* Vector of physical blocks */
|
||||
|
@ -160,13 +160,13 @@ lblk_per_pblk(const struct cbd_params* params)
|
|||
}
|
||||
|
||||
static inline u32
|
||||
pblk_alloc_len(const struct cbd_params* params)
|
||||
pbat_len(const struct cbd_params* params)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline u32
|
||||
lblk_alloc_elem_len(const struct cbd_params* params)
|
||||
lbat_elem_len(const struct cbd_params* params)
|
||||
{
|
||||
u32 elem_len_bytes = (params->lblk_shift + PBLK_SHIFT > 16) ? 4 : 2;
|
||||
u32 elem_pblk_bytes = (params->nr_pblk <= 0xffff ? 2 :
|
||||
|
@ -175,22 +175,22 @@ lblk_alloc_elem_len(const struct cbd_params* params)
|
|||
}
|
||||
|
||||
static inline u32
|
||||
lblk_alloc_len(const struct cbd_params* params)
|
||||
lbat_len(const struct cbd_params* params)
|
||||
{
|
||||
return DIV_ROUND_UP(params->lblk_per_zone * lblk_alloc_elem_len(params), PBLK_SIZE);
|
||||
return DIV_ROUND_UP(params->lblk_per_zone * lbat_elem_len(params), PBLK_SIZE);
|
||||
}
|
||||
|
||||
static inline u32
|
||||
zone_metadata_len(const struct cbd_params* params)
|
||||
{
|
||||
return pblk_alloc_len(params) +
|
||||
lblk_alloc_len(params);
|
||||
return pbat_len(params) +
|
||||
lbat_len(params);
|
||||
}
|
||||
|
||||
static inline u32
|
||||
zone_data_len(const struct cbd_params* params)
|
||||
{
|
||||
return pblk_alloc_len(params) * PBLK_SIZE * BITS_PER_BYTE;
|
||||
return pbat_len(params) * PBLK_SIZE * BITS_PER_BYTE;
|
||||
}
|
||||
|
||||
static inline u32
|
||||
|
@ -207,24 +207,24 @@ zone_off(const struct cbd_params* params, u32 idx)
|
|||
}
|
||||
|
||||
static inline u64
|
||||
pblk_alloc_off(const struct cbd_params* params, u32 idx)
|
||||
pbat_off(const struct cbd_params* params, u32 idx)
|
||||
{
|
||||
return zone_off(params, idx) + 0;
|
||||
}
|
||||
|
||||
static inline u64
|
||||
lblk_alloc_off(const struct cbd_params* params, u32 idx)
|
||||
lbat_off(const struct cbd_params* params, u32 idx)
|
||||
{
|
||||
return zone_off(params, idx) +
|
||||
pblk_alloc_len(params);
|
||||
pbat_len(params);
|
||||
}
|
||||
|
||||
static inline u64
|
||||
zone_data_off(const struct cbd_params* params, u32 idx)
|
||||
{
|
||||
return zone_off(params, idx) +
|
||||
pblk_alloc_len(params) +
|
||||
lblk_alloc_len(params);
|
||||
pbat_len(params) +
|
||||
lbat_len(params);
|
||||
}
|
||||
|
||||
static inline void
|
||||
|
@ -257,7 +257,7 @@ cbd_header_put(u8* buf, const struct cbd_header* header)
|
|||
|
||||
/*
|
||||
* XXX:
|
||||
* nr_bits = pblk_alloc_len(params) * PBLK_SIZE;
|
||||
* nr_bits = pbat_len(params) * PBLK_SIZE;
|
||||
* bit = find_next_zero_bit_le(buf, nr_bits);
|
||||
* if (bit < nr_bits) {
|
||||
* set_bit_le(bit, buf);
|
||||
|
@ -297,8 +297,8 @@ cbd_bitmap_free(u8* buf, u32 idx)
|
|||
}
|
||||
|
||||
static inline void
|
||||
lblk_alloc_elem_get(const struct cbd_params* params,
|
||||
const u8* buf, struct lblk_alloc_elem* elem)
|
||||
lbat_elem_get(const struct cbd_params* params,
|
||||
const u8* buf, struct lbat_elem* elem)
|
||||
{
|
||||
u32 n;
|
||||
|
||||
|
@ -326,8 +326,8 @@ lblk_alloc_elem_get(const struct cbd_params* params,
|
|||
}
|
||||
|
||||
static inline void
|
||||
lblk_alloc_elem_put(const struct cbd_params* params,
|
||||
u8* buf, const struct lblk_alloc_elem* elem)
|
||||
lbat_elem_put(const struct cbd_params* params,
|
||||
u8* buf, const struct lbat_elem* elem)
|
||||
{
|
||||
u32 n;
|
||||
|
||||
|
|
|
@ -4,8 +4,8 @@
|
|||
|
||||
struct zone_metadata
|
||||
{
|
||||
u8* pblk_alloc;
|
||||
u8* lblk_alloc;
|
||||
u8* pbat;
|
||||
u8* lbat;
|
||||
};
|
||||
|
||||
static void
|
||||
|
@ -63,15 +63,15 @@ check_one_lblk(const struct cbd_params* params,
|
|||
const struct zone_metadata* zm,
|
||||
u8** pblk_used)
|
||||
{
|
||||
struct lblk_alloc_elem* elem;
|
||||
struct lbat_elem* elem;
|
||||
u8* elem_buf;
|
||||
u32 n;
|
||||
u64 pblk;
|
||||
u32 rel_pblk;
|
||||
|
||||
elem = calloc(1, offsetof(struct lblk_alloc_elem, pblk[lblk_per_pblk(params)]));
|
||||
elem_buf = zm->lblk_alloc + lblk * lblk_alloc_elem_len(params);
|
||||
lblk_alloc_elem_get(params, elem_buf, elem);
|
||||
elem = calloc(1, offsetof(struct lbat_elem, pblk[lblk_per_pblk(params)]));
|
||||
elem_buf = zm->lbat + lblk * lbat_elem_len(params);
|
||||
lbat_elem_get(params, elem_buf, elem);
|
||||
printf(" lblk[%u]: len=%u\n", lblk, elem->len);
|
||||
for (n = 0; n < lblk_per_pblk(params); ++n) {
|
||||
pblk = elem->pblk[n];
|
||||
|
@ -130,7 +130,7 @@ check_zone_metadata(const struct cbd_params* params,
|
|||
|
||||
pblk_used = calloc(params->nr_zones, sizeof(void*));
|
||||
for (zone = 0; zone < params->nr_zones; ++zone) {
|
||||
pblk_used[zone] = calloc(1, pblk_alloc_len(params));
|
||||
pblk_used[zone] = calloc(1, pbat_len(params));
|
||||
}
|
||||
|
||||
for (zone = 0; zone < params->nr_zones; ++zone) {
|
||||
|
@ -164,23 +164,23 @@ cbd_check(const char* dev,
|
|||
|
||||
zmvec = calloc(header.params.nr_zones, sizeof(struct zone_metadata));
|
||||
for (zone = 0; zone < header.params.nr_zones; ++zone) {
|
||||
zmvec[zone].pblk_alloc = calloc(1, PBLK_SIZE);
|
||||
zmvec[zone].pbat = calloc(1, PBLK_SIZE);
|
||||
pblk_read(devfd,
|
||||
pblk_alloc_off(&header.params, zone),
|
||||
pblk_alloc_len(&header.params),
|
||||
zmvec[zone].pblk_alloc);
|
||||
zmvec[zone].lblk_alloc = calloc(lblk_alloc_len(&header.params), PBLK_SIZE);
|
||||
pbat_off(&header.params, zone),
|
||||
pbat_len(&header.params),
|
||||
zmvec[zone].pbat);
|
||||
zmvec[zone].lbat = calloc(lbat_len(&header.params), PBLK_SIZE);
|
||||
pblk_read(devfd,
|
||||
lblk_alloc_off(&header.params, zone),
|
||||
lblk_alloc_len(&header.params),
|
||||
zmvec[zone].lblk_alloc);
|
||||
lbat_off(&header.params, zone),
|
||||
lbat_len(&header.params),
|
||||
zmvec[zone].lbat);
|
||||
}
|
||||
|
||||
check_zone_metadata(&header.params, zmvec);
|
||||
|
||||
for (zone = 0; zone < header.params.nr_zones; ++zone) {
|
||||
free(zmvec[zone].lblk_alloc);
|
||||
free(zmvec[zone].pblk_alloc);
|
||||
free(zmvec[zone].lbat);
|
||||
free(zmvec[zone].pbat);
|
||||
}
|
||||
free(zmvec);
|
||||
|
||||
|
|
Loading…
Reference in New Issue