mirror of
https://github.com/eledio-devices/thirdparty-littlefs.git
synced 2025-11-01 16:14:13 +01:00
Compare commits
7 Commits
file-open-
...
license-no
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
76333aeab1 | ||
|
|
84adead98b | ||
|
|
0422c55b81 | ||
|
|
11ad3a2414 | ||
|
|
16318d003f | ||
|
|
961fab70c3 | ||
|
|
041e90a1ca |
12
LICENSE.md
12
LICENSE.md
@@ -22,15 +22,3 @@ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
|||||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
*Note*:
|
|
||||||
Individual files contain the following tag instead of the full license text.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
This enables machine processing of license information based on the SPDX
|
|
||||||
License Identifiers that are here available: http://spdx.org/licenses/
|
|
||||||
|
|||||||
13
README.md
13
README.md
@@ -146,6 +146,19 @@ The tests assume a Linux environment and can be started with make:
|
|||||||
make test
|
make test
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
The littlefs is provided under the [BSD-3-Clause](https://spdx.org/licenses/BSD-3-Clause.html)
|
||||||
|
license. See [LICENSE.md](LICENSE.md) for more information. Contributions to
|
||||||
|
this project are accepted under the same license.
|
||||||
|
|
||||||
|
Individual files contain the following tag instead of the full license text.
|
||||||
|
|
||||||
|
SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
|
||||||
|
This enables machine processing of license information based on the SPDX
|
||||||
|
License Identifiers that are here available: http://spdx.org/licenses/
|
||||||
|
|
||||||
## Related projects
|
## Related projects
|
||||||
|
|
||||||
[Mbed OS](https://github.com/ARMmbed/mbed-os/tree/master/features/filesystem/littlefs) -
|
[Mbed OS](https://github.com/ARMmbed/mbed-os/tree/master/features/filesystem/littlefs) -
|
||||||
|
|||||||
89
lfs.c
89
lfs.c
@@ -417,11 +417,14 @@ static int lfs_dir_alloc(lfs_t *lfs, lfs_dir_t *dir) {
|
|||||||
// rather than clobbering one of the blocks we just pretend
|
// rather than clobbering one of the blocks we just pretend
|
||||||
// the revision may be valid
|
// the revision may be valid
|
||||||
int err = lfs_bd_read(lfs, dir->pair[0], 0, &dir->d.rev, 4);
|
int err = lfs_bd_read(lfs, dir->pair[0], 0, &dir->d.rev, 4);
|
||||||
dir->d.rev = lfs_fromle32(dir->d.rev);
|
if (err && err != LFS_ERR_CORRUPT) {
|
||||||
if (err) {
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (err != LFS_ERR_CORRUPT) {
|
||||||
|
dir->d.rev = lfs_fromle32(dir->d.rev);
|
||||||
|
}
|
||||||
|
|
||||||
// set defaults
|
// set defaults
|
||||||
dir->d.rev += 1;
|
dir->d.rev += 1;
|
||||||
dir->d.size = sizeof(dir->d)+4;
|
dir->d.size = sizeof(dir->d)+4;
|
||||||
@@ -445,6 +448,9 @@ static int lfs_dir_fetch(lfs_t *lfs,
|
|||||||
int err = lfs_bd_read(lfs, tpair[i], 0, &test, sizeof(test));
|
int err = lfs_bd_read(lfs, tpair[i], 0, &test, sizeof(test));
|
||||||
lfs_dir_fromle32(&test);
|
lfs_dir_fromle32(&test);
|
||||||
if (err) {
|
if (err) {
|
||||||
|
if (err == LFS_ERR_CORRUPT) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -464,6 +470,9 @@ static int lfs_dir_fetch(lfs_t *lfs,
|
|||||||
err = lfs_bd_crc(lfs, tpair[i], sizeof(test),
|
err = lfs_bd_crc(lfs, tpair[i], sizeof(test),
|
||||||
(0x7fffffff & test.size) - sizeof(test), &crc);
|
(0x7fffffff & test.size) - sizeof(test), &crc);
|
||||||
if (err) {
|
if (err) {
|
||||||
|
if (err == LFS_ERR_CORRUPT) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2007,6 +2016,21 @@ int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath) {
|
|||||||
|
|
||||||
|
|
||||||
/// Filesystem operations ///
|
/// Filesystem operations ///
|
||||||
|
static void lfs_deinit(lfs_t *lfs) {
|
||||||
|
// free allocated memory
|
||||||
|
if (!lfs->cfg->read_buffer) {
|
||||||
|
lfs_free(lfs->rcache.buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!lfs->cfg->prog_buffer) {
|
||||||
|
lfs_free(lfs->pcache.buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!lfs->cfg->lookahead_buffer) {
|
||||||
|
lfs_free(lfs->free.buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int lfs_init(lfs_t *lfs, const struct lfs_config *cfg) {
|
static int lfs_init(lfs_t *lfs, const struct lfs_config *cfg) {
|
||||||
lfs->cfg = cfg;
|
lfs->cfg = cfg;
|
||||||
|
|
||||||
@@ -2016,7 +2040,7 @@ static int lfs_init(lfs_t *lfs, const struct lfs_config *cfg) {
|
|||||||
} else {
|
} else {
|
||||||
lfs->rcache.buffer = lfs_malloc(lfs->cfg->read_size);
|
lfs->rcache.buffer = lfs_malloc(lfs->cfg->read_size);
|
||||||
if (!lfs->rcache.buffer) {
|
if (!lfs->rcache.buffer) {
|
||||||
return LFS_ERR_NOMEM;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2026,7 +2050,7 @@ static int lfs_init(lfs_t *lfs, const struct lfs_config *cfg) {
|
|||||||
} else {
|
} else {
|
||||||
lfs->pcache.buffer = lfs_malloc(lfs->cfg->prog_size);
|
lfs->pcache.buffer = lfs_malloc(lfs->cfg->prog_size);
|
||||||
if (!lfs->pcache.buffer) {
|
if (!lfs->pcache.buffer) {
|
||||||
return LFS_ERR_NOMEM;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2042,7 +2066,7 @@ static int lfs_init(lfs_t *lfs, const struct lfs_config *cfg) {
|
|||||||
} else {
|
} else {
|
||||||
lfs->free.buffer = lfs_malloc(lfs->cfg->lookahead/8);
|
lfs->free.buffer = lfs_malloc(lfs->cfg->lookahead/8);
|
||||||
if (!lfs->free.buffer) {
|
if (!lfs->free.buffer) {
|
||||||
return LFS_ERR_NOMEM;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2062,23 +2086,10 @@ static int lfs_init(lfs_t *lfs, const struct lfs_config *cfg) {
|
|||||||
lfs->deorphaned = false;
|
lfs->deorphaned = false;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
|
|
||||||
static int lfs_deinit(lfs_t *lfs) {
|
cleanup:
|
||||||
// free allocated memory
|
lfs_deinit(lfs);
|
||||||
if (!lfs->cfg->read_buffer) {
|
return LFS_ERR_NOMEM;
|
||||||
lfs_free(lfs->rcache.buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!lfs->cfg->prog_buffer) {
|
|
||||||
lfs_free(lfs->pcache.buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!lfs->cfg->lookahead_buffer) {
|
|
||||||
lfs_free(lfs->free.buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int lfs_format(lfs_t *lfs, const struct lfs_config *cfg) {
|
int lfs_format(lfs_t *lfs, const struct lfs_config *cfg) {
|
||||||
@@ -2098,19 +2109,19 @@ int lfs_format(lfs_t *lfs, const struct lfs_config *cfg) {
|
|||||||
lfs_dir_t superdir;
|
lfs_dir_t superdir;
|
||||||
err = lfs_dir_alloc(lfs, &superdir);
|
err = lfs_dir_alloc(lfs, &superdir);
|
||||||
if (err) {
|
if (err) {
|
||||||
return err;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
// write root directory
|
// write root directory
|
||||||
lfs_dir_t root;
|
lfs_dir_t root;
|
||||||
err = lfs_dir_alloc(lfs, &root);
|
err = lfs_dir_alloc(lfs, &root);
|
||||||
if (err) {
|
if (err) {
|
||||||
return err;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = lfs_dir_commit(lfs, &root, NULL, 0);
|
err = lfs_dir_commit(lfs, &root, NULL, 0);
|
||||||
if (err) {
|
if (err) {
|
||||||
return err;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
lfs->root[0] = root.pair[0];
|
lfs->root[0] = root.pair[0];
|
||||||
@@ -2141,24 +2152,28 @@ int lfs_format(lfs_t *lfs, const struct lfs_config *cfg) {
|
|||||||
&superblock.d, sizeof(superblock.d)}
|
&superblock.d, sizeof(superblock.d)}
|
||||||
}, 1);
|
}, 1);
|
||||||
if (err && err != LFS_ERR_CORRUPT) {
|
if (err && err != LFS_ERR_CORRUPT) {
|
||||||
return err;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
valid = valid || !err;
|
valid = valid || !err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!valid) {
|
if (!valid) {
|
||||||
return LFS_ERR_CORRUPT;
|
err = LFS_ERR_CORRUPT;
|
||||||
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
// sanity check that fetch works
|
// sanity check that fetch works
|
||||||
err = lfs_dir_fetch(lfs, &superdir, (const lfs_block_t[2]){0, 1});
|
err = lfs_dir_fetch(lfs, &superdir, (const lfs_block_t[2]){0, 1});
|
||||||
if (err) {
|
if (err) {
|
||||||
return err;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
lfs_alloc_ack(lfs);
|
lfs_alloc_ack(lfs);
|
||||||
return lfs_deinit(lfs);
|
|
||||||
|
cleanup:
|
||||||
|
lfs_deinit(lfs);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
int lfs_mount(lfs_t *lfs, const struct lfs_config *cfg) {
|
int lfs_mount(lfs_t *lfs, const struct lfs_config *cfg) {
|
||||||
@@ -2178,7 +2193,7 @@ int lfs_mount(lfs_t *lfs, const struct lfs_config *cfg) {
|
|||||||
lfs_superblock_t superblock;
|
lfs_superblock_t superblock;
|
||||||
err = lfs_dir_fetch(lfs, &dir, (const lfs_block_t[2]){0, 1});
|
err = lfs_dir_fetch(lfs, &dir, (const lfs_block_t[2]){0, 1});
|
||||||
if (err && err != LFS_ERR_CORRUPT) {
|
if (err && err != LFS_ERR_CORRUPT) {
|
||||||
return err;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!err) {
|
if (!err) {
|
||||||
@@ -2186,7 +2201,7 @@ int lfs_mount(lfs_t *lfs, const struct lfs_config *cfg) {
|
|||||||
&superblock.d, sizeof(superblock.d));
|
&superblock.d, sizeof(superblock.d));
|
||||||
lfs_superblock_fromle32(&superblock.d);
|
lfs_superblock_fromle32(&superblock.d);
|
||||||
if (err) {
|
if (err) {
|
||||||
return err;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
lfs->root[0] = superblock.d.root[0];
|
lfs->root[0] = superblock.d.root[0];
|
||||||
@@ -2195,7 +2210,8 @@ int lfs_mount(lfs_t *lfs, const struct lfs_config *cfg) {
|
|||||||
|
|
||||||
if (err || memcmp(superblock.d.magic, "littlefs", 8) != 0) {
|
if (err || memcmp(superblock.d.magic, "littlefs", 8) != 0) {
|
||||||
LFS_ERROR("Invalid superblock at %d %d", 0, 1);
|
LFS_ERROR("Invalid superblock at %d %d", 0, 1);
|
||||||
return LFS_ERR_CORRUPT;
|
err = LFS_ERR_CORRUPT;
|
||||||
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t major_version = (0xffff & (superblock.d.version >> 16));
|
uint16_t major_version = (0xffff & (superblock.d.version >> 16));
|
||||||
@@ -2203,14 +2219,21 @@ int lfs_mount(lfs_t *lfs, const struct lfs_config *cfg) {
|
|||||||
if ((major_version != LFS_DISK_VERSION_MAJOR ||
|
if ((major_version != LFS_DISK_VERSION_MAJOR ||
|
||||||
minor_version > LFS_DISK_VERSION_MINOR)) {
|
minor_version > LFS_DISK_VERSION_MINOR)) {
|
||||||
LFS_ERROR("Invalid version %d.%d", major_version, minor_version);
|
LFS_ERROR("Invalid version %d.%d", major_version, minor_version);
|
||||||
return LFS_ERR_INVAL;
|
err = LFS_ERR_INVAL;
|
||||||
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
|
||||||
|
lfs_deinit(lfs);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
int lfs_unmount(lfs_t *lfs) {
|
int lfs_unmount(lfs_t *lfs) {
|
||||||
return lfs_deinit(lfs);
|
lfs_deinit(lfs);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user