-
Notifications
You must be signed in to change notification settings - Fork 797
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Support attribute enumeration for files and directories #636
base: master
Are you sure you want to change the base?
Support attribute enumeration for files and directories #636
Conversation
0e41b8a
to
9a9f2f8
Compare
Note: These changes are part of the Sming LittleFS library, used by Sming. |
2b592b2
to
caa0b9d
Compare
look like some feature is also implemented in: #636 |
Hi, yes, sorry this PR did not go in this release, due to time I was only looking at PRs with smaller scopes this release. I'm slow to bring in new APIs since they need to be supported for quite a while for backwards compatibility reasons. This looks like a very interesting PR, thank @mikee47 for putting it together. In particular I will need to see how it interacts with #580 and #513 (though #513 may come in much later due to being an API breaking change) |
Extends regular `lfs_stat` by querying set of attribute at the same time. Improves performance of directory listings.
Supports attribute manipulation on open files. Important for updating things like security descriptors, timestamps, etc. Note: Attempting to remove registered attributes fails. This could be handled by marking registered attribute as dirty.
Allows file attributes to be efficiently enumerated, required for filesystem backup, etc.
Allows attributes to be accessed more efficiently, and enumerated
caa0b9d
to
a146db8
Compare
Tests passed ✓, Code: 18212 B (+6.7%), Stack: 1440 B (+0.0%), Structs: 832 B (+2.5%)
|
This PR updates the [Sming-LittleFS](https://github.com/mikee47/Sming-LittleFS) library, which implements IFS for the [littlefs](https://github.com/littlefs-project/littlefs) file system. The library still uses a fork of littlefs because it adds attribute enumeration support - see upstream [PR request](littlefs-project/littlefs#636). This has now been rebased on version 2.9.3 - see [releases](https://github.com/littlefs-project/littlefs/releases) for details of all the changes. Here's a (non-exhaustive) summary: - Improved RAM usage - Improved performance - v2.5.0 removed all recursion - v2.6.0 bump the on-disk minor version of littlefs from lfs2.0 -> lfs2.1. "This change is backwards-compatible, but after the first write with the new version, the image on disk will no longer be mountable by older versions of littlefs." - v2.7.0 Add `lfs_fs_stat` as an analog for the POSIX stavfs. This isn't currently used by Sming-LittleFS. - v2.9.0 `rename` now returns LFS_ERR_NOTDIR if the source is a regular file and the destination is a directory. This better aligns with POSIX. There are no functional changes to the library, but the samples have been simplified. An additional sample has been added to assess wear levelling behaviour (as a result of discussion #2771).
Hi @mikee47, sorry about the late response and lack of feedback. This is some really interesting work that deserves attention. Unfortunately there is also work going on in the background to make attrs behave more reasonably in littlefs's CoW model (as well as a bunch of unrelated file work). My current thinking is the best route forward will be to hold off on bringing these in until other changes land, though this may create challenges for maintaining this PR... Other requested new-API features are also in a holding pattern at the moment for similar reasons. That being said, some high-level thoughts:
These are a clever. These would also probably make integration layers quite a bit easier when populating time/permission/etc attrs. The only though was do you think these need a full int lfs_stat(lfs_t *lfs, const char *name, struct lfs_info *info);
int lfs_stata(lfs_t *lfs, const char *name, struct lfs_info *info,
struct lfs_attr *attrs, lfs_size_t attr_count); I'm not sure what other configuration would be useful here.
I realize these are appealing, but they are problematic with littlefs's CoW. In littlefs, writes are not committed to mdirs until
Maybe
This is a reasonable solution. It's at least better than Linux's Though some of the background work includes moving If applied the same transformation here, this might look like: int lfs_attrs_open(lfs_t *lfs, lfs_attrs_t *attrs, const char *path);
int lfs_attrs_read(lfs_t *lfs, lfs_attrs_t *attrs, struct lfs_attr *attr);
int lfs_attrs_close(lfs_t *lfs, lfs_attrs_t *attrs);
int lfs_attrs_rewind(lfs_t *lfs, lfs_attrs_t *attrs); Thoughts? This might lend itself towards other ways of opening the
We don't really want to do this, since it loses the type info that makes it impossible to "write" to a dir object at compile time. I'm curious if the hypothetical dir-relative openat APIs would solve most of the cases where path-based |
This PR provides some additional attribute enumeration features.
Add
lfs_statcfg
,lfs_dir_readcfg
functionsExtends regular
lfs_stat
by querying set of attribute at the same time.Improves performance when generating directory listings.
Add
lfs_file_getattr
,lfs_file_setattr
,lfs_file_removeattr
Supports attribute manipulation on open files.
Important for updating things like security descriptors, timestamps, etc.
Note: Includes checks for registered attributes.
Attempting to remove registered attributes fails.
This could be handled by marking registered attribute as dirty.
Add
lfs_file_enumattr()
functionAllows file attributes to be efficiently enumerated,
required for filesystem backup, etc.
Support opening handle to directory
Allows attributes to be accessed more efficiently, and enumerated