Merge pull request #443 from NoahGorny/add-already-opened-assert

Assert that the file isnt open in lfs_file_opencfg
This commit is contained in:
Christopher Haster
2020-12-03 22:43:10 -06:00

60
lfs.c
View File

@@ -415,6 +415,31 @@ static inline void lfs_superblock_tole32(lfs_superblock_t *superblock) {
superblock->attr_max = lfs_tole32(superblock->attr_max); superblock->attr_max = lfs_tole32(superblock->attr_max);
} }
static inline bool lfs_mlist_isopen(struct lfs_mlist *head,
struct lfs_mlist *node) {
for (struct lfs_mlist **p = &head; *p; p = &(*p)->next) {
if (*p == (struct lfs_mlist*)node) {
return true;
}
}
return false;
}
static inline void lfs_mlist_remove(lfs_t *lfs, struct lfs_mlist *mlist) {
for (struct lfs_mlist **p = &lfs->mlist; *p; p = &(*p)->next) {
if (*p == mlist) {
*p = (*p)->next;
break;
}
}
}
static inline void lfs_mlist_append(lfs_t *lfs, struct lfs_mlist *mlist) {
mlist->next = lfs->mlist;
lfs->mlist = mlist;
}
/// Internal operations predeclared here /// /// Internal operations predeclared here ///
static int lfs_dir_commit(lfs_t *lfs, lfs_mdir_t *dir, static int lfs_dir_commit(lfs_t *lfs, lfs_mdir_t *dir,
@@ -2022,6 +2047,8 @@ int lfs_mkdir(lfs_t *lfs, const char *path) {
int lfs_dir_open(lfs_t *lfs, lfs_dir_t *dir, const char *path) { int lfs_dir_open(lfs_t *lfs, lfs_dir_t *dir, const char *path) {
LFS_TRACE("lfs_dir_open(%p, %p, \"%s\")", (void*)lfs, (void*)dir, path); LFS_TRACE("lfs_dir_open(%p, %p, \"%s\")", (void*)lfs, (void*)dir, path);
LFS_ASSERT(!lfs_mlist_isopen(lfs->mlist, (struct lfs_mlist*)dir));
lfs_stag_t tag = lfs_dir_find(lfs, &dir->m, &path, NULL); lfs_stag_t tag = lfs_dir_find(lfs, &dir->m, &path, NULL);
if (tag < 0) { if (tag < 0) {
LFS_TRACE("lfs_dir_open -> %"PRId32, tag); LFS_TRACE("lfs_dir_open -> %"PRId32, tag);
@@ -2064,8 +2091,7 @@ int lfs_dir_open(lfs_t *lfs, lfs_dir_t *dir, const char *path) {
// add to list of mdirs // add to list of mdirs
dir->type = LFS_TYPE_DIR; dir->type = LFS_TYPE_DIR;
dir->next = (lfs_dir_t*)lfs->mlist; lfs_mlist_append(lfs, (struct lfs_mlist *)dir);
lfs->mlist = (struct lfs_mlist*)dir;
LFS_TRACE("lfs_dir_open -> %d", 0); LFS_TRACE("lfs_dir_open -> %d", 0);
return 0; return 0;
@@ -2074,12 +2100,7 @@ int lfs_dir_open(lfs_t *lfs, lfs_dir_t *dir, const char *path) {
int lfs_dir_close(lfs_t *lfs, lfs_dir_t *dir) { int lfs_dir_close(lfs_t *lfs, lfs_dir_t *dir) {
LFS_TRACE("lfs_dir_close(%p, %p)", (void*)lfs, (void*)dir); LFS_TRACE("lfs_dir_close(%p, %p)", (void*)lfs, (void*)dir);
// remove from list of mdirs // remove from list of mdirs
for (struct lfs_mlist **p = &lfs->mlist; *p; p = &(*p)->next) { lfs_mlist_remove(lfs, (struct lfs_mlist *)dir);
if (*p == (struct lfs_mlist*)dir) {
*p = (*p)->next;
break;
}
}
LFS_TRACE("lfs_dir_close -> %d", 0); LFS_TRACE("lfs_dir_close -> %d", 0);
return 0; return 0;
@@ -2402,9 +2423,10 @@ int lfs_file_opencfg(lfs_t *lfs, lfs_file_t *file,
".buffer=%p, .attrs=%p, .attr_count=%"PRIu32"})", ".buffer=%p, .attrs=%p, .attr_count=%"PRIu32"})",
(void*)lfs, (void*)file, path, flags, (void*)lfs, (void*)file, path, flags,
(void*)cfg, cfg->buffer, (void*)cfg->attrs, cfg->attr_count); (void*)cfg, cfg->buffer, (void*)cfg->attrs, cfg->attr_count);
LFS_ASSERT(!lfs_mlist_isopen(lfs->mlist, (struct lfs_mlist*)file));
// deorphan if we haven't yet, needed at most once after poweron // deorphan if we haven't yet, needed at most once after poweron
if ((flags & 3) != LFS_O_RDONLY) { if ((flags & LFS_O_RDWR) != LFS_O_RDONLY) {
int err = lfs_fs_forceconsistency(lfs); int err = lfs_fs_forceconsistency(lfs);
if (err) { if (err) {
LFS_TRACE("lfs_file_opencfg -> %d", err); LFS_TRACE("lfs_file_opencfg -> %d", err);
@@ -2429,8 +2451,7 @@ int lfs_file_opencfg(lfs_t *lfs, lfs_file_t *file,
// get id, add to list of mdirs to catch update changes // get id, add to list of mdirs to catch update changes
file->type = LFS_TYPE_REG; file->type = LFS_TYPE_REG;
file->next = (lfs_file_t*)lfs->mlist; lfs_mlist_append(lfs, (struct lfs_mlist *)file);
lfs->mlist = (struct lfs_mlist*)file;
if (tag == LFS_ERR_NOENT) { if (tag == LFS_ERR_NOENT) {
if (!(flags & LFS_O_CREAT)) { if (!(flags & LFS_O_CREAT)) {
@@ -2479,7 +2500,7 @@ int lfs_file_opencfg(lfs_t *lfs, lfs_file_t *file,
// fetch attrs // fetch attrs
for (unsigned i = 0; i < file->cfg->attr_count; i++) { for (unsigned i = 0; i < file->cfg->attr_count; i++) {
if ((file->flags & 3) != LFS_O_WRONLY) { if ((file->flags & LFS_O_RDWR) != LFS_O_WRONLY) {
lfs_stag_t res = lfs_dir_get(lfs, &file->m, lfs_stag_t res = lfs_dir_get(lfs, &file->m,
LFS_MKTAG(0x7ff, 0x3ff, 0), LFS_MKTAG(0x7ff, 0x3ff, 0),
LFS_MKTAG(LFS_TYPE_USERATTR + file->cfg->attrs[i].type, LFS_MKTAG(LFS_TYPE_USERATTR + file->cfg->attrs[i].type,
@@ -2491,7 +2512,7 @@ int lfs_file_opencfg(lfs_t *lfs, lfs_file_t *file,
} }
} }
if ((file->flags & 3) != LFS_O_RDONLY) { if ((file->flags & LFS_O_RDWR) != LFS_O_RDONLY) {
if (file->cfg->attrs[i].size > lfs->attr_max) { if (file->cfg->attrs[i].size > lfs->attr_max) {
err = LFS_ERR_NOSPC; err = LFS_ERR_NOSPC;
goto cleanup; goto cleanup;
@@ -2566,12 +2587,7 @@ int lfs_file_close(lfs_t *lfs, lfs_file_t *file) {
int err = lfs_file_sync(lfs, file); int err = lfs_file_sync(lfs, file);
// remove from list of mdirs // remove from list of mdirs
for (struct lfs_mlist **p = &lfs->mlist; *p; p = &(*p)->next) { lfs_mlist_remove(lfs, (struct lfs_mlist*)file);
if (*p == (struct lfs_mlist*)file) {
*p = (*p)->next;
break;
}
}
// clean up memory // clean up memory
if (!file->cfg->buffer) { if (!file->cfg->buffer) {
@@ -2808,7 +2824,7 @@ lfs_ssize_t lfs_file_read(lfs_t *lfs, lfs_file_t *file,
LFS_TRACE("lfs_file_read(%p, %p, %p, %"PRIu32")", LFS_TRACE("lfs_file_read(%p, %p, %p, %"PRIu32")",
(void*)lfs, (void*)file, buffer, size); (void*)lfs, (void*)file, buffer, size);
LFS_ASSERT(file->flags & LFS_F_OPENED); LFS_ASSERT(file->flags & LFS_F_OPENED);
LFS_ASSERT((file->flags & 3) != LFS_O_WRONLY); LFS_ASSERT((file->flags & LFS_O_RDWR) != LFS_O_WRONLY);
uint8_t *data = buffer; uint8_t *data = buffer;
lfs_size_t nsize = size; lfs_size_t nsize = size;
@@ -2888,7 +2904,7 @@ lfs_ssize_t lfs_file_write(lfs_t *lfs, lfs_file_t *file,
LFS_TRACE("lfs_file_write(%p, %p, %p, %"PRIu32")", LFS_TRACE("lfs_file_write(%p, %p, %p, %"PRIu32")",
(void*)lfs, (void*)file, buffer, size); (void*)lfs, (void*)file, buffer, size);
LFS_ASSERT(file->flags & LFS_F_OPENED); LFS_ASSERT(file->flags & LFS_F_OPENED);
LFS_ASSERT((file->flags & 3) != LFS_O_RDONLY); LFS_ASSERT((file->flags & LFS_O_RDWR) != LFS_O_RDONLY);
const uint8_t *data = buffer; const uint8_t *data = buffer;
lfs_size_t nsize = size; lfs_size_t nsize = size;
@@ -3053,7 +3069,7 @@ int lfs_file_truncate(lfs_t *lfs, lfs_file_t *file, lfs_off_t size) {
LFS_TRACE("lfs_file_truncate(%p, %p, %"PRIu32")", LFS_TRACE("lfs_file_truncate(%p, %p, %"PRIu32")",
(void*)lfs, (void*)file, size); (void*)lfs, (void*)file, size);
LFS_ASSERT(file->flags & LFS_F_OPENED); LFS_ASSERT(file->flags & LFS_F_OPENED);
LFS_ASSERT((file->flags & 3) != LFS_O_RDONLY); LFS_ASSERT((file->flags & LFS_O_RDWR) != LFS_O_RDONLY);
if (size > LFS_FILE_MAX) { if (size > LFS_FILE_MAX) {
LFS_TRACE("lfs_file_truncate -> %d", LFS_ERR_INVAL); LFS_TRACE("lfs_file_truncate -> %d", LFS_ERR_INVAL);