flash: return size for flash_read() and flash_write()

tags/0.1.0
S.J.R. van Schaik 7 years ago
parent d631e3012e
commit 937521c909
  1. 8
      include/flash.h
  2. 4
      include/ftl.h
  3. 6
      source/core/flash.c
  4. 30
      source/drivers/sandbox_flash.c
  5. 8
      source/ftl/dev.c
  6. 26
      source/ftl/ftl.c
  7. 18
      source/ftl/map.c

@ -9,8 +9,8 @@ struct flash_ops {
void (* release)(struct flash_dev *dev);
size_t (* get_size)(struct flash_dev *dev);
size_t (* get_capacity)(struct flash_dev *dev);
int (* read)(struct flash_dev *dev, uint32_t addr, void *data, size_t len);
int (* write)(struct flash_dev *dev, uint32_t addr, const void *data,
size_t (* read)(struct flash_dev *dev, uint32_t addr, void *data, size_t len);
size_t (* write)(struct flash_dev *dev, uint32_t addr, const void *data,
size_t len);
int (* copy)(struct flash_dev *dev, uint32_t dst, uint32_t src, size_t len);
int (* is_erased)(struct flash_dev *dev, uint32_t addr);
@ -30,8 +30,8 @@ struct flash_dev *flash_probe(void);
void flash_release(struct flash_dev *dev);
size_t flash_get_size(struct flash_dev *dev);
size_t flash_get_capacity(struct flash_dev *dev);
int flash_read(struct flash_dev *dev, uint32_t addr, void *data, size_t len);
int flash_write(struct flash_dev *dev, uint32_t addr, const void *data,
size_t flash_read(struct flash_dev *dev, uint32_t addr, void *data, size_t len);
size_t flash_write(struct flash_dev *dev, uint32_t addr, const void *data,
size_t len);
int flash_copy(struct flash_dev *dev, uint32_t dst, uint32_t src, size_t len);
int flash_is_erased(struct flash_dev *dev, uint32_t addr, size_t len);

@ -30,9 +30,9 @@ 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 void *data,
size_t 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);
size_t 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);
uint32_t ftl_get_capacity(const struct ftl_map *map);

@ -8,7 +8,7 @@ int default_flash_is_erased(struct flash_dev *dev, uint32_t addr)
uint8_t data[1 << dev->log2_block_size];
size_t i;
if (flash_read(dev, addr, data, sizeof(data)) < 0)
if (flash_read(dev, addr, data, sizeof(data)) == 0)
return 0;
for (i = 0; i < sizeof(data); ++i) {
@ -43,7 +43,7 @@ size_t flash_get_capacity(struct flash_dev *dev)
return dev->ops->get_capacity(dev);
}
int flash_read(struct flash_dev *dev, uint32_t addr, void *data, size_t len)
size_t flash_read(struct flash_dev *dev, uint32_t addr, void *data, size_t len)
{
if (!dev)
return -1;
@ -51,7 +51,7 @@ int flash_read(struct flash_dev *dev, uint32_t addr, void *data, size_t len)
return dev->ops->read(dev, addr, data, len);
}
int flash_write(struct flash_dev *dev, uint32_t addr, const void *data,
size_t flash_write(struct flash_dev *dev, uint32_t addr, const void *data,
size_t len)
{
if (!dev)

@ -19,9 +19,9 @@ struct stdio_flash_priv {
};
static size_t stdio_flash_get_size(struct flash_dev *dev);
static int stdio_flash_read(struct flash_dev *dev, uint32_t addr, void *data,
static size_t stdio_flash_read(struct flash_dev *dev, uint32_t addr, void *data,
size_t len);
static int stdio_flash_write(struct flash_dev *dev, uint32_t addr,
static size_t stdio_flash_write(struct flash_dev *dev, uint32_t addr,
const void *data, size_t len);
static int stdio_flash_copy(struct flash_dev *dev, uint32_t dst, uint32_t src,
size_t len);
@ -45,20 +45,23 @@ static size_t stdio_flash_get_size(struct flash_dev *dev)
return priv->size;
}
static int stdio_flash_read(struct flash_dev *dev, uint32_t addr, void *data,
static size_t stdio_flash_read(struct flash_dev *dev, uint32_t addr, void *data,
size_t len)
{
struct stdio_flash_priv *priv = dev->priv;
if (addr > priv->size || len > priv->size - addr)
return -1;
addr = min(addr, priv->size);
len = min(len, priv->size - addr);
if (!len)
return 0;
memcpy(data, priv->data + addr, len);
return 0;
return len;
}
static int stdio_flash_write(struct flash_dev *dev, uint32_t addr,
static size_t stdio_flash_write(struct flash_dev *dev, uint32_t addr,
const void *data, size_t len)
{
struct stdio_flash_priv *priv = dev->priv;
@ -66,8 +69,11 @@ static int stdio_flash_write(struct flash_dev *dev, uint32_t addr,
char *dst;
size_t i;
if (addr > priv->size || len > priv->size - addr)
return -1;
addr = min(addr, priv->size);
len = min(len, priv->size - addr);
if (!len)
return 0;
src = data;
dst = priv->data + addr;
@ -76,7 +82,7 @@ static int stdio_flash_write(struct flash_dev *dev, uint32_t addr,
dst[i] &= src[i];
}
return 0;
return len;
}
static int stdio_flash_copy(struct flash_dev *dev, uint32_t dst, uint32_t src,
@ -88,10 +94,10 @@ static int stdio_flash_copy(struct flash_dev *dev, uint32_t dst, uint32_t src,
while (len) {
nbytes = min(sizeof data, len);
if (stdio_flash_read(dev, src, data, nbytes) < 0)
if (stdio_flash_read(dev, src, data, nbytes) == 0)
return -1;
if (stdio_flash_write(dev, dst, data, nbytes) < 0)
if (stdio_flash_write(dev, dst, data, nbytes) == 0)
return -1;
dst += nbytes;

@ -8,9 +8,9 @@
static size_t ftl_flash_get_size(struct flash_dev *dev);
static size_t ftl_flash_get_capacity(struct flash_dev *dev);
static int ftl_flash_read(struct flash_dev *dev, uint32_t addr, void *data,
static size_t ftl_flash_read(struct flash_dev *dev, uint32_t addr, void *data,
size_t len);
static int ftl_flash_write(struct flash_dev *dev, uint32_t addr,
static size_t ftl_flash_write(struct flash_dev *dev, uint32_t addr,
const void *data, size_t len);
static int ftl_flash_erase(struct flash_dev *dev, uint32_t addr);
static void ftl_flash_release(struct flash_dev *dev);
@ -40,7 +40,7 @@ static size_t ftl_flash_get_capacity(struct flash_dev *dev)
return ftl_get_capacity(map);
}
static int ftl_flash_read(struct flash_dev *dev, uint32_t addr, void *data,
static size_t ftl_flash_read(struct flash_dev *dev, uint32_t addr, void *data,
size_t len)
{
struct ftl_map *map = dev->priv;
@ -48,7 +48,7 @@ static int ftl_flash_read(struct flash_dev *dev, uint32_t addr, void *data,
return ftl_read(map, data, len, addr);
}
static int ftl_flash_write(struct flash_dev *dev, uint32_t addr,
static size_t ftl_flash_write(struct flash_dev *dev, uint32_t addr,
const void *data, size_t len)
{
struct ftl_map *map = dev->priv;

@ -12,7 +12,7 @@
#include "gc.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;
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) {
memset(data, 0, len);
return ret;
return 0;
}
if (!data)
return 0;
len = min(len, (1 << map->log2_page_size) - offset);
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)
{
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) &&
!is_aligned(va, 1 << map->log2_page_size))
return -1;
return 0;
mask = ((1 << map->log2_page_size) - 1);
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 &&
ret != -ERR_NOT_FOUND)
return -1;
return 0;
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;
1 << map->log2_page_size) == 0) {
return 0;
}
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)

@ -53,7 +53,10 @@ int read_page_group(struct ftl_map *map,
page = ((group_no + 1) << map->log2_pages_per_group) - 1;
addr = page << map->log2_page_size;
return flash_read(map->dev, addr, group, sizeof *group);
if (flash_read(map->dev, addr, group, sizeof *group) == 0)
return -1;
return 0;
}
/* Given the page number of a user page, reads the page descriptor associated
@ -71,7 +74,10 @@ int read_page_desc(struct ftl_map *map,
offset = sizeof(struct ftl_page_group) +
(upage & ((1 << map->log2_pages_per_group) - 1)) * sizeof *page_desc;
return flash_read(map->dev, addr + offset, page_desc, sizeof *page_desc);
if (flash_read(map->dev, addr + offset, page_desc, sizeof *page_desc) == 0)
return -1;
return 0;
}
/* Writes the page descriptor to the footer of the current page group and
@ -93,14 +99,14 @@ static int write_page_desc(struct ftl_map *map,
group.epoch = map->epoch;
group.tail = map->tail;
if (flash_write(map->dev, addr, &group, sizeof group) < 0)
if (flash_write(map->dev, addr, &group, sizeof group) == 0)
return -1;
}
offset = sizeof group + (map->head & ((1 << map->log2_pages_per_group) - 1)) *
sizeof *page_desc;
if (flash_write(map->dev, addr + offset, page_desc, sizeof *page_desc) < 0)
if (flash_write(map->dev, addr + offset, page_desc, sizeof *page_desc) == 0)
return -1;
map->root = map->head;
@ -126,7 +132,7 @@ int write_upage(struct ftl_map *map, const void *page,
return -1;
if (page && flash_write(map->dev, map->head << map->log2_page_size, page,
map->log2_page_size) < 0)
map->log2_page_size) == 0)
return -1;
return write_page_desc(map, page_desc);
@ -179,7 +185,7 @@ static int find_block(struct ftl_map *map, struct ftl_page_group *group,
page = block << map->log2_block_size;
page |= ((UINT32_C(1) << map->log2_pages_per_group) - 1) << map->log2_page_size;
if (flash_read(map->dev, page, group, sizeof *group) < 0)
if (flash_read(map->dev, page, group, sizeof *group) == 0)
continue;
if (memcmp(group->magic, "FTL", sizeof group->magic) != 0)

Loading…
Cancel
Save