@@ -644,7 +644,8 @@ static int lfs_dir_traverse(lfs_t *lfs, lfs_mdir_t *dir,
644
644
int (* cb )(lfs_t * lfs , void * data , lfs_mattr_t attr ),
645
645
void * data );
646
646
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 );
648
649
649
650
static int lfs_commit_movescan (lfs_t * lfs , void * p , lfs_mattr_t attr ) {
650
651
struct lfs_commit_move * move = p ;
@@ -669,9 +670,9 @@ static int lfs_commit_movescan(lfs_t *lfs, void *p, lfs_mattr_t attr) {
669
670
.etag = move -> commit -> ptag ,
670
671
.stop_at_commit = true},
671
672
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 );
675
676
if (err && err != LFS_ERR_NOENT ) {
676
677
return err ;
677
678
}
@@ -1337,10 +1338,13 @@ static int lfs_dir_getscan(lfs_t *lfs, void *p, lfs_mattr_t attr) {
1337
1338
}
1338
1339
1339
1340
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 ;
1342
1346
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 });
1344
1348
if (res < 0 ) {
1345
1349
return res ;
1346
1350
}
@@ -1349,61 +1353,41 @@ static int lfs_dir_get(lfs_t *lfs, lfs_mdir_t *dir,
1349
1353
return LFS_ERR_NOENT ;
1350
1354
}
1351
1355
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 );
1363
1358
}
1364
1359
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
+ }
1386
1368
}
1387
1369
1388
1370
return 0 ;
1389
1371
}
1390
1372
1391
1373
static int lfs_dir_getinfo (lfs_t * lfs , lfs_mdir_t * dir ,
1392
1374
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 );
1399
1379
if (err ) {
1400
1380
return err ;
1401
1381
}
1402
1382
1403
1383
info -> type = lfs_tag_type (attr .tag );
1384
+ if (lfs_tag_size (attr .tag ) > lfs -> name_size ) {
1385
+ return LFS_ERR_RANGE ;
1386
+ }
1404
1387
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 );
1407
1391
if (err ) {
1408
1392
return err ;
1409
1393
}
@@ -1517,8 +1501,9 @@ static int lfs_dir_lookup(lfs_t *lfs, lfs_mdir_t *dir,
1517
1501
// TODO optimize grab for inline files and like?
1518
1502
// TODO would this mean more code?
1519
1503
// 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 );
1522
1507
if (err ) {
1523
1508
return err ;
1524
1509
}
@@ -1605,8 +1590,9 @@ int lfs_dir_open(lfs_t *lfs, lfs_dir_t *dir, const char *path) {
1605
1590
attr .u .pair [1 ] = lfs -> root [1 ];
1606
1591
} else {
1607
1592
// 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 );
1610
1596
if (err ) {
1611
1597
return err ;
1612
1598
}
@@ -1991,8 +1977,11 @@ int lfs_file_open(lfs_t *lfs, lfs_file_t *file,
1991
1977
return LFS_ERR_EXIST ;
1992
1978
}
1993
1979
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 );
1996
1985
if (err ) {
1997
1986
return err ;
1998
1987
}
@@ -2023,6 +2012,8 @@ int lfs_file_open(lfs_t *lfs, lfs_file_t *file,
2023
2012
}
2024
2013
2025
2014
if (lfs_tag_type (attr .tag ) == LFS_STRUCT_INLINE ) {
2015
+ // TODO make inline the better path?
2016
+ // TODO can inline and trunc be combined?
2026
2017
// load inline files
2027
2018
file -> head = 0xfffffffe ;
2028
2019
file -> size = lfs_tag_size (attr .tag );
@@ -2038,10 +2029,6 @@ int lfs_file_open(lfs_t *lfs, lfs_file_t *file,
2038
2029
return err ;
2039
2030
}
2040
2031
}
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 ));
2045
2032
}
2046
2033
2047
2034
// truncate if requested
@@ -2053,7 +2040,7 @@ int lfs_file_open(lfs_t *lfs, lfs_file_t *file,
2053
2040
file -> head = 0xfffffffe ;
2054
2041
file -> size = 0 ;
2055
2042
file -> flags |= LFS_F_INLINE ;
2056
- file -> cache .block = file -> head ;
2043
+ file -> cache .block = 0xfffffffe ;
2057
2044
file -> cache .off = 0 ;
2058
2045
}
2059
2046
@@ -2659,8 +2646,9 @@ int lfs_remove(lfs_t *lfs, const char *path) {
2659
2646
if (type == LFS_TYPE_DIR ) {
2660
2647
// must be empty before removal
2661
2648
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 );
2664
2652
if (err ) {
2665
2653
return err ;
2666
2654
}
@@ -2739,8 +2727,9 @@ int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath) {
2739
2727
if (prevtype == LFS_TYPE_DIR ) {
2740
2728
// must be empty before removal
2741
2729
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 );
2744
2733
if (err ) {
2745
2734
return err ;
2746
2735
}
@@ -3069,10 +3058,10 @@ int lfs_mount(lfs_t *lfs, const struct lfs_config *cfg) {
3069
3058
}
3070
3059
3071
3060
lfs_superblock_t superblock ;
3072
- err = lfs_dir_getbuffer (lfs , & dir , 0x7ffff000 , & ( lfs_mattr_t ){
3061
+ err = lfs_dir_get (lfs , & dir , 0x7ffff000 ,
3073
3062
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 ) {
3076
3065
return err ;
3077
3066
}
3078
3067
@@ -3089,9 +3078,9 @@ int lfs_mount(lfs_t *lfs, const struct lfs_config *cfg) {
3089
3078
return LFS_ERR_INVAL ;
3090
3079
}
3091
3080
3092
- err = lfs_dir_getbuffer (lfs , & dir , 0x7ffff000 , & ( lfs_mattr_t ){
3081
+ err = lfs_dir_get (lfs , & dir , 0x7ffff000 ,
3093
3082
lfs_mktag (LFS_STRUCT_DIR , 0 , sizeof (lfs -> root )),
3094
- . u . buffer = lfs -> root } );
3083
+ NULL , & lfs -> root );
3095
3084
if (err ) {
3096
3085
return err ;
3097
3086
}
@@ -3164,8 +3153,9 @@ int lfs_fs_traverse(lfs_t *lfs,
3164
3153
3165
3154
for (uint16_t id = 0 ; id < dir .count ; id ++ ) {
3166
3155
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 );
3169
3159
if (err ) {
3170
3160
if (err == LFS_ERR_NOENT ) {
3171
3161
continue ;
@@ -3315,8 +3305,9 @@ static int lfs_parent(lfs_t *lfs, const lfs_block_t pair[2],
3315
3305
3316
3306
if (err != LFS_ERR_NOENT ) {
3317
3307
// 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 );
3320
3311
if (err ) {
3321
3312
return err ;
3322
3313
}
0 commit comments