mirror of
https://github.com/eledio-devices/thirdparty-littlefs.git
synced 2025-11-01 16:14:13 +01:00
WIP something something flexible updates
This commit is contained in:
77
lfs.c
77
lfs.c
@@ -676,6 +676,59 @@ static int lfs_dir_update(lfs_t *lfs, lfs_dir_t *dir,
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int lfs_dir_append_(lfs_t *lfs, lfs_dir_t *dir,
|
||||||
|
lfs_entry_t *entry, struct lfs_region *region) {
|
||||||
|
// check if we fit, if top bit is set we do not and move on
|
||||||
|
while (true) {
|
||||||
|
if (dir->d.size + lfs_entry_size(entry) <= lfs->cfg->block_size) {
|
||||||
|
entry->off = dir->d.size - 4;
|
||||||
|
for (struct lfs_region *r = region; r; r = r->next) {
|
||||||
|
r->oldoff += entry->off;
|
||||||
|
}
|
||||||
|
|
||||||
|
lfs_entry_tole32(&entry->d);
|
||||||
|
int err = lfs_dir_commit(lfs, dir,
|
||||||
|
&(struct lfs_region){
|
||||||
|
LFS_FROM_MEM, entry->off, 0,
|
||||||
|
{.m.data = &entry->d}, 4, region});
|
||||||
|
lfs_entry_fromle32(&entry->d);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
// we need to allocate a new dir block
|
||||||
|
if (!(0x80000000 & dir->d.size)) {
|
||||||
|
lfs_dir_t olddir = *dir;
|
||||||
|
int err = lfs_dir_alloc(lfs, dir);
|
||||||
|
if (err) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
dir->d.tail[0] = olddir.d.tail[0];
|
||||||
|
dir->d.tail[1] = olddir.d.tail[1];
|
||||||
|
entry->off = dir->d.size - 4;
|
||||||
|
lfs_entry_tole32(&entry->d);
|
||||||
|
err = lfs_dir_commit(lfs, dir,
|
||||||
|
&(struct lfs_region){
|
||||||
|
LFS_FROM_MEM, entry->off, 0,
|
||||||
|
{.m.data = &entry->d}, 4, region});
|
||||||
|
lfs_entry_fromle32(&entry->d);
|
||||||
|
if (err) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
olddir.d.size |= 0x80000000;
|
||||||
|
olddir.d.tail[0] = dir->pair[0];
|
||||||
|
olddir.d.tail[1] = dir->pair[1];
|
||||||
|
return lfs_dir_commit(lfs, &olddir, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
int err = lfs_dir_fetch(lfs, dir, dir->d.tail);
|
||||||
|
if (err) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int lfs_dir_append(lfs_t *lfs, lfs_dir_t *dir,
|
static int lfs_dir_append(lfs_t *lfs, lfs_dir_t *dir,
|
||||||
lfs_entry_t *entry, const void *data) {
|
lfs_entry_t *entry, const void *data) {
|
||||||
// check if we fit, if top bit is set we do not and move on
|
// check if we fit, if top bit is set we do not and move on
|
||||||
@@ -973,7 +1026,13 @@ int lfs_mkdir(lfs_t *lfs, const char *path) {
|
|||||||
cwd.d.tail[0] = dir.pair[0];
|
cwd.d.tail[0] = dir.pair[0];
|
||||||
cwd.d.tail[1] = dir.pair[1];
|
cwd.d.tail[1] = dir.pair[1];
|
||||||
|
|
||||||
err = lfs_dir_append(lfs, &cwd, &entry, path);
|
err = lfs_dir_append_(lfs, &cwd, &entry,
|
||||||
|
&(struct lfs_region){
|
||||||
|
LFS_FROM_MEM, 0, 0,
|
||||||
|
{.m.data = (uint8_t*)&entry.d + 4}, sizeof(entry.d) - 4,
|
||||||
|
&(struct lfs_region){
|
||||||
|
LFS_FROM_MEM, 0, 0,
|
||||||
|
{.m.data = path}, entry.d.nlen}});
|
||||||
if (err) {
|
if (err) {
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@@ -1357,7 +1416,13 @@ int lfs_file_open(lfs_t *lfs, lfs_file_t *file,
|
|||||||
entry.d.nlen = strlen(path);
|
entry.d.nlen = strlen(path);
|
||||||
entry.d.u.file.head = 0xffffffff;
|
entry.d.u.file.head = 0xffffffff;
|
||||||
entry.d.u.file.size = 0;
|
entry.d.u.file.size = 0;
|
||||||
err = lfs_dir_append(lfs, &cwd, &entry, path);
|
err = lfs_dir_append_(lfs, &cwd, &entry,
|
||||||
|
&(struct lfs_region){
|
||||||
|
LFS_FROM_MEM, 0, 0,
|
||||||
|
{.m.data = (uint8_t*)&entry.d + 4}, sizeof(entry.d) - 4,
|
||||||
|
&(struct lfs_region){
|
||||||
|
LFS_FROM_MEM, 0, 0,
|
||||||
|
{.m.data = path}, entry.d.nlen}});
|
||||||
if (err) {
|
if (err) {
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@@ -2017,7 +2082,13 @@ int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath) {
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
err = lfs_dir_append(lfs, &newcwd, &newentry, newpath);
|
err = lfs_dir_append_(lfs, &newcwd, &newentry,
|
||||||
|
&(struct lfs_region){
|
||||||
|
LFS_FROM_MEM, 0, 0,
|
||||||
|
{.m.data = (uint8_t*)&newentry.d + 4}, sizeof(newentry.d) - 4,
|
||||||
|
&(struct lfs_region){
|
||||||
|
LFS_FROM_MEM, 0, 0,
|
||||||
|
{.m.data = newpath}, newentry.d.nlen}});
|
||||||
if (err) {
|
if (err) {
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user