|
|
@@ -13,7 +13,9 @@
|
|
|
|
|
|
int lfs_sfd_read(const struct lfs_config *c, lfs_block_t block, lfs_off_t off, void *buffer, lfs_size_t size) {
|
|
|
sfd_drv_t *drv = (sfd_drv_t *)c->context;
|
|
|
- return drv->opts->read(drv, buffer, block*4096+off, size);
|
|
|
+ int ret = drv->opts->read(drv, buffer, block*4096+off, size);
|
|
|
+ if (ret >= 0 && size >= ret) return LFS_ERR_OK;
|
|
|
+ return LFS_ERR_IO;
|
|
|
}
|
|
|
|
|
|
// Program a region in a block. The block must have previously
|
|
|
@@ -21,7 +23,9 @@ int lfs_sfd_read(const struct lfs_config *c, lfs_block_t block, lfs_off_t off, v
|
|
|
// May return LFS_ERR_CORRUPT if the block should be considered bad.
|
|
|
int lfs_sfd_prog(const struct lfs_config *c, lfs_block_t block, lfs_off_t off, const void *buffer, lfs_size_t size) {
|
|
|
sfd_drv_t *drv = (sfd_drv_t *)c->context;
|
|
|
- return drv->opts->write(drv, buffer, block*4096+off, size);
|
|
|
+ int ret = drv->opts->write(drv, buffer, block*4096+off, size);
|
|
|
+ if (ret >= 0 && size >= ret) return LFS_ERR_OK;
|
|
|
+ return LFS_ERR_IO;
|
|
|
}
|
|
|
|
|
|
// Erase a block. A block must be erased before being programmed.
|
|
|
@@ -30,7 +34,9 @@ int lfs_sfd_prog(const struct lfs_config *c, lfs_block_t block, lfs_off_t off, c
|
|
|
// May return LFS_ERR_CORRUPT if the block should be considered bad.
|
|
|
int lfs_sfd_erase(const struct lfs_config *c, lfs_block_t block) {
|
|
|
sfd_drv_t *drv = (sfd_drv_t *)c->context;
|
|
|
- return drv->opts->erase(drv, block*4096, 4096);
|
|
|
+ int ret = drv->opts->erase(drv, block*4096, 4096);
|
|
|
+ if (ret == 0) return LFS_ERR_OK;
|
|
|
+ return LFS_ERR_IO;
|
|
|
}
|
|
|
|
|
|
// Sync the state of the underlying block device. Negative error codes
|