ftl: fix read_page_desc() and write_page_desc() to use proper offsets

This commit is contained in:
S.J.R. van Schaik 2017-08-01 15:50:16 +02:00
parent f44581b648
commit 5b21fe9813

View file

@ -85,13 +85,13 @@ int read_page_group(struct ftl_map *map,
int read_page_desc(struct ftl_map *map,
struct ftl_page_desc *page_desc, uint32_t upage)
{
uint32_t group_no, page, addr, offset;
uint32_t addr, offset;
group_no = upage >> map->log2_pages_per_group;
page = ((group_no + 1) << map->log2_pages_per_group) - 1;
addr = page << map->log2_page_size;
offset = sizeof(struct ftl_page_group) +
(upage & ((1 << map->log2_pages_per_group) - 1)) * sizeof *page_desc;
BIT_MASK(upage, map->log2_pages_per_group) * sizeof *page_desc;
upage = align(upage, map->log2_pages_per_group) +
(1 << map->log2_pages_per_group) - 1;
addr = upage << map->log2_page_size;
if (flash_read(map->dev, addr + offset, page_desc, sizeof *page_desc) == 0)
return -1;
@ -109,14 +109,17 @@ int write_page_desc(struct ftl_map *map,
struct ftl_page_desc *page_desc)
{
struct ftl_page_group group;
uint32_t group_no, page, addr, offset, head;
uint32_t upage, addr, offset, head;
group_no = map->head >> map->log2_pages_per_group;
page = ((group_no + 1) << map->log2_pages_per_group) - 1;
addr = page << map->log2_page_size;
upage = map->head;
offset = sizeof(struct ftl_page_group) +
BIT_MASK(upage, map->log2_pages_per_group) * sizeof *page_desc;
upage = align(upage, map->log2_pages_per_group) +
(1 << map->log2_pages_per_group) - 1;
addr = upage << map->log2_page_size;
/* Write the page group header. */
if (flash_is_erased(map->dev, page, 1)) {
if (flash_is_erased(map->dev, upage, 1)) {
memcpy(&group.magic, "FTL", sizeof group.magic);
group.epoch = map->epoch;
group.tail = map->tail;
@ -125,9 +128,6 @@ int write_page_desc(struct ftl_map *map,
return -1;
}
offset = sizeof group + (map->head & ((1 << map->log2_pages_per_group) - 1)) *
sizeof *page_desc;
memcpy(page_desc->magic, "page", sizeof page_desc->magic);
if (flash_write(map->dev, addr + offset, page_desc, sizeof *page_desc) == 0)