浏览代码

Merge pull request #495 from littlefs-project/devel

Minor release: v2.3
Christopher Haster 5 年之前
父节点
当前提交
1a59954ec6
共有 6 个文件被更改,包括 278 次插入151 次删除
  1. 32 0
      .travis.yml
  2. 6 0
      README.md
  3. 2 2
      bd/lfs_testbd.c
  4. 200 145
      lfs.c
  5. 37 3
      lfs.h
  6. 1 1
      scripts/readtree.py

+ 32 - 0
.travis.yml

@@ -208,6 +208,38 @@ jobs:
     script:
     script:
       - make test TFLAGS+="-k --valgrind"
       - make test TFLAGS+="-k --valgrind"
 
 
+  # test compilation in read-only mode
+  - stage: test
+    env:
+      - NAME=littlefs-readonly
+      - CC="arm-linux-gnueabi-gcc --static -mthumb"
+      - CFLAGS="-Werror -DLFS_READONLY"
+    if: branch !~ -prefix$
+    install:
+      - *install-common
+      - sudo apt-get install
+            gcc-arm-linux-gnueabi
+            libc6-dev-armel-cross
+      - arm-linux-gnueabi-gcc --version
+    # report-size will compile littlefs and report the size
+    script: [*report-size]
+
+  # test compilation in thread-safe mode
+  - stage: test
+    env:
+      - NAME=littlefs-threadsafe
+      - CC="arm-linux-gnueabi-gcc --static -mthumb"
+      - CFLAGS="-Werror -DLFS_THREADSAFE"
+    if: branch !~ -prefix$
+    install:
+      - *install-common
+      - sudo apt-get install
+            gcc-arm-linux-gnueabi
+            libc6-dev-armel-cross
+      - arm-linux-gnueabi-gcc --version
+    # report-size will compile littlefs and report the size
+    script: [*report-size]
+
   # self-host with littlefs-fuse for fuzz test
   # self-host with littlefs-fuse for fuzz test
   - stage: test
   - stage: test
     env:
     env:

+ 6 - 0
README.md

@@ -221,6 +221,11 @@ License Identifiers that are here available: http://spdx.org/licenses/
 - [littlefs-js] - A javascript wrapper for littlefs. I'm not sure why you would
 - [littlefs-js] - A javascript wrapper for littlefs. I'm not sure why you would
   want this, but it is handy for demos.  You can see it in action
   want this, but it is handy for demos.  You can see it in action
   [here][littlefs-js-demo].
   [here][littlefs-js-demo].
+  
+- [littlefs-python] - A Python wrapper for littlefs. The project allows you
+  to create images of the filesystem on your PC. Check if littlefs will fit
+  your needs, create images for a later download to the target memory or
+  inspect the content of a binary image of the target memory.
 
 
 - [mklfs] - A command line tool built by the [Lua RTOS] guys for making
 - [mklfs] - A command line tool built by the [Lua RTOS] guys for making
   littlefs images from a host PC. Supports Windows, Mac OS, and Linux.
   littlefs images from a host PC. Supports Windows, Mac OS, and Linux.
@@ -250,3 +255,4 @@ License Identifiers that are here available: http://spdx.org/licenses/
 [LittleFileSystem]: https://os.mbed.com/docs/mbed-os/v5.12/apis/littlefilesystem.html
 [LittleFileSystem]: https://os.mbed.com/docs/mbed-os/v5.12/apis/littlefilesystem.html
 [SPIFFS]: https://github.com/pellepl/spiffs
 [SPIFFS]: https://github.com/pellepl/spiffs
 [Dhara]: https://github.com/dlbeer/dhara
 [Dhara]: https://github.com/dlbeer/dhara
+[littlefs-python]: https://pypi.org/project/littlefs-python/

+ 2 - 2
bd/lfs_testbd.c

