|
|
@ -12,7 +12,7 @@ |
|
|
|
#include "gc.h" |
|
|
|
#include "gc.h" |
|
|
|
#include "map.h" |
|
|
|
#include "map.h" |
|
|
|
|
|
|
|
|
|
|
|
int ftl_read(struct ftl_map *map, void *data, size_t len, uint32_t va) |
|
|
|
size_t ftl_read(struct ftl_map *map, void *data, size_t len, uint32_t va) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int ret; |
|
|
|
int ret; |
|
|
|
uint32_t mask, offset, page; |
|
|
|
uint32_t mask, offset, page; |
|
|
@ -23,17 +23,19 @@ int ftl_read(struct ftl_map *map, void *data, size_t len, uint32_t va) |
|
|
|
|
|
|
|
|
|
|
|
if ((ret = trace_path(map, NULL, &page, va)) < 0) { |
|
|
|
if ((ret = trace_path(map, NULL, &page, va)) < 0) { |
|
|
|
memset(data, 0, len); |
|
|
|
memset(data, 0, len); |
|
|
|
return ret; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (!data) |
|
|
|
if (!data) |
|
|
|
return 0; |
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
len = min(len, (1 << map->log2_page_size) - offset); |
|
|
|
|
|
|
|
|
|
|
|
return flash_read(map->dev, (page << map->log2_page_size) + offset, data, |
|
|
|
return flash_read(map->dev, (page << map->log2_page_size) + offset, data, |
|
|
|
min((1 << map->log2_page_size) - offset, len)); |
|
|
|
len); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int ftl_write(struct ftl_map *map, uint32_t va, const void *udata, |
|
|
|
size_t ftl_write(struct ftl_map *map, uint32_t va, const void *udata, |
|
|
|
size_t len) |
|
|
|
size_t len) |
|
|
|
{ |
|
|
|
{ |
|
|
|
char data[1 << map->log2_page_size]; |
|
|
|
char data[1 << map->log2_page_size]; |
|
|
@ -43,7 +45,7 @@ int ftl_write(struct ftl_map *map, uint32_t va, const void *udata, |
|
|
|
|
|
|
|
|
|
|
|
if (va >= ftl_get_capacity(map) && |
|
|
|
if (va >= ftl_get_capacity(map) && |
|
|
|
!is_aligned(va, 1 << map->log2_page_size)) |
|
|
|
!is_aligned(va, 1 << map->log2_page_size)) |
|
|
|
return -1; |
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
|
|
mask = ((1 << map->log2_page_size) - 1); |
|
|
|
mask = ((1 << map->log2_page_size) - 1); |
|
|
|
offset = va & mask; |
|
|
|
offset = va & mask; |
|
|
@ -51,21 +53,25 @@ int ftl_write(struct ftl_map *map, uint32_t va, const void *udata, |
|
|
|
|
|
|
|
|
|
|
|
if ((ret = trace_path(map, &page_desc, &page, va)) < 0 && |
|
|
|
if ((ret = trace_path(map, &page_desc, &page, va)) < 0 && |
|
|
|
ret != -ERR_NOT_FOUND) |
|
|
|
ret != -ERR_NOT_FOUND) |
|
|
|
return -1; |
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
|
|
if (ret == -ERR_NOT_FOUND) { |
|
|
|
if (ret == -ERR_NOT_FOUND) { |
|
|
|
memset(data, 0, 1 << map->log2_page_size); |
|
|
|
memset(data, 0, 1 << map->log2_page_size); |
|
|
|
++map->nused_pages; |
|
|
|
++map->nused_pages; |
|
|
|
} else if (flash_read(map->dev, page << map->log2_page_size, data, |
|
|
|
} else if (flash_read(map->dev, page << map->log2_page_size, data, |
|
|
|
1 << map->log2_page_size) < 0) { |
|
|
|
1 << map->log2_page_size) == 0) { |
|
|
|
return -1; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
page_desc.nused_pages = map->nused_pages; |
|
|
|
page_desc.nused_pages = map->nused_pages; |
|
|
|
|
|
|
|
|
|
|
|
memcpy(data + offset, udata, min((1 << map->log2_page_size) - offset, len)); |
|
|
|
len = min(len, (1 << map->log2_page_size) - offset); |
|
|
|
|
|
|
|
memcpy(data + offset, udata, len); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (write_upage(map, data, &page_desc) < 0) |
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
|
|
return write_upage(map, data, &page_desc); |
|
|
|
return len; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int ftl_trim(struct ftl_map *map, uint32_t va) |
|
|
|
int ftl_trim(struct ftl_map *map, uint32_t va) |
|
|
|