@@ -569,7 +569,18 @@ static int lfs_dir_commit(lfs_t *lfs, lfs_dir_t *dir,
569
569
// update references if we relocated
570
570
LFS_DEBUG ("Relocating %d %d to %d %d" ,
571
571
oldpair [0 ], oldpair [1 ], dir -> pair [0 ], dir -> pair [1 ]);
572
- return lfs_relocate (lfs , oldpair , dir -> pair );
572
+ int err = lfs_relocate (lfs , oldpair , dir -> pair );
573
+ if (err ) {
574
+ return err ;
575
+ }
576
+ }
577
+
578
+ // shift over any directories that are affected
579
+ for (lfs_dir_t * d = lfs -> dirs ; d ; d = d -> next ) {
580
+ if (lfs_paircmp (d -> pair , dir -> pair ) == 0 ) {
581
+ d -> pair [0 ] = dir -> pair [0 ];
582
+ d -> pair [1 ] = dir -> pair [1 ];
583
+ }
573
584
}
574
585
575
586
return 0 ;
@@ -628,7 +639,7 @@ static int lfs_dir_append(lfs_t *lfs, lfs_dir_t *dir,
628
639
}
629
640
630
641
static int lfs_dir_remove (lfs_t * lfs , lfs_dir_t * dir , lfs_entry_t * entry ) {
631
- // either shift out the one entry or remove the whole dir block
642
+ // check if we should just drop the directory block
632
643
if ((dir -> d .size & 0x7fffffff ) == sizeof (dir -> d )+ 4
633
644
+ lfs_entry_size (entry )) {
634
645
lfs_dir_t pdir ;
@@ -637,38 +648,44 @@ static int lfs_dir_remove(lfs_t *lfs, lfs_dir_t *dir, lfs_entry_t *entry) {
637
648
return res ;
638
649
}
639
650
640
- if (!(pdir .d .size & 0x80000000 )) {
641
- return lfs_dir_commit (lfs , dir , (struct lfs_region []){
642
- {entry -> off , lfs_entry_size (entry ), NULL , 0 },
643
- }, 1 );
644
- } else {
651
+ if (pdir .d .size & 0x80000000 ) {
645
652
pdir .d .size &= dir -> d .size | 0x7fffffff ;
646
653
pdir .d .tail [0 ] = dir -> d .tail [0 ];
647
654
pdir .d .tail [1 ] = dir -> d .tail [1 ];
648
655
return lfs_dir_commit (lfs , & pdir , NULL , 0 );
649
656
}
650
- } else {
651
- int err = lfs_dir_commit (lfs , dir , (struct lfs_region []){
652
- {entry -> off , lfs_entry_size (entry ), NULL , 0 },
653
- }, 1 );
654
- if (err ) {
655
- return err ;
656
- }
657
+ }
657
658
658
- // shift over any files that are affected
659
- for (lfs_file_t * f = lfs -> files ; f ; f = f -> next ) {
660
- if (lfs_paircmp (f -> pair , dir -> pair ) == 0 ) {
661
- if (f -> poff == entry -> off ) {
662
- f -> pair [0 ] = 0xffffffff ;
663
- f -> pair [1 ] = 0xffffffff ;
664
- } else if (f -> poff > entry -> off ) {
665
- f -> poff -= lfs_entry_size (entry );
666
- }
659
+ // shift out the entry
660
+ int err = lfs_dir_commit (lfs , dir , (struct lfs_region []){
661
+ {entry -> off , lfs_entry_size (entry ), NULL , 0 },
662
+ }, 1 );
663
+ if (err ) {
664
+ return err ;
665
+ }
666
+
667
+ // shift over any files/directories that are affected
668
+ for (lfs_file_t * f = lfs -> files ; f ; f = f -> next ) {
669
+ if (lfs_paircmp (f -> pair , dir -> pair ) == 0 ) {
670
+ if (f -> poff == entry -> off ) {
671
+ f -> pair [0 ] = 0xffffffff ;
672
+ f -> pair [1 ] = 0xffffffff ;
673
+ } else if (f -> poff > entry -> off ) {
674
+ f -> poff -= lfs_entry_size (entry );
667
675
}
668
676
}
677
+ }
669
678
670
- return 0 ;
679
+ for (lfs_dir_t * d = lfs -> dirs ; d ; d = d -> next ) {
680
+ if (lfs_paircmp (d -> pair , dir -> pair ) == 0 ) {
681
+ if (d -> off > entry -> off ) {
682
+ d -> off -= lfs_entry_size (entry );
683
+ d -> pos -= lfs_entry_size (entry );
684
+ }
685
+ }
671
686
}
687
+
688
+ return 0 ;
672
689
}
673
690
674
691
static int lfs_dir_next (lfs_t * lfs , lfs_dir_t * dir , lfs_entry_t * entry ) {
@@ -894,11 +911,23 @@ int lfs_dir_open(lfs_t *lfs, lfs_dir_t *dir, const char *path) {
894
911
dir -> head [1 ] = dir -> pair [1 ];
895
912
dir -> pos = sizeof (dir -> d ) - 2 ;
896
913
dir -> off = sizeof (dir -> d );
914
+
915
+ // add to list of directories
916
+ dir -> next = lfs -> dirs ;
917
+ lfs -> dirs = dir ;
918
+
897
919
return 0 ;
898
920
}
899
921
900
922
int lfs_dir_close (lfs_t * lfs , lfs_dir_t * dir ) {
901
- // do nothing, dir is always synchronized
923
+ // remove from list of directories
924
+ for (lfs_dir_t * * p = & lfs -> dirs ; * p ; p = & (* p )-> next ) {
925
+ if (* p == dir ) {
926
+ * p = dir -> next ;
927
+ break ;
928
+ }
929
+ }
930
+
902
931
return 0 ;
903
932
}
904
933
@@ -1902,6 +1931,7 @@ static int lfs_init(lfs_t *lfs, const struct lfs_config *cfg) {
1902
1931
lfs -> root [0 ] = 0xffffffff ;
1903
1932
lfs -> root [1 ] = 0xffffffff ;
1904
1933
lfs -> files = NULL ;
1934
+ lfs -> dirs = NULL ;
1905
1935
lfs -> deorphaned = false;
1906
1936
1907
1937
return 0 ;
0 commit comments