@@ -207,7 +207,7 @@ int lfs_testbd_prog(const struct lfs_config *cfg, lfs_block_t block,
         bd->power_cycles -= 1;
         bd->power_cycles -= 1;
         if (bd->power_cycles == 0) {
         if (bd->power_cycles == 0) {
             // sync to make sure we persist the last changes
             // sync to make sure we persist the last changes
-            assert(lfs_testbd_rawsync(cfg) == 0);
+            LFS_ASSERT(lfs_testbd_rawsync(cfg) == 0);
             // simulate power loss
             // simulate power loss
             exit(33);
             exit(33);
         }
         }
@@ -254,7 +254,7 @@ int lfs_testbd_erase(const struct lfs_config *cfg, lfs_block_t block) {
         bd->power_cycles -= 1;
         bd->power_cycles -= 1;
         if (bd->power_cycles == 0) {
         if (bd->power_cycles == 0) {
             // sync to make sure we persist the last changes
             // sync to make sure we persist the last changes
-            assert(lfs_testbd_rawsync(cfg) == 0);
+            LFS_ASSERT(lfs_testbd_rawsync(cfg) == 0);
             // simulate power loss
             // simulate power loss
             exit(33);
             exit(33);
         }
         }

文件差异内容过多而无法显示
+ 200 - 145
lfs.c


+ 37 - 3
lfs.h

@@ -9,6 +9,7 @@
 
 
 #include <stdint.h>
 #include <stdint.h>
 #include <stdbool.h>
 #include <stdbool.h>
+#include "lfs_util.h"
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
 extern "C"
 extern "C"
@@ -21,7 +22,7 @@ extern "C"
 // Software library version
 // Software library version
 // Major (top-nibble), incremented on backwards incompatible changes
 // Major (top-nibble), incremented on backwards incompatible changes
 // Minor (bottom-nibble), incremented on feature additions
 // Minor (bottom-nibble), incremented on feature additions
-#define LFS_VERSION 0x00020002
+#define LFS_VERSION 0x00020003
 #define LFS_VERSION_MAJOR (0xffff & (LFS_VERSION >> 16))
 #define LFS_VERSION_MAJOR (0xffff & (LFS_VERSION >> 16))
 #define LFS_VERSION_MINOR (0xffff & (LFS_VERSION >>  0))
 #define LFS_VERSION_MINOR (0xffff & (LFS_VERSION >>  0))
 
 
@@ -123,20 +124,25 @@ enum lfs_type {
 enum lfs_open_flags {
 enum lfs_open_flags {
     // open flags
     // open flags
     LFS_O_RDONLY = 1,         // Open a file as read only
     LFS_O_RDONLY = 1,         // Open a file as read only
+#ifndef LFS_READONLY
     LFS_O_WRONLY = 2,         // Open a file as write only
     LFS_O_WRONLY = 2,         // Open a file as write only
     LFS_O_RDWR   = 3,         // Open a file as read and write
     LFS_O_RDWR   = 3,         // Open a file as read and write
     LFS_O_CREAT  = 0x0100,    // Create a file if it does not exist
     LFS_O_CREAT  = 0x0100,    // Create a file if it does not exist
     LFS_O_EXCL   = 0x0200,    // Fail if a file already exists
     LFS_O_EXCL   = 0x0200,    // Fail if a file already exists
     LFS_O_TRUNC  = 0x0400,    // Truncate the existing file to zero size
     LFS_O_TRUNC  = 0x0400,    // Truncate the existing file to zero size
     LFS_O_APPEND = 0x0800,    // Move to end of file on every write
     LFS_O_APPEND = 0x0800,    // Move to end of file on every write
+#endif
 
 
     // internally used flags
     // internally used flags
+#ifndef LFS_READONLY
     LFS_F_DIRTY   = 0x010000, // File does not match storage
     LFS_F_DIRTY   = 0x010000, // File does not match storage
     LFS_F_WRITING = 0x020000, // File has been written since last flush
     LFS_F_WRITING = 0x020000, // File has been written since last flush
+#endif
     LFS_F_READING = 0x040000, // File has been read since last flush
     LFS_F_READING = 0x040000, // File has been read since last flush
-    LFS_F_ERRED   = 0x080000, // An error occured during write
+#ifndef LFS_READONLY
+    LFS_F_ERRED   = 0x080000, // An error occurred during write
+#endif
     LFS_F_INLINE  = 0x100000, // Currently inlined in directory entry
     LFS_F_INLINE  = 0x100000, // Currently inlined in directory entry
-    LFS_F_OPENED  = 0x200000, // File has been opened
 };
 };
 
 
 // File seek flags
 // File seek flags
@@ -174,6 +180,16 @@ struct lfs_config {
     // are propogated to the user.
     // are propogated to the user.
     int (*sync)(const struct lfs_config *c);
     int (*sync)(const struct lfs_config *c);
 
 
+#ifdef LFS_THREADSAFE
+    // Lock the underlying block device. Negative error codes
+    // are propogated to the user.
+    int (*lock)(const struct lfs_config *c);
+
+    // Unlock the underlying block device. Negative error codes
+    // are propogated to the user.
+    int (*unlock)(const struct lfs_config *c);
+#endif
+
     // Minimum size of a block read. All read operations will be a
     // Minimum size of a block read. All read operations will be a
     // multiple of this value.
     // multiple of this value.
     lfs_size_t read_size;
     lfs_size_t read_size;
@@ -399,6 +415,7 @@ typedef struct lfs {
 
 
 /// Filesystem functions ///
 /// Filesystem functions ///
 
 
+#ifndef LFS_READONLY
 // Format a block device with the littlefs
 // Format a block device with the littlefs
 //
 //
 // Requires a littlefs object and config struct. This clobbers the littlefs
 // Requires a littlefs object and config struct. This clobbers the littlefs
@@ -407,6 +424,7 @@ typedef struct lfs {
 //
 //
 // Returns a negative error code on failure.
 // Returns a negative error code on failure.
 int lfs_format(lfs_t *lfs, const struct lfs_config *config);
 int lfs_format(lfs_t *lfs, const struct lfs_config *config);
+#endif
 
 
 // Mounts a littlefs
 // Mounts a littlefs
 //
 //
@@ -426,12 +444,15 @@ int lfs_unmount(lfs_t *lfs);
 
 
 /// General operations ///
 /// General operations ///
 
 
+#ifndef LFS_READONLY
 // Removes a file or directory
 // Removes a file or directory
 //
 //
 // If removing a directory, the directory must be empty.
 // If removing a directory, the directory must be empty.
 // Returns a negative error code on failure.
 // Returns a negative error code on failure.
 int lfs_remove(lfs_t *lfs, const char *path);
 int lfs_remove(lfs_t *lfs, const char *path);
+#endif
 
 
+#ifndef LFS_READONLY
 // Rename or move a file or directory
 // Rename or move a file or directory
 //
 //
 // If the destination exists, it must match the source in type.
 // If the destination exists, it must match the source in type.
@@ -439,6 +460,7 @@ int lfs_remove(lfs_t *lfs, const char *path);
 //
 //
 // Returns a negative error code on failure.
 // Returns a negative error code on failure.
 int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath);
 int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath);
+#endif
 
 
 // Find info about a file or directory
 // Find info about a file or directory
 //
 //
@@ -461,6 +483,7 @@ int lfs_stat(lfs_t *lfs, const char *path, struct lfs_info *info);
 lfs_ssize_t lfs_getattr(lfs_t *lfs, const char *path,
 lfs_ssize_t lfs_getattr(lfs_t *lfs, const char *path,
         uint8_t type, void *buffer, lfs_size_t size);
         uint8_t type, void *buffer, lfs_size_t size);
 
 
+#ifndef LFS_READONLY
 // Set custom attributes
 // Set custom attributes
 //
 //
 // Custom attributes are uniquely identified by an 8-bit type and limited
 // Custom attributes are uniquely identified by an 8-bit type and limited
@@ -470,13 +493,16 @@ lfs_ssize_t lfs_getattr(lfs_t *lfs, const char *path,
 // Returns a negative error code on failure.
 // Returns a negative error code on failure.
 int lfs_setattr(lfs_t *lfs, const char *path,
 int lfs_setattr(lfs_t *lfs, const char *path,
         uint8_t type, const void *buffer, lfs_size_t size);
         uint8_t type, const void *buffer, lfs_size_t size);
+#endif
 
 
+#ifndef LFS_READONLY
 // Removes a custom attribute
 // Removes a custom attribute
 //
 //
 // If an attribute is not found, nothing happens.
 // If an attribute is not found, nothing happens.
 //
 //
 // Returns a negative error code on failure.
 // Returns a negative error code on failure.
 int lfs_removeattr(lfs_t *lfs, const char *path, uint8_t type);
 int lfs_removeattr(lfs_t *lfs, const char *path, uint8_t type);
+#endif
 
 
 
 
 /// File operations ///
 /// File operations ///
@@ -525,6 +551,7 @@ int lfs_file_sync(lfs_t *lfs, lfs_file_t *file);
 lfs_ssize_t lfs_file_read(lfs_t *lfs, lfs_file_t *file,
 lfs_ssize_t lfs_file_read(lfs_t *lfs, lfs_file_t *file,
         void *buffer, lfs_size_t size);
         void *buffer, lfs_size_t size);
 
 
+#ifndef LFS_READONLY
 // Write data to file
 // Write data to file
 //
 //
 // Takes a buffer and size indicating the data to write. The file will not
 // Takes a buffer and size indicating the data to write. The file will not
@@ -533,6 +560,7 @@ lfs_ssize_t lfs_file_read(lfs_t *lfs, lfs_file_t *file,
 // Returns the number of bytes written, or a negative error code on failure.
 // Returns the number of bytes written, or a negative error code on failure.
 lfs_ssize_t lfs_file_write(lfs_t *lfs, lfs_file_t *file,
 lfs_ssize_t lfs_file_write(lfs_t *lfs, lfs_file_t *file,
         const void *buffer, lfs_size_t size);
         const void *buffer, lfs_size_t size);
+#endif
 
 
 // Change the position of the file
 // Change the position of the file
 //
 //
@@ -541,10 +569,12 @@ lfs_ssize_t lfs_file_write(lfs_t *lfs, lfs_file_t *file,
 lfs_soff_t lfs_file_seek(lfs_t *lfs, lfs_file_t *file,
 lfs_soff_t lfs_file_seek(lfs_t *lfs, lfs_file_t *file,
         lfs_soff_t off, int whence);
         lfs_soff_t off, int whence);
 
 
+#ifndef LFS_READONLY
 // Truncates the size of the file to the specified size
 // Truncates the size of the file to the specified size
 //
 //
 // Returns a negative error code on failure.
 // Returns a negative error code on failure.
 int lfs_file_truncate(lfs_t *lfs, lfs_file_t *file, lfs_off_t size);
 int lfs_file_truncate(lfs_t *lfs, lfs_file_t *file, lfs_off_t size);
+#endif
 
 
 // Return the position of the file
 // Return the position of the file
 //
 //
@@ -567,10 +597,12 @@ lfs_soff_t lfs_file_size(lfs_t *lfs, lfs_file_t *file);
 
 
 /// Directory operations ///
 /// Directory operations ///
 
 
+#ifndef LFS_READONLY
 // Create a directory
 // Create a directory
 //
 //
 // Returns a negative error code on failure.
 // Returns a negative error code on failure.
 int lfs_mkdir(lfs_t *lfs, const char *path);
 int lfs_mkdir(lfs_t *lfs, const char *path);
+#endif
 
 
 // Open a directory
 // Open a directory
 //
 //
@@ -632,6 +664,7 @@ lfs_ssize_t lfs_fs_size(lfs_t *lfs);
 // Returns a negative error code on failure.
 // Returns a negative error code on failure.
 int lfs_fs_traverse(lfs_t *lfs, int (*cb)(void*, lfs_block_t), void *data);
 int lfs_fs_traverse(lfs_t *lfs, int (*cb)(void*, lfs_block_t), void *data);
 
 
+#ifndef LFS_READONLY
 #ifdef LFS_MIGRATE
 #ifdef LFS_MIGRATE
 // Attempts to migrate a previous version of littlefs
 // Attempts to migrate a previous version of littlefs
 //
 //
@@ -646,6 +679,7 @@ int lfs_fs_traverse(lfs_t *lfs, int (*cb)(void*, lfs_block_t), void *data);
 // Returns a negative error code on failure.
 // Returns a negative error code on failure.
 int lfs_migrate(lfs_t *lfs, const struct lfs_config *cfg);
 int lfs_migrate(lfs_t *lfs, const struct lfs_config *cfg);
 #endif
 #endif
+#endif
 
 
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus

+ 1 - 1
scripts/readtree.py

@@ -106,7 +106,7 @@ def main(args):
             struct.unpack('<HH', superblock[1].data[0:4].ljust(4, b'\xff'))))
             struct.unpack('<HH', superblock[1].data[0:4].ljust(4, b'\xff'))))
     print("%-47s%s" % ("littlefs v%s.%s" % version,
     print("%-47s%s" % ("littlefs v%s.%s" % version,
         "data (truncated, if it fits)"
         "data (truncated, if it fits)"
-        if not any([args.no_truncate, args.tags, args.log, args.all]) else ""))
+        if not any([args.no_truncate, args.log, args.all]) else ""))
 
 
     # print gstate
     # print gstate
     print("gstate 0x%s" % ''.join('%02x' % c for c in gstate))
     print("gstate 0x%s" % ''.join('%02x' % c for c in gstate))

部分文件因为文件数量过多而无法显示