diff --git a/source/ftl/map.c b/source/ftl/map.c index a789912..3082945 100644 --- a/source/ftl/map.c +++ b/source/ftl/map.c @@ -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)