@@ -346,6 +346,10 @@ static inline bool lfs_pairsync(
346
346
(paira [0 ] == pairb [1 ] && paira [1 ] == pairb [0 ]);
347
347
}
348
348
349
+ static inline lfs_size_t lfs_entry_size (const lfs_entry_t * entry ) {
350
+ return 4 + entry -> d .elen + entry -> d .alen + entry -> d .nlen ;
351
+ }
352
+
349
353
static int lfs_dir_alloc (lfs_t * lfs , lfs_dir_t * dir ) {
350
354
// allocate pair of dir blocks
351
355
for (int i = 0 ; i < 2 ; i ++ ) {
@@ -571,8 +575,7 @@ static int lfs_dir_append(lfs_t *lfs, lfs_dir_t *dir,
571
575
lfs_entry_t * entry , const void * data ) {
572
576
// check if we fit, if top bit is set we do not and move on
573
577
while (true) {
574
- if (dir -> d .size + 4 + entry -> d .elen + entry -> d .alen + entry -> d .nlen
575
- <= lfs -> cfg -> block_size ) {
578
+ if (dir -> d .size + lfs_entry_size (entry ) <= lfs -> cfg -> block_size ) {
576
579
entry -> off = dir -> d .size - 4 ;
577
580
return lfs_dir_commit (lfs , dir , (struct lfs_region []){
578
581
{entry -> off , 0 , & entry -> d , sizeof (entry -> d )},
@@ -614,7 +617,8 @@ static int lfs_dir_append(lfs_t *lfs, lfs_dir_t *dir,
614
617
615
618
static int lfs_dir_remove (lfs_t * lfs , lfs_dir_t * dir , lfs_entry_t * entry ) {
616
619
// either shift out the one entry or remove the whole dir block
617
- if (dir -> d .size == sizeof (dir -> d )+ 4 ) {
620
+ if ((dir -> d .size & 0x7fffffff ) == sizeof (dir -> d )+ 4
621
+ + lfs_entry_size (entry )) {
618
622
lfs_dir_t pdir ;
619
623
int res = lfs_pred (lfs , dir -> pair , & pdir );
620
624
if (res < 0 ) {
@@ -623,18 +627,17 @@ static int lfs_dir_remove(lfs_t *lfs, lfs_dir_t *dir, lfs_entry_t *entry) {
623
627
624
628
if (!(pdir .d .size & 0x80000000 )) {
625
629
return lfs_dir_commit (lfs , dir , (struct lfs_region []){
626
- {entry -> off , 4 + entry -> d .elen + entry -> d .alen + entry -> d .nlen ,
627
- NULL , 0 },
630
+ {entry -> off , lfs_entry_size (entry ), NULL , 0 },
628
631
}, 1 );
629
632
} else {
633
+ pdir .d .size &= dir -> d .size | 0x7fffffff ;
630
634
pdir .d .tail [0 ] = dir -> d .tail [0 ];
631
635
pdir .d .tail [1 ] = dir -> d .tail [1 ];
632
- return lfs_dir_commit (lfs , dir , NULL , 0 );
636
+ return lfs_dir_commit (lfs , & pdir , NULL , 0 );
633
637
}
634
638
} else {
635
639
return lfs_dir_commit (lfs , dir , (struct lfs_region []){
636
- {entry -> off , 4 + entry -> d .elen + entry -> d .alen + entry -> d .nlen ,
637
- NULL , 0 },
640
+ {entry -> off , lfs_entry_size (entry ), NULL , 0 },
638
641
}, 1 );
639
642
}
640
643
}
@@ -662,8 +665,8 @@ static int lfs_dir_next(lfs_t *lfs, lfs_dir_t *dir, lfs_entry_t *entry) {
662
665
}
663
666
664
667
entry -> off = dir -> off ;
665
- dir -> off += 4 + entry -> d . elen + entry -> d . alen + entry -> d . nlen ;
666
- dir -> pos += 4 + entry -> d . elen + entry -> d . alen + entry -> d . nlen ;
668
+ dir -> off += lfs_entry_size ( entry ) ;
669
+ dir -> pos += lfs_entry_size ( entry ) ;
667
670
return 0 ;
668
671
}
669
672
@@ -1635,7 +1638,7 @@ int lfs_remove(lfs_t *lfs, const char *path) {
1635
1638
f -> pair [0 ] = 0xffffffff ;
1636
1639
f -> pair [1 ] = 0xffffffff ;
1637
1640
} else if (f -> poff > entry .off ) {
1638
- f -> poff -= 4 + entry . d . elen + entry . d . alen + entry . d . nlen ;
1641
+ f -> poff -= lfs_entry_size ( & entry ) ;
1639
1642
}
1640
1643
}
1641
1644
}
@@ -1739,7 +1742,7 @@ int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath) {
1739
1742
f -> pair [0 ] = 0xffffffff ;
1740
1743
f -> pair [1 ] = 0xffffffff ;
1741
1744
} else if (f -> poff > oldentry .off ) {
1742
- f -> poff -= 4 + oldentry . d . elen + oldentry . d . alen + oldentry . d . nlen ;
1745
+ f -> poff -= lfs_entry_size ( & oldentry ) ;
1743
1746
}
1744
1747
}
1745
1748
}
@@ -1974,7 +1977,7 @@ int lfs_traverse(lfs_t *lfs, int (*cb)(void*, lfs_block_t), void *data) {
1974
1977
return err ;
1975
1978
}
1976
1979
1977
- dir .off += 4 + entry . d . elen + entry . d . alen + entry . d . nlen ;
1980
+ dir .off += lfs_entry_size ( & entry ) ;
1978
1981
if ((0xf & entry .d .type ) == (0xf & LFS_TYPE_REG )) {
1979
1982
int err = lfs_index_traverse (lfs , & lfs -> rcache , NULL ,
1980
1983
entry .d .u .file .head , entry .d .u .file .size , cb , data );
0 commit comments