Skip to content
Closed
Changes from 1 commit
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
49698e4
Separated type/struct fields in dir entries
geky Mar 3, 2018
4c35c86
Added different sources for commits, now with disk->disk moves
geky Mar 4, 2018
73d29f0
Adopted a tiny LISP-like DSL for some extra flexibility
geky Mar 11, 2018
e3daee2
Changed dir append to mirror commit DSL
geky Mar 11, 2018
692f0c5
Naive implementation of resizable entries
geky Mar 11, 2018
ca3d6a5
Made implicity tag updates explicit
geky Mar 11, 2018
f30ab67
Traded enum-based DSL for full callback-based DSL
geky Mar 11, 2018
e4a0cd9
Take advantage of empty space early in dir search
geky Mar 12, 2018
362b0bb
Minor improvement to from-memory commits
geky Mar 13, 2018
03b262b
Separated out version of dir remove/append for non-entries
geky Mar 16, 2018
9273ac7
Added size field to entry structure
geky Mar 16, 2018
fb23044
Fixed big-endian support for entry structures
geky Mar 16, 2018
836e238
Shoehorned in hacky implementation of inline files
geky Mar 17, 2018
d8cadec
Better implementation of inline files, now with overflowing
geky Mar 18, 2018
701e4fa
Fixed a handful of bugs as result of testing
geky Mar 19, 2018
d0e0453
Changed how we write out superblock to use append
geky Mar 23, 2018
ad74825
Added internal lfs_dir_get to consolidate logic for reading dir entries
geky Mar 23, 2018
9555458
Added internal lfs_dir_set, an umbrella to dir append/update/remove o…
geky Mar 27, 2018
6362afa
Added disk-backed limits on the name/attrs/inline sizes
geky Apr 1, 2018
6774276
Expanded inline files up to a limit of 1023 bytes
geky Apr 3, 2018
65ea6b3
Bumped versions, cleaned up some TODOs and missing comments
geky Apr 3, 2018
6ffc8d3
Added simple custom attributes
geky Apr 6, 2018
6c754c8
Added support for atomically committing custom attributes
geky Apr 6, 2018
636c0ed
Modified commit regions to work better with custom attributes
geky Apr 8, 2018
93244a3
Added file-level and fs-level custom attribute APIs
geky Apr 8, 2018
746b909
Added lfs_fs_size for finding a count of used blocks
geky Apr 9, 2018
2a8277b
Added test coverage for filesystems with no inline files
geky Apr 10, 2018
ea4ded4
Fixed big-endian support again
geky Apr 10, 2018
61f454b
Added tests for resizable entries and custom attributes
geky Apr 11, 2018
1f8c509
Changed license to BSD-3-Clause
geky Jun 21, 2018
c23481c
Fixed script issue with bash expansion inside makefile parameter
geky Jul 10, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Added internal lfs_dir_get to consolidate logic for reading dir entries
It's a relatively simple function but offers some code reuse as well as
making the dir entry operations a bit more readable.
  • Loading branch information
geky committed Oct 10, 2018
commit ad74825bcf9ba1f4ab4742f26515f6a2bb92d6d4
29 changes: 17 additions & 12 deletions lfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -677,6 +677,12 @@ static int lfs_dir_commit(lfs_t *lfs, lfs_dir_t *dir,
return 0;
}

// TODO zeros?
static int lfs_dir_get(lfs_t *lfs, const lfs_dir_t *dir,
lfs_off_t off, void *buffer, lfs_size_t size) {
return lfs_bd_read(lfs, dir->pair[0], off, buffer, size);
}

static int lfs_dir_append(lfs_t *lfs, lfs_dir_t *dir,
lfs_entry_t *entry, struct lfs_region *regions) {
// check if we fit, if top bit is set we do not and move on
Expand Down Expand Up @@ -876,8 +882,7 @@ static int lfs_dir_next(lfs_t *lfs, lfs_dir_t *dir, lfs_entry_t *entry) {
dir->pos += sizeof(dir->d) + 4;
}

int err = lfs_bd_read(lfs, dir->pair[0], dir->off,
&entry->d, sizeof(entry->d));
int err = lfs_dir_get(lfs, dir, dir->off, &entry->d, sizeof(entry->d));
lfs_entry_fromle32(&entry->d);
if (err) {
return err;
Expand Down Expand Up @@ -1167,7 +1172,7 @@ int lfs_dir_read(lfs_t *lfs, lfs_dir_t *dir, struct lfs_info *info) {
info->size = entry.d.elen;
}

int err = lfs_bd_read(lfs, dir->pair[0],
int err = lfs_dir_get(lfs, dir,
entry.off + entry.size - entry.d.nlen,
info->name, entry.d.nlen);
if (err) {
Expand Down Expand Up @@ -1502,7 +1507,7 @@ int lfs_file_open(lfs_t *lfs, lfs_file_t *file,
file->flags |= LFS_F_INLINE;
file->cache.block = file->head;
file->cache.off = 0;
err = lfs_bd_read(lfs, cwd.pair[0],
err = lfs_dir_get(lfs, &cwd,
entry.off + 4,
file->cache.buffer, file->size);
if (err) {
Expand Down Expand Up @@ -1679,8 +1684,8 @@ int lfs_file_sync(lfs_t *lfs, lfs_file_t *file) {

// TODO entry read function?
lfs_entry_t entry = {.off = file->poff};
err = lfs_bd_read(lfs, cwd.pair[0], entry.off,
&entry.d, sizeof(entry.d));
err = lfs_dir_get(lfs, &cwd,
entry.off, &entry.d, sizeof(entry.d));
lfs_entry_fromle32(&entry.d);
if (err) {
return err;
Expand Down Expand Up @@ -2047,7 +2052,7 @@ int lfs_stat(lfs_t *lfs, const char *path, struct lfs_info *info) {
if (lfs_paircmp(entry.d.u.dir, lfs->root) == 0) {
strcpy(info->name, "/");
} else {
err = lfs_bd_read(lfs, cwd.pair[0],
err = lfs_dir_get(lfs, &cwd,
entry.off + entry.size - entry.d.nlen,
info->name, entry.d.nlen);
if (err) {
Expand Down Expand Up @@ -2439,14 +2444,14 @@ int lfs_mount(lfs_t *lfs, const struct lfs_config *cfg) {
}

if (!err) {
err = lfs_bd_read(lfs, dir.pair[0], sizeof(dir.d)+4,
&superblock.d, sizeof(superblock.d));
err = lfs_dir_get(lfs, &dir,
sizeof(dir.d)+4, &superblock.d, sizeof(superblock.d));
lfs_superblock_fromle32(&superblock.d);
if (err) {
return err;
}

err = lfs_bd_read(lfs, dir.pair[0],
err = lfs_dir_get(lfs, &dir,
sizeof(dir.d) + 4 + sizeof(superblock.d),
magic, sizeof(magic));
if (err) {
Expand Down Expand Up @@ -2504,8 +2509,8 @@ int lfs_traverse(lfs_t *lfs, int (*cb)(void*, lfs_block_t), void *data) {
// iterate over contents
lfs_entry_t entry;
while (dir.off + sizeof(entry.d) <= (0x7fffffff & dir.d.size)-4) {
err = lfs_bd_read(lfs, dir.pair[0], dir.off,
&entry.d, sizeof(entry.d));
err = lfs_dir_get(lfs, &dir,
dir.off, &entry.d, sizeof(entry.d));
lfs_entry_fromle32(&entry.d);
if (err) {
return err;
Expand Down