@@ -725,6 +725,82 @@ code = '''
725725 lfs2_unmount(&lfs2) => 0;
726726'''
727727
728+ [cases .test_dirs_remove_read ]
729+ defines.N = 10
730+ if = ' N < BLOCK_COUNT/2'
731+ code = '''
732+ lfs2_t lfs2;
733+ lfs2_format(&lfs2, cfg) => 0;
734+ lfs2_mount(&lfs2, cfg) => 0;
735+ lfs2_mkdir(&lfs2, "prickly-pear") => 0;
736+ for (int i = 0; i < N; i++) {
737+ char path[1024];
738+ sprintf(path, "prickly-pear/cactus%03d", i);
739+ lfs2_mkdir(&lfs2, path) => 0;
740+ }
741+ lfs2_dir_t dir;
742+ lfs2_dir_open(&lfs2, &dir, "prickly-pear") => 0;
743+ struct lfs2_info info;
744+ lfs2_dir_read(&lfs2, &dir, &info) => 1;
745+ assert(info.type == LFS2_TYPE_DIR);
746+ assert(strcmp(info.name, ".") == 0);
747+ lfs2_dir_read(&lfs2, &dir, &info) => 1;
748+ assert(info.type == LFS2_TYPE_DIR);
749+ assert(strcmp(info.name, "..") == 0);
750+ for (int i = 0; i < N; i++) {
751+ char path[1024];
752+ sprintf(path, "cactus%03d", i);
753+ lfs2_dir_read(&lfs2, &dir, &info) => 1;
754+ assert(info.type == LFS2_TYPE_DIR);
755+ assert(strcmp(info.name, path) == 0);
756+ }
757+ lfs2_dir_read(&lfs2, &dir, &info) => 0;
758+ lfs2_dir_close(&lfs2, &dir) => 0;
759+ lfs2_unmount(&lfs2);
760+
761+ for (lfs2_size_t k = 0; k < N; k++) {
762+ for (lfs2_size_t j = 0; j < N; j++) {
763+ lfs2_mount(&lfs2, cfg) => 0;
764+ lfs2_dir_open(&lfs2, &dir, "prickly-pear") => 0;
765+ lfs2_dir_read(&lfs2, &dir, &info) => 1;
766+ assert(info.type == LFS2_TYPE_DIR);
767+ assert(strcmp(info.name, ".") == 0);
768+ lfs2_dir_read(&lfs2, &dir, &info) => 1;
769+ assert(info.type == LFS2_TYPE_DIR);
770+ assert(strcmp(info.name, "..") == 0);
771+ // iterate over dirs < j
772+ for (unsigned i = 0; i < j; i++) {
773+ char path[1024];
774+ sprintf(path, "cactus%03d", i);
775+ lfs2_dir_read(&lfs2, &dir, &info) => 1;
776+ assert(info.type == LFS2_TYPE_DIR);
777+ assert(strcmp(info.name, path) == 0);
778+ }
779+
780+ // remove k while iterating
781+ char path[1024];
782+ sprintf(path, "prickly-pear/cactus%03d", k);
783+ lfs2_remove(&lfs2, path) => 0;
784+
785+ // iterate over dirs >= j
786+ for (unsigned i = j; i < ((k >= j) ? N-1 : N); i++) {
787+ char path[1024];
788+ sprintf(path, "cactus%03d", (k >= j && i >= k) ? i+1 : i);
789+ lfs2_dir_read(&lfs2, &dir, &info) => 1;
790+ assert(info.type == LFS2_TYPE_DIR);
791+ assert(strcmp(info.name, path) == 0);
792+ }
793+ lfs2_dir_read(&lfs2, &dir, &info) => 0;
794+ lfs2_dir_close(&lfs2, &dir) => 0;
795+
796+ // recreate k
797+ sprintf(path, "prickly-pear/cactus%03d", k);
798+ lfs2_mkdir(&lfs2, path) => 0;
799+ lfs2_unmount(&lfs2) => 0;
800+ }
801+ }
802+ '''
803+
728804[cases .test_dirs_other_errors ]
729805code = '''
730806 lfs2_t lfs2;
0 commit comments