Skip to content

Commit 61f454b

Browse files
committed
Added tests for resizable entries and custom attributes
Also found some bugs. Should now have a good amount of confidence in these features.
1 parent ea4ded4 commit 61f454b

File tree

6 files changed

+605
-64
lines changed

6 files changed

+605
-64
lines changed

Makefile

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,9 @@ size: $(OBJ)
3333
$(SIZE) -t $^
3434

3535
.SUFFIXES:
36-
test: test_format test_dirs test_files test_seek test_truncate \
37-
test_interspersed test_alloc test_paths test_orphan test_move test_corrupt
36+
test: test_format test_dirs test_files test_seek test_truncate test_entries \
37+
test_interspersed test_alloc test_paths test_attrs \
38+
test_orphan test_move test_corrupt
3839
test_%: tests/test_%.sh
3940
ifdef QUIET
4041
@./$< | sed -n '/^[-=]/p'

lfs.c

Lines changed: 71 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1739,87 +1739,87 @@ int lfs_file_open(lfs_t *lfs, lfs_file_t *file,
17391739
}
17401740

17411741
int lfs_file_close(lfs_t *lfs, lfs_file_t *file) {
1742-
int err = lfs_file_sync(lfs, file);
1742+
int err = lfs_file_sync(lfs, file);
17431743

1744-
// remove from list of files
1745-
for (lfs_file_t **p = &lfs->files; *p; p = &(*p)->next) {
1746-
if (*p == file) {
1747-
*p = file->next;
1748-
break;
1749-
}
1744+
// remove from list of files
1745+
for (lfs_file_t **p = &lfs->files; *p; p = &(*p)->next) {
1746+
if (*p == file) {
1747+
*p = file->next;
1748+
break;
17501749
}
1750+
}
17511751

1752-
// clean up memory
1753-
if (!lfs->cfg->file_buffer) {
1754-
lfs_free(file->cache.buffer);
1755-
}
1752+
// clean up memory
1753+
if (!lfs->cfg->file_buffer) {
1754+
lfs_free(file->cache.buffer);
1755+
}
17561756

1757+
return err;
1758+
}
1759+
1760+
static int lfs_file_relocate(lfs_t *lfs, lfs_file_t *file) {
1761+
relocate:;
1762+
// just relocate what exists into new block
1763+
lfs_block_t nblock;
1764+
int err = lfs_alloc(lfs, &nblock);
1765+
if (err) {
17571766
return err;
17581767
}
17591768

1760-
static int lfs_file_relocate(lfs_t *lfs, lfs_file_t *file) {
1761-
relocate:;
1762-
// just relocate what exists into new block
1763-
lfs_block_t nblock;
1764-
int err = lfs_alloc(lfs, &nblock);
1769+
err = lfs_bd_erase(lfs, nblock);
1770+
if (err) {
1771+
if (err == LFS_ERR_CORRUPT) {
1772+
goto relocate;
1773+
}
1774+
return err;
1775+
}
1776+
1777+
// either read from dirty cache or disk
1778+
for (lfs_off_t i = 0; i < file->off; i++) {
1779+
uint8_t data;
1780+
err = lfs_cache_read(lfs, &lfs->rcache, &file->cache,
1781+
file->block, i, &data, 1);
17651782
if (err) {
17661783
return err;
17671784
}
17681785

1769-
err = lfs_bd_erase(lfs, nblock);
1786+
err = lfs_cache_prog(lfs, &lfs->pcache, &lfs->rcache,
1787+
nblock, i, &data, 1);
17701788
if (err) {
17711789
if (err == LFS_ERR_CORRUPT) {
17721790
goto relocate;
17731791
}
17741792
return err;
17751793
}
1794+
}
17761795

1777-
// either read from dirty cache or disk
1778-
for (lfs_off_t i = 0; i < file->off; i++) {
1779-
uint8_t data;
1780-
err = lfs_cache_read(lfs, &lfs->rcache, &file->cache,
1781-
file->block, i, &data, 1);
1782-
if (err) {
1783-
return err;
1784-
}
1785-
1786-
err = lfs_cache_prog(lfs, &lfs->pcache, &lfs->rcache,
1787-
nblock, i, &data, 1);
1788-
if (err) {
1789-
if (err == LFS_ERR_CORRUPT) {
1790-
goto relocate;
1791-
}
1792-
return err;
1793-
}
1794-
}
1796+
// copy over new state of file
1797+
memcpy(file->cache.buffer, lfs->pcache.buffer, lfs->cfg->prog_size);
1798+
file->cache.block = lfs->pcache.block;
1799+
file->cache.off = lfs->pcache.off;
1800+
lfs->pcache.block = 0xffffffff;
17951801

1796-
// copy over new state of file
1797-
memcpy(file->cache.buffer, lfs->pcache.buffer, lfs->cfg->prog_size);
1798-
file->cache.block = lfs->pcache.block;
1799-
file->cache.off = lfs->pcache.off;
1800-
lfs->pcache.block = 0xffffffff;
1802+
file->block = nblock;
1803+
return 0;
1804+
}
18011805

1802-
file->block = nblock;
1803-
return 0;
1806+
static int lfs_file_flush(lfs_t *lfs, lfs_file_t *file) {
1807+
if (file->flags & LFS_F_READING) {
1808+
file->flags &= ~LFS_F_READING;
18041809
}
18051810

1806-
static int lfs_file_flush(lfs_t *lfs, lfs_file_t *file) {
1807-
if (file->flags & LFS_F_READING) {
1808-
file->flags &= ~LFS_F_READING;
1809-
}
1810-
1811-
if (file->flags & LFS_F_WRITING) {
1812-
lfs_off_t pos = file->pos;
1811+
if (file->flags & LFS_F_WRITING) {
1812+
lfs_off_t pos = file->pos;
18131813

1814-
if (!(file->flags & LFS_F_INLINE)) {
1815-
// copy over anything after current branch
1816-
lfs_file_t orig = {
1817-
.head = file->head,
1818-
.size = file->size,
1819-
.flags = LFS_O_RDONLY,
1820-
.pos = file->pos,
1821-
.cache = lfs->rcache,
1822-
};
1814+
if (!(file->flags & LFS_F_INLINE)) {
1815+
// copy over anything after current branch
1816+
lfs_file_t orig = {
1817+
.head = file->head,
1818+
.size = file->size,
1819+
.flags = LFS_O_RDONLY,
1820+
.pos = file->pos,
1821+
.cache = lfs->rcache,
1822+
};
18231823
lfs->rcache.block = 0xffffffff;
18241824

18251825
while (file->pos < file->size) {
@@ -2270,6 +2270,7 @@ int lfs_file_getattrs(lfs_t *lfs, lfs_file_t *file,
22702270
return LFS_ERR_RANGE;
22712271
}
22722272

2273+
memset(attrs[j].buffer, 0, attrs[j].size);
22732274
memcpy(attrs[j].buffer,
22742275
file->attrs[i].buffer, file->attrs[i].size);
22752276
}
@@ -2281,9 +2282,9 @@ int lfs_file_getattrs(lfs_t *lfs, lfs_file_t *file,
22812282

22822283
int lfs_file_setattrs(lfs_t *lfs, lfs_file_t *file,
22832284
const struct lfs_attr *attrs, int count) {
2284-
// just tack to the file, will be written at sync time
2285-
file->attrs = attrs;
2286-
file->attrcount = count;
2285+
if ((file->flags & 3) == LFS_O_RDONLY) {
2286+
return LFS_ERR_BADF;
2287+
}
22872288

22882289
// at least make sure attributes fit
22892290
if (!lfs_pairisnull(file->pair)) {
@@ -2306,6 +2307,11 @@ int lfs_file_setattrs(lfs_t *lfs, lfs_file_t *file,
23062307
}
23072308
}
23082309

2310+
// just tack to the file, will be written at sync time
2311+
file->attrs = attrs;
2312+
file->attrcount = count;
2313+
file->flags |= LFS_F_DIRTY;
2314+
23092315
return 0;
23102316
}
23112317

@@ -2432,6 +2438,10 @@ int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath) {
24322438
return LFS_ERR_NAMETOOLONG;
24332439
}
24342440

2441+
if (oldentry.size - oldentry.d.nlen + nlen > lfs->cfg->block_size) {
2442+
return LFS_ERR_NOSPC;
2443+
}
2444+
24352445
// must have same type
24362446
if (prevexists && preventry.d.type != oldentry.d.type) {
24372447
return LFS_ERR_ISDIR;

tests/test.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ def generate(test):
1010
template = file.read()
1111

1212
lines = []
13-
for line in re.split('(?<=[;{}])\n', test.read()):
13+
for line in re.split('(?<=(?:.;| [{}]))\n', test.read()):
1414
match = re.match('(?: *\n)*( *)(.*)=>(.*);', line, re.DOTALL | re.MULTILINE)
1515
if match:
1616
tab, test, expect = match.groups()

0 commit comments

Comments
 (0)