Skip to content

Commit 67d9f88

Browse files
committed
Combined get functions into one
Unfortunately, the three different sets of get functions were not contributing very much, and having three different get functions means we may be wasting code on redundant code paths. By dropping the user of the lfs_mattr_t struct in favor of a buffer, we can combine the three code paths with a bit of tweaking.
1 parent 7ad9700 commit 67d9f88

File tree

1 file changed

+62
-71
lines changed

1 file changed

+62
-71
lines changed

lfs.c

Lines changed: 62 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -644,7 +644,8 @@ static int lfs_dir_traverse(lfs_t *lfs, lfs_mdir_t *dir,
644644
int (*cb)(lfs_t *lfs, void *data, lfs_mattr_t attr),
645645
void *data);
646646
static int lfs_dir_get(lfs_t *lfs, lfs_mdir_t *dir,
647-
uint32_t mask, lfs_mattr_t *attr);
647+
uint32_t getmask, lfs_tag_t gettag,
648+
lfs_tag_t *gottag, void *getbuffer);
648649

649650
static int lfs_commit_movescan(lfs_t *lfs, void *p, lfs_mattr_t attr) {
650651
struct lfs_commit_move *move = p;
@@ -669,9 +670,9 @@ static int lfs_commit_movescan(lfs_t *lfs, void *p, lfs_mattr_t attr) {
669670
.etag=move->commit->ptag,
670671
.stop_at_commit=true},
671672
lfs_tag_isuser(attr.tag) ? 0x7ffff000 : 0x7c3ff000,
672-
&(lfs_mattr_t){
673-
lfs_mktag(lfs_tag_type(attr.tag),
674-
move->id.to - move->commit->filter.begin, 0)}); // TODO can all these filter adjustments be consolidated?
673+
lfs_mktag(lfs_tag_type(attr.tag),
674+
move->id.to - move->commit->filter.begin, 0), // TODO can all these filter adjustments be consolidated?
675+
NULL, NULL);
675676
if (err && err != LFS_ERR_NOENT) {
676677
return err;
677678
}
@@ -1337,10 +1338,13 @@ static int lfs_dir_getscan(lfs_t *lfs, void *p, lfs_mattr_t attr) {
13371338
}
13381339

13391340
static int lfs_dir_get(lfs_t *lfs, lfs_mdir_t *dir,
1340-
uint32_t mask, lfs_mattr_t *attr) {
1341-
uint16_t id = lfs_tag_id(attr->tag);
1341+
uint32_t getmask, lfs_tag_t gettag,
1342+
lfs_tag_t *foundtag, void *buffer) {
1343+
uint16_t id = lfs_tag_id(gettag);
1344+
lfs_size_t size = lfs_tag_size(gettag);
1345+
lfs_mattr_t attr;
13421346
int res = lfs_dir_traverse(lfs, dir, lfs_dir_getscan,
1343-
&(struct lfs_dir_get){mask, attr->tag, attr});
1347+
&(struct lfs_dir_get){getmask, gettag, &attr});
13441348
if (res < 0) {
13451349
return res;
13461350
}
@@ -1349,61 +1353,41 @@ static int lfs_dir_get(lfs_t *lfs, lfs_mdir_t *dir,
13491353
return LFS_ERR_NOENT;
13501354
}
13511355

