Rename some stuff and limit LBLK_SHIFT_MAX

This commit is contained in:
Tom Marshall 2019-10-09 11:32:36 -07:00
parent 2e18584af3
commit 0ca9fc789f
3 changed files with 58 additions and 58 deletions

View File

@ -75,7 +75,7 @@ struct dm_compress
/* Currently cached lblk data (if any) */ /* Currently cached lblk data (if any) */
u64 lblk_num; u64 lblk_num;
bool lblk_dirty; bool lblk_dirty;
struct lblk_alloc* lblk_alloc; struct lblk_alloc_elem* lblk_alloc;
void* lblk; void* lblk;
@ -197,8 +197,8 @@ zone_pblk_alloc_write(struct dm_compress* dc)
u32 count; u32 count;
BUG_ON(dc->zone_pblk_alloc_idx == ZONE_NONE); BUG_ON(dc->zone_pblk_alloc_idx == ZONE_NONE);
pblk = zone_pblk_alloc_off(&dc->params, dc->zone_pblk_alloc_idx); pblk = pblk_alloc_off(&dc->params, dc->zone_pblk_alloc_idx);
count = zone_pblk_alloc_len(&dc->params); count = pblk_alloc_len(&dc->params);
ret = blkdev_pblk_write(dc->dev->bdev, pblk, count, dc->zone_pblk_alloc); ret = blkdev_pblk_write(dc->dev->bdev, pblk, count, dc->zone_pblk_alloc);
if (ret != 0) { if (ret != 0) {
@ -241,8 +241,8 @@ zone_pblk_alloc_read(struct dm_compress* dc, u32 idx)
return ret; return ret;
} }
pblk = zone_pblk_alloc_off(&dc->params, idx); pblk = pblk_alloc_off(&dc->params, idx);
count = zone_pblk_alloc_len(&dc->params); count = pblk_alloc_len(&dc->params);
ret = blkdev_pblk_read(dc->dev->bdev, pblk, count, dc->zone_pblk_alloc); ret = blkdev_pblk_read(dc->dev->bdev, pblk, count, dc->zone_pblk_alloc);
if (ret) { if (ret) {
@ -261,7 +261,7 @@ zone_pblk_alloc_read(struct dm_compress* dc, u32 idx)
static u64 static u64
zone_pblk_alloc_get(struct dm_compress* dc, u32 zone_hint) zone_pblk_alloc_get(struct dm_compress* dc, u32 zone_hint)
{ {
u32 zone_pblk_count = zone_pblk_alloc_len(&dc->params) * PBLK_SIZE_BITS; u32 zone_pblk_count = pblk_alloc_len(&dc->params) * PBLK_SIZE_BITS;
u32 zone; u32 zone;
u32 idx; u32 idx;
@ -295,7 +295,7 @@ zone_pblk_alloc_get(struct dm_compress* dc, u32 zone_hint)
static int static int
zone_pblk_alloc_put(struct dm_compress* dc, u64 pblk) zone_pblk_alloc_put(struct dm_compress* dc, u64 pblk)
{ {
u32 zone_pblk_count = zone_pblk_alloc_len(&dc->params) * PBLK_SIZE_BITS; u32 zone_pblk_count = pblk_alloc_len(&dc->params) * PBLK_SIZE_BITS;
u32 zone; u32 zone;
u32 idx; u32 idx;
int ret; int ret;
@ -345,8 +345,8 @@ zone_lblk_alloc_write(struct dm_compress* dc)
} }
BUG_ON(dc->zone_lblk_alloc_idx == ZONE_NONE); BUG_ON(dc->zone_lblk_alloc_idx == ZONE_NONE);
pblk = zone_lblk_alloc_off(&dc->params, dc->zone_lblk_alloc_idx); pblk = lblk_alloc_off(&dc->params, dc->zone_lblk_alloc_idx);
count = zone_lblk_alloc_len(&dc->params); count = lblk_alloc_len(&dc->params);
ret = blkdev_pblk_write(dc->dev->bdev, pblk, count, dc->zone_lblk_alloc); ret = blkdev_pblk_write(dc->dev->bdev, pblk, count, dc->zone_lblk_alloc);
if (ret != 0) { if (ret != 0) {
@ -371,8 +371,8 @@ zone_lblk_alloc_read(struct dm_compress* dc, u32 idx)
return 0; return 0;
} }
pblk = zone_lblk_alloc_off(&dc->params, idx); pblk = lblk_alloc_off(&dc->params, idx);
count = zone_lblk_alloc_len(&dc->params); count = lblk_alloc_len(&dc->params);
ret = blkdev_pblk_read(dc->dev->bdev, pblk, count, dc->zone_lblk_alloc); ret = blkdev_pblk_read(dc->dev->bdev, pblk, count, dc->zone_lblk_alloc);
if (ret == 0) { if (ret == 0) {
dc->zone_lblk_alloc_idx = idx; dc->zone_lblk_alloc_idx = idx;
@ -504,7 +504,7 @@ lblk_write(struct dm_compress* dc)
} }
} }
cbd_lblk_alloc_put(&dc->params, lblk_alloc_elem_put(&dc->params,
dc->zone_lblk_alloc, zone_lblk, dc->lblk_alloc); dc->zone_lblk_alloc, zone_lblk, dc->lblk_alloc);
ret = zone_lblk_alloc_write(dc); ret = zone_lblk_alloc_write(dc);
if (ret != 0) { if (ret != 0) {
@ -562,7 +562,7 @@ lblk_read(struct dm_compress* dc, u64 idx)
printk(KERN_ERR " zone_lblk_alloc_read failed\n"); printk(KERN_ERR " zone_lblk_alloc_read failed\n");
return ret; return ret;
} }
cbd_lblk_alloc_get(&dc->params, lblk_alloc_elem_get(&dc->params,
dc->zone_lblk_alloc, zone_lblk, dc->lblk_alloc); dc->zone_lblk_alloc, zone_lblk, dc->lblk_alloc);
c_len = dc->lblk_alloc->len; c_len = dc->lblk_alloc->len;
@ -663,10 +663,10 @@ compress_free_buffers(struct dm_compress* dc)
kfree(dc->lblk_alloc); kfree(dc->lblk_alloc);
dc->lblk_alloc = NULL; dc->lblk_alloc = NULL;
compress_free_pages(dc->zone_lblk_alloc, PBLK_SIZE * zone_lblk_alloc_len(&dc->params)); compress_free_pages(dc->zone_lblk_alloc, PBLK_SIZE * lblk_alloc_len(&dc->params));
dc->zone_lblk_alloc = NULL; dc->zone_lblk_alloc = NULL;
compress_free_pages(dc->zone_pblk_alloc, PBLK_SIZE * zone_pblk_alloc_len(&dc->params)); compress_free_pages(dc->zone_pblk_alloc, PBLK_SIZE * pblk_alloc_len(&dc->params));
dc->zone_pblk_alloc = NULL; dc->zone_pblk_alloc = NULL;
compress_free_pages(dc->lz4_cbuf, PBLK_SIZE * lblk_per_pblk(&dc->params)); compress_free_pages(dc->lz4_cbuf, PBLK_SIZE * lblk_per_pblk(&dc->params));
@ -696,20 +696,20 @@ compress_alloc_buffers(struct dm_compress* dc)
} }
dc->zone_pblk_alloc_idx = ZONE_NONE; dc->zone_pblk_alloc_idx = ZONE_NONE;
dc->zone_pblk_alloc_dirty = false; dc->zone_pblk_alloc_dirty = false;
dc->zone_pblk_alloc = compress_alloc_pages(PBLK_SIZE * zone_pblk_alloc_len(&dc->params)); dc->zone_pblk_alloc = compress_alloc_pages(PBLK_SIZE * pblk_alloc_len(&dc->params));
if (!dc->zone_pblk_alloc) { if (!dc->zone_pblk_alloc) {
printk(KERN_ERR "%s: Failed to alloc zone_pblk_alloc\n", __func__); printk(KERN_ERR "%s: Failed to alloc zone_pblk_alloc\n", __func__);
goto out_nomem; goto out_nomem;
} }
dc->zone_lblk_alloc_idx = ZONE_NONE; dc->zone_lblk_alloc_idx = ZONE_NONE;
dc->zone_lblk_alloc = compress_alloc_pages(PBLK_SIZE * zone_lblk_alloc_len(&dc->params)); dc->zone_lblk_alloc = compress_alloc_pages(PBLK_SIZE * lblk_alloc_len(&dc->params));
if (!dc->zone_lblk_alloc) { if (!dc->zone_lblk_alloc) {
printk(KERN_ERR "%s: Failed to alloc zone_lblk_alloc\n", __func__); printk(KERN_ERR "%s: Failed to alloc zone_lblk_alloc\n", __func__);
goto out_nomem; goto out_nomem;
} }
dc->lblk_num = LBLK_NONE; dc->lblk_num = LBLK_NONE;
dc->lblk_dirty = false; dc->lblk_dirty = false;
dc->lblk_alloc = kmalloc(offsetof(struct lblk_alloc, pblk[lblk_per_pblk(&dc->params)]), GFP_KERNEL); dc->lblk_alloc = kmalloc(offsetof(struct lblk_alloc_elem, pblk[lblk_per_pblk(&dc->params)]), GFP_KERNEL);
if (!dc->lblk_alloc) { if (!dc->lblk_alloc) {
printk(KERN_ERR "%s: Failed to alloc lblk_alloc\n", __func__); printk(KERN_ERR "%s: Failed to alloc lblk_alloc\n", __func__);
goto out_nomem; goto out_nomem;

View File

@ -11,7 +11,7 @@
#define PBLK_PER_SECTOR (1 << (PBLK_SHIFT - SECTOR_SHIFT)) #define PBLK_PER_SECTOR (1 << (PBLK_SHIFT - SECTOR_SHIFT))
#define LBLK_SHIFT_MIN 1 #define LBLK_SHIFT_MIN 1
#define LBLK_SHIFT_MAX (30 - PBLK_SHIFT) #define LBLK_SHIFT_MAX (20 - PBLK_SHIFT)
#define CBD_HEADER_BLOCKS 1 #define CBD_HEADER_BLOCKS 1
@ -45,7 +45,7 @@ struct cbd_header {
struct cbd_params params; struct cbd_params params;
}; };
struct lblk_alloc struct lblk_alloc_elem
{ {
u32 len; /* Compressed length */ u32 len; /* Compressed length */
u64 pblk[1]; /* Vector of physical blocks */ u64 pblk[1]; /* Vector of physical blocks */
@ -157,13 +157,13 @@ lblk_per_pblk(const struct cbd_params* params)
} }
static inline u32 static inline u32
zone_pblk_alloc_len(const struct cbd_params* params) pblk_alloc_len(const struct cbd_params* params)
{ {
return 1; return 1;
} }
static inline u32 static inline u32
zone_lblk_alloc_elem_len(const struct cbd_params* params) lblk_alloc_elem_len(const struct cbd_params* params)
{ {
u32 elem_len_bytes = (params->lblk_shift + PBLK_SHIFT > 16) ? 4 : 2; u32 elem_len_bytes = (params->lblk_shift + PBLK_SHIFT > 16) ? 4 : 2;
u32 elem_pblk_bytes = (params->nr_pblk <= 0xffff ? 2 : u32 elem_pblk_bytes = (params->nr_pblk <= 0xffff ? 2 :
@ -172,22 +172,22 @@ zone_lblk_alloc_elem_len(const struct cbd_params* params)
} }
static inline u32 static inline u32
zone_lblk_alloc_len(const struct cbd_params* params) lblk_alloc_len(const struct cbd_params* params)
{ {
return DIV_ROUND_UP(params->lblk_per_zone * zone_lblk_alloc_elem_len(params), PBLK_SIZE); return DIV_ROUND_UP(params->lblk_per_zone * lblk_alloc_elem_len(params), PBLK_SIZE);
} }
static inline u32 static inline u32
zone_metadata_len(const struct cbd_params* params) zone_metadata_len(const struct cbd_params* params)
{ {
return zone_pblk_alloc_len(params) + return pblk_alloc_len(params) +
zone_lblk_alloc_len(params); lblk_alloc_len(params);
} }
static inline u32 static inline u32
zone_data_len(const struct cbd_params* params) zone_data_len(const struct cbd_params* params)
{ {
return zone_pblk_alloc_len(params) * PBLK_SIZE * BITS_PER_BYTE; return pblk_alloc_len(params) * PBLK_SIZE * BITS_PER_BYTE;
} }
static inline u32 static inline u32
@ -204,24 +204,24 @@ zone_off(const struct cbd_params* params, u32 idx)
} }
static inline u64 static inline u64
zone_pblk_alloc_off(const struct cbd_params* params, u32 idx) pblk_alloc_off(const struct cbd_params* params, u32 idx)
{ {
return zone_off(params, idx) + 0; return zone_off(params, idx) + 0;
} }
static inline u64 static inline u64
zone_lblk_alloc_off(const struct cbd_params* params, u32 idx) lblk_alloc_off(const struct cbd_params* params, u32 idx)
{ {
return zone_off(params, idx) + return zone_off(params, idx) +
zone_pblk_alloc_len(params); pblk_alloc_len(params);
} }
static inline u64 static inline u64
zone_data_off(const struct cbd_params* params, u32 idx) zone_data_off(const struct cbd_params* params, u32 idx)
{ {
return zone_off(params, idx) + return zone_off(params, idx) +
zone_pblk_alloc_len(params) + pblk_alloc_len(params) +
zone_lblk_alloc_len(params); lblk_alloc_len(params);
} }
static inline void static inline void
@ -254,7 +254,7 @@ cbd_header_put(u8* buf, const struct cbd_header* header)
/* /*
* XXX: * XXX:
* nr_bits = zone_pblk_alloc_len(params) * PBLK_SIZE; * nr_bits = pblk_alloc_len(params) * PBLK_SIZE;
* bit = find_next_zero_bit_le(buf, nr_bits); * bit = find_next_zero_bit_le(buf, nr_bits);
* if (bit < nr_bits) { * if (bit < nr_bits) {
* set_bit_le(bit, buf); * set_bit_le(bit, buf);
@ -294,61 +294,61 @@ cbd_bitmap_free(u8* buf, u32 idx)
} }
static inline void static inline void
cbd_lblk_alloc_get(const struct cbd_params* params, lblk_alloc_elem_get(const struct cbd_params* params,
const u8* buf, u32 idx, struct lblk_alloc* alloc) const u8* buf, u32 idx, struct lblk_alloc_elem* elem)
{ {
const u8* raw = buf + idx * zone_lblk_alloc_elem_len(params); const u8* raw = buf + idx * lblk_alloc_elem_len(params);
u32 n; u32 n;
if (params->lblk_shift + PBLK_SHIFT > 16) { if (params->lblk_shift + PBLK_SHIFT > 16) {
alloc->len = get32_le(&raw); elem->len = get32_le(&raw);
} }
else { else {
alloc->len = get16_le(&raw); elem->len = get16_le(&raw);
} }
if (params->nr_pblk <= 0xffff) { if (params->nr_pblk <= 0xffff) {
for (n = 0; n < lblk_per_pblk(params); ++n) { for (n = 0; n < lblk_per_pblk(params); ++n) {
alloc->pblk[n] = get16_le(&raw); elem->pblk[n] = get16_le(&raw);
} }
} }
else if (params->nr_pblk <= 0xffffffff) { else if (params->nr_pblk <= 0xffffffff) {
for (n = 0; n < lblk_per_pblk(params); ++n) { for (n = 0; n < lblk_per_pblk(params); ++n) {
alloc->pblk[n] = get32_le(&raw); elem->pblk[n] = get32_le(&raw);
} }
} }
else { else {
for (n = 0; n < lblk_per_pblk(params); ++n) { for (n = 0; n < lblk_per_pblk(params); ++n) {
alloc->pblk[n] = get48_le(&raw); elem->pblk[n] = get48_le(&raw);
} }
} }
} }
static inline void static inline void
cbd_lblk_alloc_put(const struct cbd_params* params, lblk_alloc_elem_put(const struct cbd_params* params,
void* buf, u32 idx, const struct lblk_alloc* alloc) void* buf, u32 idx, const struct lblk_alloc_elem* elem)
{ {
u8* raw = buf + idx * zone_lblk_alloc_elem_len(params); u8* raw = buf + idx * lblk_alloc_elem_len(params);
u32 n; u32 n;
if (params->lblk_shift + PBLK_SHIFT > 16) { if (params->lblk_shift + PBLK_SHIFT > 16) {
put32_le(&raw, alloc->len); put32_le(&raw, elem->len);
} }
else { else {
put16_le(&raw, alloc->len); put16_le(&raw, elem->len);
} }
if (params->nr_pblk <= 0xffff) { if (params->nr_pblk <= 0xffff) {
for (n = 0; n < lblk_per_pblk(params); ++n) { for (n = 0; n < lblk_per_pblk(params); ++n) {
put16_le(&raw, alloc->pblk[n]); put16_le(&raw, elem->pblk[n]);
} }
} }
else if (params->nr_pblk <= 0xffffffff) { else if (params->nr_pblk <= 0xffffffff) {
for (n = 0; n < lblk_per_pblk(params); ++n) { for (n = 0; n < lblk_per_pblk(params); ++n) {
put32_le(&raw, alloc->pblk[n]); put32_le(&raw, elem->pblk[n]);
} }
} }
else { else {
for (n = 0; n < lblk_per_pblk(params); ++n) { for (n = 0; n < lblk_per_pblk(params); ++n) {
put48_le(&raw, alloc->pblk[n]); put48_le(&raw, elem->pblk[n]);
} }
} }
} }

View File

@ -63,13 +63,13 @@ check_one_lblk(const struct cbd_params* params,
const struct zone_metadata* zm, const struct zone_metadata* zm,
u8** pblk_used) u8** pblk_used)
{ {
struct lblk_alloc* alloc; struct lblk_alloc_elem* alloc;
u32 n; u32 n;
u64 pblk; u64 pblk;
u32 rel_pblk; u32 rel_pblk;
alloc = calloc(1, offsetof(struct lblk_alloc, pblk[lblk_per_pblk(params)])); alloc = calloc(1, offsetof(struct lblk_alloc_elem, pblk[lblk_per_pblk(params)]));
cbd_lblk_alloc_get(params, zm->lblk_alloc, lblk, alloc); lblk_alloc_elem_get(params, zm->lblk_alloc, lblk, alloc);
printf(" lblk[%u]: len=%u\n", lblk, alloc->len); printf(" lblk[%u]: len=%u\n", lblk, alloc->len);
for (n = 0; n < lblk_per_pblk(params); ++n) { for (n = 0; n < lblk_per_pblk(params); ++n) {
pblk = alloc->pblk[n]; pblk = alloc->pblk[n];
@ -128,7 +128,7 @@ check_zone_metadata(const struct cbd_params* params,
pblk_used = calloc(params->nr_zones, sizeof(void*)); pblk_used = calloc(params->nr_zones, sizeof(void*));
for (zone = 0; zone < params->nr_zones; ++zone) { for (zone = 0; zone < params->nr_zones; ++zone) {
pblk_used[zone] = calloc(1, zone_pblk_alloc_len(params)); pblk_used[zone] = calloc(1, pblk_alloc_len(params));
} }
for (zone = 0; zone < params->nr_zones; ++zone) { for (zone = 0; zone < params->nr_zones; ++zone) {
@ -164,13 +164,13 @@ cbd_check(const char* dev,
for (zone = 0; zone < header.params.nr_zones; ++zone) { for (zone = 0; zone < header.params.nr_zones; ++zone) {
zmvec[zone].pblk_alloc = calloc(1, PBLK_SIZE); zmvec[zone].pblk_alloc = calloc(1, PBLK_SIZE);
pblk_read(devfd, pblk_read(devfd,
zone_pblk_alloc_off(&header.params, zone), pblk_alloc_off(&header.params, zone),
zone_pblk_alloc_len(&header.params), pblk_alloc_len(&header.params),
zmvec[zone].pblk_alloc); zmvec[zone].pblk_alloc);
zmvec[zone].lblk_alloc = calloc(zone_lblk_alloc_len(&header.params), PBLK_SIZE); zmvec[zone].lblk_alloc = calloc(lblk_alloc_len(&header.params), PBLK_SIZE);
pblk_read(devfd, pblk_read(devfd,
zone_lblk_alloc_off(&header.params, zone), lblk_alloc_off(&header.params, zone),
zone_lblk_alloc_len(&header.params), lblk_alloc_len(&header.params),
zmvec[zone].lblk_alloc); zmvec[zone].lblk_alloc);
} }