WIP Fixed deorphan test

This commit is contained in:
Christopher Haster
2018-07-30 09:10:04 -05:00
parent c3c15d7636
commit 868099836d
4 changed files with 57 additions and 47 deletions

42
lfs.c
View File

@@ -3255,6 +3255,12 @@ int lfs_fs_traverse(lfs_t *lfs, int (*cb)(void*, lfs_block_t), void *data) {
} }
*/ */
static int lfs_pred(lfs_t *lfs, const lfs_block_t pair[2], lfs_mdir_t *pdir) { static int lfs_pred(lfs_t *lfs, const lfs_block_t pair[2], lfs_mdir_t *pdir) {
if (lfs_pairisnull(lfs->root)) {
// TODO best place for this?
// TODO needed for relocate
return LFS_ERR_NOENT;
}
// iterate over all directory directory entries // iterate over all directory directory entries
pdir->tail[0] = 0; pdir->tail[0] = 0;
pdir->tail[1] = 1; pdir->tail[1] = 1;
@@ -3275,6 +3281,11 @@ static int lfs_pred(lfs_t *lfs, const lfs_block_t pair[2], lfs_mdir_t *pdir) {
static int32_t lfs_parent(lfs_t *lfs, const lfs_block_t pair[2], static int32_t lfs_parent(lfs_t *lfs, const lfs_block_t pair[2],
lfs_mdir_t *parent) { lfs_mdir_t *parent) {
if (lfs_pairisnull(lfs->root)) {
// TODO best place for this?
return LFS_ERR_NOENT;
}
// search for both orderings so we can reuse the find function // search for both orderings so we can reuse the find function
lfs_block_t child[2] = {pair[0], pair[1]}; lfs_block_t child[2] = {pair[0], pair[1]};
@@ -3531,18 +3542,19 @@ int lfs_deorphan(lfs_t *lfs) {
// return lfs_dir_setattrs(lfs, &dir, &entry, attrs, count); // return lfs_dir_setattrs(lfs, &dir, &entry, attrs, count);
//} //}
//static int lfs_fs_size_count(void *p, lfs_block_t block) { // TODO need lfs?
// lfs_size_t *size = p; static int lfs_fs_size_count(lfs_t *lfs, void *p, lfs_block_t block) {
// *size += 1; lfs_size_t *size = p;
// return 0; *size += 1;
//} return 0;
// }
//lfs_ssize_t lfs_fs_size(lfs_t *lfs) {
// lfs_size_t size = 0; lfs_ssize_t lfs_fs_size(lfs_t *lfs) {
// int err = lfs_fs_traverse(lfs, lfs_fs_size_count, &size); lfs_size_t size = 0;
// if (err) { int err = lfs_fs_traverse(lfs, lfs_fs_size_count, &size);
// return err; if (err) {
// } return err;
// }
// return size;
//} return size;
}

27
lfs.h
View File

@@ -249,7 +249,8 @@ struct lfs_info {
// Custom attribute structure // Custom attribute structure
struct lfs_attr { struct lfs_attr {
// Type of attribute, provided by user and used to identify the attribute // 8-bit Type of attribute, provided by user and used to
// identify the attribute
uint8_t type; uint8_t type;
// Pointer to buffer containing the attribute // Pointer to buffer containing the attribute
@@ -259,7 +260,7 @@ struct lfs_attr {
lfs_size_t size; lfs_size_t size;
// Pointer to next attribute in linked list // Pointer to next attribute in linked list
const struct lfs_attr *next; struct lfs_attr *next;
}; };
// Optional configuration provided during lfs_file_opencfg // Optional configuration provided during lfs_file_opencfg
@@ -268,9 +269,9 @@ struct lfs_file_config {
// If NULL, malloc will be used by default. // If NULL, malloc will be used by default.
void *buffer; void *buffer;
// Optional, custom attributes // Optional, linked list of custom attributes.
// TODO document more // TODO document more
const struct lfs_attr *attrs; struct lfs_attr *attrs;
}; };
@@ -582,7 +583,8 @@ lfs_soff_t lfs_dir_tell(lfs_t *lfs, lfs_dir_t *dir);
int lfs_dir_rewind(lfs_t *lfs, lfs_dir_t *dir); int lfs_dir_rewind(lfs_t *lfs, lfs_dir_t *dir);
/// Filesystem filesystem operations /// /// Filesystem filesystem operations /// TODO choose one
/// Miscellaneous littlefs specific operations /// TODO choose one
// Get custom attributes on the filesystem // Get custom attributes on the filesystem
// //
@@ -616,9 +618,6 @@ int lfs_fs_setattr(lfs_t *lfs,
// Returns the number of allocated blocks, or a negative error code on failure. // Returns the number of allocated blocks, or a negative error code on failure.
lfs_ssize_t lfs_fs_size(lfs_t *lfs); lfs_ssize_t lfs_fs_size(lfs_t *lfs);
/// Miscellaneous littlefs specific operations ///
// Traverse through all blocks in use by the filesystem // Traverse through all blocks in use by the filesystem
// //
// The provided callback will be called with each block address that is // The provided callback will be called with each block address that is
@@ -626,16 +625,8 @@ lfs_ssize_t lfs_fs_size(lfs_t *lfs);
// blocks are in use or how much of the storage is available. // blocks are in use or how much of the storage is available.
// //
// Returns a negative error code on failure. // Returns a negative error code on failure.
int lfs_traverse(lfs_t *lfs, int (*cb)(void*, lfs_block_t), void *data); // TODO don't pass lfs_t?
int lfs_fs_traverse(lfs_t *lfs, int (*cb)(lfs_t*, void*, lfs_block_t), void *data);
// Prunes any recoverable errors that may have occured in the filesystem
//
// Not needed to be called by user unless an operation is interrupted
// but the filesystem is still mounted. This is already called on first
// allocation.
//
// Returns a negative error code on failure.
int lfs_deorphan(lfs_t *lfs);
#endif #endif

View File

@@ -78,8 +78,11 @@ do
rm -rf blocks rm -rf blocks
mkdir blocks mkdir blocks
ln -s /dev/zero blocks/$(printf '%x' $i) ln -s /dev/zero blocks/$(printf '%x' $i)
echo $i 1i
lfs_mktree lfs_mktree
echo $i 2i
lfs_chktree lfs_chktree
echo $i 3i
done done
echo "--- Block persistance ---" echo "--- Block persistance ---"

View File

@@ -15,25 +15,29 @@ tests/test.py << TEST
lfs_mkdir(&lfs, "parent/child") => 0; lfs_mkdir(&lfs, "parent/child") => 0;
lfs_remove(&lfs, "parent/orphan") => 0; lfs_remove(&lfs, "parent/orphan") => 0;
TEST TEST
# remove most recent file, this should be the update to the previous # corrupt most recent commit, this should be the update to the previous
# linked-list entry and should orphan the child # linked-list entry and should orphan the child
rm -v blocks/8 truncate -s-14 blocks/8
tests/test.py << TEST tests/test.py << TEST
lfs_mount(&lfs, &cfg) => 0; lfs_mount(&lfs, &cfg) => 0;
lfs_stat(&lfs, "parent/orphan", &info) => LFS_ERR_NOENT;
unsigned before = 0;
lfs_traverse(&lfs, test_count, &before) => 0;
test_log("before", before);
lfs_deorphan(&lfs) => 0;
lfs_stat(&lfs, "parent/orphan", &info) => LFS_ERR_NOENT; lfs_stat(&lfs, "parent/orphan", &info) => LFS_ERR_NOENT;
unsigned after = 0; lfs_ssize_t before = lfs_fs_size(&lfs);
lfs_traverse(&lfs, test_count, &after) => 0; before => 10;
test_log("after", after);
lfs_unmount(&lfs) => 0;
lfs_mount(&lfs, &cfg) => 0;
lfs_stat(&lfs, "parent/orphan", &info) => LFS_ERR_NOENT;
lfs_ssize_t orphaned = lfs_fs_size(&lfs);
orphaned => 10;
lfs_mkdir(&lfs, "parent/otherchild") => 0;
lfs_stat(&lfs, "parent/orphan", &info) => LFS_ERR_NOENT;
lfs_ssize_t deorphaned = lfs_fs_size(&lfs);
deorphaned => 10;
int diff = before - after;
diff => 2;
lfs_unmount(&lfs) => 0; lfs_unmount(&lfs) => 0;
TEST TEST