1352-
attr->tag = lfs_mktag(0, id, 0) | (attr->tag & 0xffc00fff);
1353-
return 0;
1354-
}
1355-
1356-
static int lfs_dir_getbuffer(lfs_t *lfs, lfs_mdir_t *dir,
1357-
uint32_t mask, lfs_mattr_t *attr) {
1358-
void *buffer = attr->u.buffer;
1359-
lfs_size_t size = lfs_tag_size(attr->tag);
1360-
int err = lfs_dir_get(lfs, dir, mask, attr);
1361-
if (err) {
1362-
return err;
1356+
if (foundtag) {
1357+
*foundtag = lfs_mktag(0, id, 0) | (attr.tag & 0xffc00fff);
13631358
}
13641359

1365-
lfs_size_t diff = lfs_min(size, lfs_tag_size(attr->tag));
1366-
memset((uint8_t*)buffer + diff, 0, size - diff);
1367-
err = lfs_bd_read(lfs, attr->u.d.block, attr->u.d.off, buffer, diff);
1368-
if (err) {
1369-
return err;
1370-
}
1371-
1372-
if (lfs_tag_size(attr->tag) > size) {
1373-
return LFS_ERR_RANGE;
1374-
}
1375-
1376-
return 0;
1377-
}
1378-
1379-
static int lfs_dir_getentry(lfs_t *lfs, lfs_mdir_t *dir,
1380-
uint32_t mask, lfs_tag_t tag, lfs_mattr_t *attr) {
1381-
attr->tag = tag | sizeof(attr->u);
1382-
attr->u.buffer = &attr->u;
1383-
int err = lfs_dir_getbuffer(lfs, dir, mask, attr);
1384-
if (err && err != LFS_ERR_RANGE) {
1385-
return err;
1360+
if (buffer) {
1361+
lfs_size_t diff = lfs_min(size, lfs_tag_size(attr.tag));
1362+
memset((uint8_t*)buffer + diff, 0, size - diff);
1363+
int err = lfs_bd_read(lfs, attr.u.d.block, attr.u.d.off,
1364+
buffer, diff);
1365+
if (err) {
1366+
return err;
1367+
}
13861368
}
13871369

13881370
return 0;
13891371
}
13901372

13911373
static int lfs_dir_getinfo(lfs_t *lfs, lfs_mdir_t *dir,
13921374
int16_t id, struct lfs_info *info) {
1393-
lfs_mattr_t attr = {
1394-
lfs_mktag(LFS_TYPE_NAME, id, lfs->name_size+1),
1395-
.u.buffer=info->name,
1396-
};
1397-
1398-
int err = lfs_dir_getbuffer(lfs, dir, 0x7c3ff000, &attr);
1375+
lfs_mattr_t attr;
1376+
int err = lfs_dir_get(lfs, dir, 0x7c3ff000,
1377+
lfs_mktag(LFS_TYPE_NAME, id, lfs->name_size+1),
1378+
&attr.tag, info->name);
13991379
if (err) {
14001380
return err;
14011381
}
14021382

14031383
info->type = lfs_tag_type(attr.tag);
1384+
if (lfs_tag_size(attr.tag) > lfs->name_size) {
1385+
return LFS_ERR_RANGE;
1386+
}
14041387

1405-
err = lfs_dir_getentry(lfs, dir, 0x7c3ff000,
1406-
lfs_mktag(LFS_TYPE_STRUCT, id, 0), &attr);
1388+
err = lfs_dir_get(lfs, dir, 0x7c3ff000,
1389+
lfs_mktag(LFS_TYPE_STRUCT, id, 8),
1390+
&attr.tag, &attr.u);
14071391
if (err) {
14081392
return err;
14091393
}
@@ -1517,8 +1501,9 @@ static int lfs_dir_lookup(lfs_t *lfs, lfs_mdir_t *dir,
15171501
// TODO optimize grab for inline files and like?
15181502
// TODO would this mean more code?
15191503
// grab the entry data
1520-
int err = lfs_dir_getentry(lfs, dir, 0x7c3ff000,
1521-
lfs_mktag(LFS_TYPE_STRUCT, *id, 0), &attr);
1504+
int err = lfs_dir_get(lfs, dir, 0x7c3ff000,
1505+
lfs_mktag(LFS_TYPE_STRUCT, *id, 8),
1506+
&attr.tag, &attr.u);
15221507
if (err) {
15231508
return err;
15241509
}
@@ -1605,8 +1590,9 @@ int lfs_dir_open(lfs_t *lfs, lfs_dir_t *dir, const char *path) {
16051590
attr.u.pair[1] = lfs->root[1];
16061591
} else {
16071592
// get dir pair from parent
1608-
err = lfs_dir_getentry(lfs, &dir->m, 0x7c3ff000,
1609-
lfs_mktag(LFS_TYPE_STRUCT, id, 0), &attr);
1593+
err = lfs_dir_get(lfs, &dir->m, 0x7c3ff000,
1594+
lfs_mktag(LFS_TYPE_STRUCT, id, 8),
1595+
&attr.tag, &attr.u);
16101596
if (err) {
16111597
return err;
16121598
}
@@ -1991,8 +1977,11 @@ int lfs_file_open(lfs_t *lfs, lfs_file_t *file,
19911977
return LFS_ERR_EXIST;
19921978
}
19931979

1994-
attr.tag = lfs_mktag(LFS_TYPE_STRUCT, id, 0);
1995-
err = lfs_dir_get(lfs, &cwd, 0x7c3ff000, &attr);
1980+
// TODO allow no entry?
1981+
// TODO move this into one load? If cache >= 8 would work
1982+
err = lfs_dir_get(lfs, &cwd, 0x7c3ff000,
1983+
lfs_mktag(LFS_TYPE_STRUCT, id, 8),
1984+
&attr.tag, &file->head);
19961985
if (err) {
19971986
return err;
19981987
}
@@ -2023,6 +2012,8 @@ int lfs_file_open(lfs_t *lfs, lfs_file_t *file,
20232012
}
20242013

20252014
if (lfs_tag_type(attr.tag) == LFS_STRUCT_INLINE) {
2015+
// TODO make inline the better path?
2016+
// TODO can inline and trunc be combined?
20262017
// load inline files
20272018
file->head = 0xfffffffe;
20282019
file->size = lfs_tag_size(attr.tag);
@@ -2038,10 +2029,6 @@ int lfs_file_open(lfs_t *lfs, lfs_file_t *file,
20382029
return err;
20392030
}
20402031
}
2041-
} else {
2042-
// use ctz list from entry
2043-
err = lfs_bd_read(lfs, attr.u.d.block, attr.u.d.off,
2044-
&file->head, 2*sizeof(uint32_t));
20452032
}
20462033

20472034
// truncate if requested
@@ -2053,7 +2040,7 @@ int lfs_file_open(lfs_t *lfs, lfs_file_t *file,
20532040
file->head = 0xfffffffe;
20542041
file->size = 0;
20552042
file->flags |= LFS_F_INLINE;
2056-
file->cache.block = file->head;
2043+
file->cache.block = 0xfffffffe;
20572044
file->cache.off = 0;
20582045
}
20592046

@@ -2659,8 +2646,9 @@ int lfs_remove(lfs_t *lfs, const char *path) {
26592646
if (type == LFS_TYPE_DIR) {
26602647
// must be empty before removal
26612648
lfs_mattr_t attr;
2662-
err = lfs_dir_getentry(lfs, &cwd, 0x7c3ff000,
2663-
lfs_mktag(LFS_TYPE_STRUCT, id, 0), &attr);
2649+
err = lfs_dir_get(lfs, &cwd, 0x7c3ff000,
2650+
lfs_mktag(LFS_TYPE_STRUCT, id, 8),
2651+
&attr.tag, &attr.u);
26642652
if (err) {
26652653
return err;
26662654
}
@@ -2739,8 +2727,9 @@ int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath) {
27392727
if (prevtype == LFS_TYPE_DIR) {
27402728
// must be empty before removal
27412729
lfs_mattr_t prevattr;
2742-
err = lfs_dir_getentry(lfs, &newcwd, 0x7c3ff000,
2743-
lfs_mktag(LFS_TYPE_STRUCT, newid, 0), &prevattr);
2730+
err = lfs_dir_get(lfs, &newcwd, 0x7c3ff000,
2731+
lfs_mktag(LFS_TYPE_STRUCT, newid, 8),
2732+
&prevattr.tag, &prevattr.u);
27442733
if (err) {
27452734
return err;
27462735
}
@@ -3069,10 +3058,10 @@ int lfs_mount(lfs_t *lfs, const struct lfs_config *cfg) {
30693058
}
30703059

30713060
lfs_superblock_t superblock;
3072-
err = lfs_dir_getbuffer(lfs, &dir, 0x7ffff000, &(lfs_mattr_t){
3061+
err = lfs_dir_get(lfs, &dir, 0x7ffff000,
30733062
lfs_mktag(LFS_TYPE_SUPERBLOCK, 0, sizeof(superblock)),
3074-
.u.buffer=&superblock});
3075-
if (err && err != LFS_ERR_RANGE) {
3063+
NULL, &superblock);
3064+
if (err) {
30763065
return err;
30773066
}
30783067

@@ -3089,9 +3078,9 @@ int lfs_mount(lfs_t *lfs, const struct lfs_config *cfg) {
30893078
return LFS_ERR_INVAL;
30903079
}
30913080

3092-
err = lfs_dir_getbuffer(lfs, &dir, 0x7ffff000, &(lfs_mattr_t){
3081+
err = lfs_dir_get(lfs, &dir, 0x7ffff000,
30933082
lfs_mktag(LFS_STRUCT_DIR, 0, sizeof(lfs->root)),
3094-
.u.buffer=lfs->root});
3083+
NULL, &lfs->root);
30953084
if (err) {
30963085
return err;
30973086
}
@@ -3164,8 +3153,9 @@ int lfs_fs_traverse(lfs_t *lfs,
31643153

31653154
for (uint16_t id = 0; id < dir.count; id++) {
31663155
lfs_mattr_t attr;
3167-
int err = lfs_dir_getentry(lfs, &dir, 0x7c3ff000,
3168-
lfs_mktag(LFS_TYPE_STRUCT, id, 0), &attr);
3156+
int err = lfs_dir_get(lfs, &dir, 0x7c3ff000,
3157+
lfs_mktag(LFS_TYPE_STRUCT, id, 8),
3158+
&attr.tag, &attr.u);
31693159
if (err) {
31703160
if (err == LFS_ERR_NOENT) {
31713161
continue;
@@ -3315,8 +3305,9 @@ static int lfs_parent(lfs_t *lfs, const lfs_block_t pair[2],
33153305

33163306
if (err != LFS_ERR_NOENT) {
33173307
// found our parent
3318-
int err = lfs_dir_getentry(lfs, parent,
3319-
0x7ffff000, foundtag, attr);
3308+
int err = lfs_dir_get(lfs, parent,
3309+
0x7ffff000, foundtag,
3310+
&attr->tag, &attr->u);
33203311
if (err) {
33213312
return err;
33223313
}

0 commit comments

Comments
 (0)