Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/littlefs-project/littlefs.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Haster <chaster@utexas.edu>2017-04-01 20:23:15 +0300
committerChristopher Haster <chaster@utexas.edu>2017-04-18 09:44:01 +0300
commita3734eeb34e09b85b59b53944f88b0325b968488 (patch)
tree0948d3a02e8ba5b4a98832a33425a8b76f149e35 /tests/test_dirs.sh
parent8a674524fcec8db761bc7c3818df58609a28623c (diff)
Added proper handling of orphans
Unfortunately, threading all dir blocks in a linked-list did not come without problems. While it's possible to atomically add a dir to the linked list (by adding the new dir into the linked-list position immediately after it's parent, requiring only one atomic update to the parent block), it is not easy to make sure the linked-list is in a state that always allows atomic removal of dirs. The simple solution is to allow this non-atomic removal, with an additional step to remove any orphans that could have been created by a power-loss. This deorphan step is only run if the normal allocator has failed.
Diffstat (limited to 'tests/test_dirs.sh')
-rwxr-xr-xtests/test_dirs.sh57
1 files changed, 57 insertions, 0 deletions
diff --git a/tests/test_dirs.sh b/tests/test_dirs.sh
index 0d891f5..4026c3f 100755
--- a/tests/test_dirs.sh
+++ b/tests/test_dirs.sh
@@ -123,5 +123,62 @@ tests/test.py << TEST
lfs_unmount(&lfs) => 0;
TEST
+echo "--- Directory deletion ---"
+tests/test.py << TEST
+ lfs_mount(&lfs, &config) => 0;
+ lfs_remove(&lfs, "potato") => LFS_ERROR_INVALID;
+ lfs_remove(&lfs, "potato/sweet") => 0;
+ lfs_remove(&lfs, "potato/baked") => 0;
+ lfs_remove(&lfs, "potato/fried") => 0;
+
+ lfs_dir_open(&lfs, &dir[0], "potato") => 0;
+ lfs_dir_read(&lfs, &dir[0], &info) => 1;
+ strcmp(info.name, ".") => 0;
+ info.type => LFS_TYPE_DIR;
+ lfs_dir_read(&lfs, &dir[0], &info) => 1;
+ strcmp(info.name, "..") => 0;
+ info.type => LFS_TYPE_DIR;
+ lfs_dir_read(&lfs, &dir[0], &info) => 0;
+ lfs_dir_close(&lfs, &dir[0]) => 0;
+
+ lfs_remove(&lfs, "potato") => 0;
+
+ lfs_dir_open(&lfs, &dir[0], "/") => 0;
+ lfs_dir_read(&lfs, &dir[0], &info) => 1;
+ strcmp(info.name, ".") => 0;
+ info.type => LFS_TYPE_DIR;
+ lfs_dir_read(&lfs, &dir[0], &info) => 1;
+ strcmp(info.name, "..") => 0;
+ info.type => LFS_TYPE_DIR;
+ lfs_dir_read(&lfs, &dir[0], &info) => 1;
+ strcmp(info.name, "burito") => 0;
+ info.type => LFS_TYPE_REG;
+ lfs_dir_read(&lfs, &dir[0], &info) => 1;
+ strcmp(info.name, "cactus") => 0;
+ info.type => LFS_TYPE_DIR;
+ lfs_dir_read(&lfs, &dir[0], &info) => 0;
+ lfs_dir_close(&lfs, &dir[0]) => 0;
+ lfs_unmount(&lfs) => 0;
+TEST
+tests/test.py << TEST
+ lfs_mount(&lfs, &config) => 0;
+ lfs_dir_open(&lfs, &dir[0], "/") => 0;
+ lfs_dir_read(&lfs, &dir[0], &info) => 1;
+ strcmp(info.name, ".") => 0;
+ info.type => LFS_TYPE_DIR;
+ lfs_dir_read(&lfs, &dir[0], &info) => 1;
+ strcmp(info.name, "..") => 0;
+ info.type => LFS_TYPE_DIR;
+ lfs_dir_read(&lfs, &dir[0], &info) => 1;
+ strcmp(info.name, "burito") => 0;
+ info.type => LFS_TYPE_REG;
+ lfs_dir_read(&lfs, &dir[0], &info) => 1;
+ strcmp(info.name, "cactus") => 0;
+ info.type => LFS_TYPE_DIR;
+ lfs_dir_read(&lfs, &dir[0], &info) => 0;
+ lfs_dir_close(&lfs, &dir[0]) => 0;
+ lfs_unmount(&lfs) => 0;
+TEST
+
echo "--- Results ---"
tests/stats.py