ftl: restructure ftl_write() to use less memory by using flash_write0() and flash_copy()

tags/0.1.0
S.J.R. van Schaik 8 years ago
parent 3a287deba2
commit 7826eccc36
  1. 37
      source/ftl/ftl.c

@ -44,10 +44,10 @@ size_t ftl_read(struct ftl_map *map, void *data, size_t len, uint32_t va)
size_t ftl_write(struct ftl_map *map, uint32_t va, const void *udata,
size_t len)
{
char data[1 << map->log2_page_size];
struct ftl_page_desc page_desc;
size_t nbytes;
int ret;
uint32_t offset, page;
uint32_t offset, page, dst, src;
if (va >= ftl_get_capacity(map))
return 0;
@ -59,20 +59,37 @@ size_t ftl_write(struct ftl_map *map, uint32_t va, const void *udata,
ret != -ERR_NOT_FOUND)
return 0;
if (ret == -ERR_NOT_FOUND) {
memset(data, 0, 1 << map->log2_page_size);
if (ret == -ERR_NOT_FOUND)
++map->nused_pages;
} else if (flash_read(map->dev, page << map->log2_page_size, data,
1 << map->log2_page_size) == 0) {
return 0;
}
page_desc.nused_pages = map->nused_pages;
if (prepare_head(map) < 0)
return 0;
dst = map->head << map->log2_page_size;
src = page << map->log2_page_size;
len = min(len, (1 << map->log2_page_size) - offset);
memcpy(data + offset, udata, len);
if (write_upage(map, data, &page_desc) < 0)
if (ret == -ERR_NOT_FOUND)
flash_write0(map->dev, dst, offset);
else
flash_copy(map->dev, dst, src, offset);
src += offset;
dst += offset;
flash_write(map->dev, dst, udata, len);
src += len;
dst += len;
nbytes = (1 << map->log2_page_size) - len - offset;
if (ret == -ERR_NOT_FOUND)
flash_write0(map->dev, dst, nbytes);
else
flash_copy(map->dev, dst, src, nbytes);
if (write_page_desc(map, &page_desc) < 0)
return 0;
return len;

Loading…
Cancel
Save