mirror of
				https://github.com/eledio-devices/thirdparty-littlefs.git
				synced 2025-10-31 16:14:16 +01:00 
			
		
		
		
	Merge pull request #495 from littlefs-project/devel
Minor release: v2.3
This commit is contained in:
		
							
								
								
									
										32
									
								
								.travis.yml
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								.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: | ||||||
|   | |||||||
| @@ -222,6 +222,11 @@ License Identifiers that are here available: http://spdx.org/licenses/ | |||||||
|   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/ | ||||||
|   | |||||||
| @@ -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); | ||||||
|         } |         } | ||||||
|   | |||||||
							
								
								
									
										40
									
								
								lfs.h
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								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 | ||||||
|   | |||||||
| @@ -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)) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user