ftl: maintain state for the transaction that is currently active

This commit is contained in:
S.J.R. van Schaik 2017-10-03 13:15:10 +02:00
parent e40bd819d6
commit 65d269e2d4
4 changed files with 38 additions and 60 deletions

View file

@ -56,13 +56,28 @@ static int ftl_seek(struct ftl_map *map, uint32_t va)
offset = va & ((1 << map->log2_page_size) - 1);
va >>= map->log2_page_size;
if ((map->flags & FTL_CACHED_VA) && map->last_va != va &&
ftl_sync(map) < 0)
return -1;
if (!(map->outstanding.flags & FTL_PRESENT) || map->outstanding.va != va) {
if (ftl_sync(map) < 0)
return -1;
if ((ret = trace_path(map, NULL, &page, va)) < 0 &&
ret != -ERR_NOT_FOUND)
return -1;
if ((ret = trace_path(map, NULL, &page, va)) < 0 &&
ret != -ERR_NOT_FOUND)
return -1;
if (prepare_head(map) < 0)
return -1;
map->outstanding.flags |= FTL_PRESENT;
map->outstanding.va = va;
map->outstanding.page = page;
if (ret == -ERR_NOT_FOUND) {
map->outstanding.flags |= FTL_NO_MAPPING;
++map->nused_pages;
}
map->offset = 0;
}
if (offset < map->offset)
return -1;
@ -70,16 +85,8 @@ static int ftl_seek(struct ftl_map *map, uint32_t va)
if (offset == map->offset)
return 0;
if (map->offset == 0) {
if (prepare_head(map) < 0)
return -1;
if (ret == -ERR_NOT_FOUND)
++map->nused_pages;
}
dst = map->head << map->log2_page_size;
src = page << map->log2_page_size;
src = map->outstanding.page << map->log2_page_size;
len = offset - map->offset;
if (ret == -ERR_NOT_FOUND)
@ -107,7 +114,6 @@ size_t ftl_write(struct ftl_map *map, uint32_t va, const void *udata,
return 0;
map->offset += len;
map->flags |= FTL_DIRTY;
return len;
}
@ -116,21 +122,16 @@ int ftl_sync(struct ftl_map *map)
{
struct ftl_page_desc page_desc;
size_t len;
int ret;
uint32_t page, dst, src;
uint32_t dst, src;
if (!(map->flags & FTL_DIRTY))
if (!(map->outstanding.flags & FTL_PRESENT))
return 0;
if ((ret = trace_path(map, &page_desc, &page, map->last_va)) < 0 &&
ret != -ERR_NOT_FOUND)
return -1;
dst = (map->head << map->log2_page_size) + map->offset;
src = (page << map->log2_page_size) + map->offset;
src = (map->outstanding.page << map->log2_page_size) + map->offset;
len = (1 << map->log2_page_size) - map->offset;
if (map->flags & FTL_UNMAPPED)
if (map->outstanding.flags & FTL_NO_MAPPING)
flash_write0(map->dev, dst, len);
else
flash_copy(map->dev, dst, src, len);
@ -141,7 +142,7 @@ int ftl_sync(struct ftl_map *map)
return -1;
map->offset = 0;
map->flags &= ~(FTL_CACHED_VA | FTL_UNMAPPED | FTL_DIRTY);
map->outstanding.flags = 0;
return 0;
}