ftl: use byte-offset from VA in ftl_write()

tags/0.1.0
S.J.R. van Schaik 7 years ago
parent 563db297a3
commit 6a2c499d7a
  1. 3
      include/ftl.h
  2. 5
      source/ftl/dev.c
  3. 22
      source/ftl/ftl.c

@ -30,7 +30,8 @@ struct ftl_map {
int ftl_init_map(struct ftl_map *map, struct flash_dev *dev);
int ftl_resume_map(struct ftl_map *map);
int ftl_write(struct ftl_map *map, uint32_t addr, const uint8_t *data);
int ftl_write(struct ftl_map *map, uint32_t addr, const void *data,
size_t len);
int ftl_read(struct ftl_map *map, void *data, size_t len, uint32_t va);
int ftl_trim(struct ftl_map *map, uint32_t va);
uint32_t ftl_get_size(const struct ftl_map *map);

@ -53,10 +53,7 @@ static int ftl_flash_write(struct flash_dev *dev, uint32_t addr,
{
struct ftl_map *map = dev->priv;
/* TODO: support len */
(void)len;
return ftl_write(map, addr, data);
return ftl_write(map, addr, data, len);
}
static int ftl_flash_erase(struct flash_dev *dev, uint32_t addr)

@ -30,27 +30,41 @@ int ftl_read(struct ftl_map *map, void *data, size_t len, uint32_t va)
return 0;
return flash_read(map->dev, (page << map->log2_page_size) + offset, data,
min(map->log2_page_size - offset, len));
min((1 << map->log2_page_size) - offset, len));
}
int ftl_write(struct ftl_map *map, uint32_t va, const uint8_t *data)
int ftl_write(struct ftl_map *map, uint32_t va, const void *udata,
size_t len)
{
uint8_t data[1 << map->log2_page_size];
struct ftl_page_desc page_desc;
int ret;
uint32_t mask, offset, page;
if (va >= ftl_get_capacity(map) &&
!is_aligned(va, 1 << map->log2_page_size))
return -1;
if ((ret = trace_path(map, &page_desc, NULL, va)) < 0 &&
mask = ((1 << map->log2_page_size) - 1);
offset = va & mask;
va = va & ~mask;
if ((ret = trace_path(map, &page_desc, &page, va)) < 0 &&
ret != -ERR_NOT_FOUND)
return -1;
if (ret == -ERR_NOT_FOUND)
if (ret == -ERR_NOT_FOUND) {
memset(data, 0, 1 << map->log2_page_size);
++map->nused_pages;
} else if (flash_read(map->dev, page << map->log2_page_size, data,
1 << map->log2_page_size) < 0) {
return -1;
}
page_desc.nused_pages = map->nused_pages;
memcpy(data + offset, udata, min((1 << map->log2_page_size) - offset, len));
return write_upage(map, data, &page_desc);
}

Loading…
Cancel
Save