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, int read_page_desc(struct ftl_map *map,
struct ftl_page_desc *page_desc, uint32_t upage) 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) + 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) if (flash_read(map->dev, addr + offset, page_desc, sizeof *page_desc) == 0)
return -1; return -1;
@ -109,14 +109,17 @@ int write_page_desc(struct ftl_map *map,
struct ftl_page_desc *page_desc) struct ftl_page_desc *page_desc)
{ {
struct ftl_page_group group; 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; upage = map->head;
page = ((group_no + 1) << map->log2_pages_per_group) - 1; offset = sizeof(struct ftl_page_group) +
addr = page << map->log2_page_size; 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. */ /* 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); memcpy(&group.magic, "FTL", sizeof group.magic);
group.epoch = map->epoch; group.epoch = map->epoch;
group.tail = map->tail; group.tail = map->tail;
@ -125,9 +128,6 @@ int write_page_desc(struct ftl_map *map,
return -1; 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); memcpy(page_desc->magic, "page", sizeof page_desc->magic);
if (flash_write(map->dev, addr + offset, page_desc, sizeof *page_desc) == 0) if (flash_write(map->dev, addr + offset, page_desc, sizeof *page_desc) == 0)