@@ -346,6 +346,10 @@ static inline bool lfs_pairsync(
346346 (paira [0 ] == pairb [1 ] && paira [1 ] == pairb [0 ]);
347347}
348348
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+
349353static int lfs_dir_alloc (lfs_t * lfs , lfs_dir_t * dir ) {
350354 // allocate pair of dir blocks
351355 for (int i = 0 ; i < 2 ; i ++ ) {
@@ -571,8 +575,7 @@ static int lfs_dir_append(lfs_t *lfs, lfs_dir_t *dir,
571575 lfs_entry_t * entry , const void * data ) {
572576 // check if we fit, if top bit is set we do not and move on
573577 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 ) {
576579 entry -> off = dir -> d .size - 4 ;
577580 return lfs_dir_commit (lfs , dir , (struct lfs_region []){
578581 {entry -> off , 0 , & entry -> d , sizeof (entry -> d )},
@@ -614,7 +617,8 @@ static int lfs_dir_append(lfs_t *lfs, lfs_dir_t *dir,
614617
615618static int lfs_dir_remove (lfs_t * lfs , lfs_dir_t * dir , lfs_entry_t * entry ) {
616619 // 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 )) {
618622 lfs_dir_t pdir ;
619623 int res = lfs_pred (lfs , dir -> pair , & pdir );
620624 if (res < 0 ) {
@@ -623,18 +627,17 @@ static int lfs_dir_remove(lfs_t *lfs, lfs_dir_t *dir, lfs_entry_t *entry) {
623627
624628 if (!(pdir .d .size & 0x80000000 )) {
625629 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 },
628631 }, 1 );
629632 } else {
633+ pdir .d .size &= dir -> d .size | 0x7fffffff ;
630634 pdir .d .tail [0 ] = dir -> d .tail [0 ];
631635 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 );
633637 }
634638 } else {
635639 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 },
638641 }, 1 );
639642 }
640643}
@@ -662,8 +665,8 @@ static int lfs_dir_next(lfs_t *lfs, lfs_dir_t *dir, lfs_entry_t *entry) {
662665 }
663666
664667 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 ) ;
667670 return 0 ;
668671}
669672
@@ -1635,7 +1638,7 @@ int lfs_remove(lfs_t *lfs, const char *path) {
16351638 f -> pair [0 ] = 0xffffffff ;
16361639 f -> pair [1 ] = 0xffffffff ;
16371640 } 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 ) ;
16391642 }
16401643 }
16411644 }
@@ -1739,7 +1742,7 @@ int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath) {
17391742 f -> pair [0 ] = 0xffffffff ;
17401743 f -> pair [1 ] = 0xffffffff ;
17411744 } 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 ) ;
17431746 }
17441747 }
17451748 }
@@ -1974,7 +1977,7 @@ int lfs_traverse(lfs_t *lfs, int (*cb)(void*, lfs_block_t), void *data) {
19741977 return err ;
19751978 }
19761979
1977- dir .off += 4 + entry . d . elen + entry . d . alen + entry . d . nlen ;
1980+ dir .off += lfs_entry_size ( & entry ) ;
19781981 if ((0xf & entry .d .type ) == (0xf & LFS_TYPE_REG )) {
19791982 int err = lfs_index_traverse (lfs , & lfs -> rcache , NULL ,
19801983 entry .d .u .file .head , entry .d .u .file .size , cb , data );
0 commit comments