ftl: separate code to start a transaction
This commit is contained in:
parent
65d269e2d4
commit
bea048006a
1 changed files with 34 additions and 23 deletions
|
@ -44,11 +44,42 @@ size_t ftl_read(struct ftl_map *map, void *data, size_t len, uint32_t va)
|
||||||
len);
|
len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int ftl_start_transaction(struct ftl_map *map, uint32_t va)
|
||||||
|
{
|
||||||
|
uint32_t page;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if ((map->outstanding.flags & FTL_PRESENT) && map->outstanding.va == va)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (ftl_sync(map) < 0)
|
||||||
|
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;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int ftl_seek(struct ftl_map *map, uint32_t va)
|
static int ftl_seek(struct ftl_map *map, uint32_t va)
|
||||||
{
|
{
|
||||||
size_t len;
|
size_t len;
|
||||||
|
uint32_t offset, dst, src;
|
||||||
int ret;
|
int ret;
|
||||||
uint32_t offset, page, dst, src;
|
|
||||||
|
|
||||||
if (va >= ftl_get_capacity(map))
|
if (va >= ftl_get_capacity(map))
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -56,28 +87,8 @@ static int ftl_seek(struct ftl_map *map, uint32_t va)
|
||||||
offset = va & ((1 << map->log2_page_size) - 1);
|
offset = va & ((1 << map->log2_page_size) - 1);
|
||||||
va >>= map->log2_page_size;
|
va >>= map->log2_page_size;
|
||||||
|
|
||||||
if (!(map->outstanding.flags & FTL_PRESENT) || map->outstanding.va != va) {
|
if (ftl_start_transaction(map, va) < 0)
|
||||||
if (ftl_sync(map) < 0)
|
return -1;
|
||||||
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)
|
if (offset < map->offset)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue