ftl: restructure ftl_write() to use less memory by using flash_write0() and flash_copy()
This commit is contained in:
parent
3a287deba2
commit
7826eccc36
1 changed files with 28 additions and 11 deletions
|
@ -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;
|
||||
|
||||
len = min(len, (1 << map->log2_page_size) - offset);
|
||||
memcpy(data + offset, udata, len);
|
||||
if (prepare_head(map) < 0)
|
||||
return 0;
|
||||
|
||||
if (write_upage(map, data, &page_desc) < 0)
|
||||
dst = map->head << map->log2_page_size;
|
||||
src = page << map->log2_page_size;
|
||||
len = min(len, (1 << map->log2_page_size) - offset);
|
||||
|
||||
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…
Add table
Add a link
Reference in a new issue