1 /* 2 * The little filesystem 3 * 4 * Copyright (c) 2022, The littlefs authors. 5 * Copyright (c) 2017, Arm Limited. All rights reserved. 6 * SPDX-License-Identifier: BSD-3-Clause 7 */ 8 #ifndef LFS_H 9 #define LFS_H 10 11 #include "lfs_util.h" 12 13 #ifdef __cplusplus 14 extern "C" 15 { 16 #endif 17 18 19 /// Version info /// 20 21 // Software library version 22 // Major (top-nibble), incremented on backwards incompatible changes 23 // Minor (bottom-nibble), incremented on feature additions 24 #define LFS_VERSION 0x00020008 25 #define LFS_VERSION_MAJOR (0xffff & (LFS_VERSION >> 16)) 26 #define LFS_VERSION_MINOR (0xffff & (LFS_VERSION >> 0)) 27 28 // Version of On-disk data structures 29 // Major (top-nibble), incremented on backwards incompatible changes 30 // Minor (bottom-nibble), incremented on feature additions 31 #define LFS_DISK_VERSION 0x00020001 32 #define LFS_DISK_VERSION_MAJOR (0xffff & (LFS_DISK_VERSION >> 16)) 33 #define LFS_DISK_VERSION_MINOR (0xffff & (LFS_DISK_VERSION >> 0)) 34 35 36 /// Definitions /// 37 38 // Type definitions 39 typedef uint32_t lfs_size_t; 40 typedef uint32_t lfs_off_t; 41 42 typedef int32_t lfs_ssize_t; 43 typedef int32_t lfs_soff_t; 44 45 typedef uint32_t lfs_block_t; 46 47 // Maximum name size in bytes, may be redefined to reduce the size of the 48 // info struct. Limited to <= 1022. Stored in superblock and must be 49 // respected by other littlefs drivers. 50 #ifndef LFS_NAME_MAX 51 #define LFS_NAME_MAX 255 52 #endif 53 54 // Maximum size of a file in bytes, may be redefined to limit to support other 55 // drivers. Limited on disk to <= 4294967296. However, above 2147483647 the 56 // functions lfs_file_seek, lfs_file_size, and lfs_file_tell will return 57 // incorrect values due to using signed integers. Stored in superblock and 58 // must be respected by other littlefs drivers. 59 #ifndef LFS_FILE_MAX 60 #define LFS_FILE_MAX 2147483647 61 #endif 62 63 // Maximum size of custom attributes in bytes, may be redefined, but there is 64 // no real benefit to using a smaller LFS_ATTR_MAX. Limited to <= 1022. 65 #ifndef LFS_ATTR_MAX 66 #define LFS_ATTR_MAX 1022 67 #endif 68 69 // Possible error codes, these are negative to allow 70 // valid positive return values 71 enum lfs_error { 72 LFS_ERR_OK = 0, // No error 73 LFS_ERR_IO = -5, // Error during device operation 74 LFS_ERR_CORRUPT = -84, // Corrupted 75 LFS_ERR_NOENT = -2, // No directory entry 76 LFS_ERR_EXIST = -17, // Entry already exists 77 LFS_ERR_NOTDIR = -20, // Entry is not a dir 78 LFS_ERR_ISDIR = -21, // Entry is a dir 79 LFS_ERR_NOTEMPTY = -39, // Dir is not empty 80 LFS_ERR_BADF = -9, // Bad file number 81 LFS_ERR_FBIG = -27, // File too large 82 LFS_ERR_INVAL = -22, // Invalid parameter 83 LFS_ERR_NOSPC = -28, // No space left on device 84 LFS_ERR_NOMEM = -12, // No more memory available 85 LFS_ERR_NOATTR = -61, // No data/attr available 86 LFS_ERR_NAMETOOLONG = -36, // File name too long 87 }; 88 89 // File types 90 enum lfs_type { 91 // file types 92 LFS_TYPE_REG = 0x001, 93 LFS_TYPE_DIR = 0x002, 94 95 // internally used types 96 LFS_TYPE_SPLICE = 0x400, 97 LFS_TYPE_NAME = 0x000, 98 LFS_TYPE_STRUCT = 0x200, 99 LFS_TYPE_USERATTR = 0x300, 100 LFS_TYPE_FROM = 0x100, 101 LFS_TYPE_TAIL = 0x600, 102 LFS_TYPE_GLOBALS = 0x700, 103 LFS_TYPE_CRC = 0x500, 104 105 // internally used type specializations 106 LFS_TYPE_CREATE = 0x401, 107 LFS_TYPE_DELETE = 0x4ff, 108 LFS_TYPE_SUPERBLOCK = 0x0ff, 109 LFS_TYPE_DIRSTRUCT = 0x200, 110 LFS_TYPE_CTZSTRUCT = 0x202, 111 LFS_TYPE_INLINESTRUCT = 0x201, 112 LFS_TYPE_SOFTTAIL = 0x600, 113 LFS_TYPE_HARDTAIL = 0x601, 114 LFS_TYPE_MOVESTATE = 0x7ff, 115 LFS_TYPE_CCRC = 0x500, 116 LFS_TYPE_FCRC = 0x5ff, 117 118 // internal chip sources 119 LFS_FROM_NOOP = 0x000, 120 LFS_FROM_MOVE = 0x101, 121 LFS_FROM_USERATTRS = 0x102, 122 }; 123 124 // File open flags 125 enum lfs_open_flags { 126 // open flags 127 LFS_O_RDONLY = 1, // Open a file as read only 128 #ifndef LFS_READONLY 129 LFS_O_WRONLY = 2, // Open a file as write only 130 LFS_O_RDWR = 3, // Open a file as read and write 131 LFS_O_CREAT = 0x0100, // Create a file if it does not exist 132 LFS_O_EXCL = 0x0200, // Fail if a file already exists 133 LFS_O_TRUNC = 0x0400, // Truncate the existing file to zero size 134 LFS_O_APPEND = 0x0800, // Move to end of file on every write 135 #endif 136 137 // internally used flags 138 #ifndef LFS_READONLY 139 LFS_F_DIRTY = 0x010000, // File does not match storage 140 LFS_F_WRITING = 0x020000, // File has been written since last flush 141 #endif 142 LFS_F_READING = 0x040000, // File has been read since last flush 143 #ifndef LFS_READONLY 144 LFS_F_ERRED = 0x080000, // An error occurred during write 145 #endif 146 LFS_F_INLINE = 0x100000, // Currently inlined in directory entry 147 }; 148 149 // File seek flags 150 enum lfs_whence_flags { 151 LFS_SEEK_SET = 0, // Seek relative to an absolute position 152 LFS_SEEK_CUR = 1, // Seek relative to the current file position 153 LFS_SEEK_END = 2, // Seek relative to the end of the file 154 }; 155 156 157 // Configuration provided during initialization of the littlefs 158 struct lfs_config { 159 // Opaque user provided context that can be used to pass 160 // information to the block device operations 161 void *context; 162 163 // Read a region in a block. Negative error codes are propagated 164 // to the user. 165 int (*read)(const struct lfs_config *c, lfs_block_t block, 166 lfs_off_t off, void *buffer, lfs_size_t size); 167 168 // Program a region in a block. The block must have previously 169 // been erased. Negative error codes are propagated to the user. 170 // May return LFS_ERR_CORRUPT if the block should be considered bad. 171 int (*prog)(const struct lfs_config *c, lfs_block_t block, 172 lfs_off_t off, const void *buffer, lfs_size_t size); 173 174 // Erase a block. A block must be erased before being programmed. 175 // The state of an erased block is undefined. Negative error codes 176 // are propagated to the user. 177 // May return LFS_ERR_CORRUPT if the block should be considered bad. 178 int (*erase)(const struct lfs_config *c, lfs_block_t block); 179 180 // Sync the state of the underlying block device. Negative error codes 181 // are propagated to the user. 182 int (*sync)(const struct lfs_config *c); 183 184 #ifdef LFS_THREADSAFE 185 // Lock the underlying block device. Negative error codes 186 // are propagated to the user. 187 int (*lock)(const struct lfs_config *c); 188 189 // Unlock the underlying block device. Negative error codes 190 // are propagated to the user. 191 int (*unlock)(const struct lfs_config *c); 192 #endif 193 194 // Minimum size of a block read in bytes. All read operations will be a 195 // multiple of this value. 196 lfs_size_t read_size; 197 198 // Minimum size of a block program in bytes. All program operations will be 199 // a multiple of this value. 200 lfs_size_t prog_size; 201 202 // Size of an erasable block in bytes. This does not impact ram consumption 203 // and may be larger than the physical erase size. However, non-inlined 204 // files take up at minimum one block. Must be a multiple of the read and 205 // program sizes. 206 lfs_size_t block_size; 207 208 // Number of erasable blocks on the device. 209 lfs_size_t block_count; 210 211 // Number of erase cycles before littlefs evicts metadata logs and moves 212 // the metadata to another block. Suggested values are in the 213 // range 100-1000, with large values having better performance at the cost 214 // of less consistent wear distribution. 215 // 216 // Set to -1 to disable block-level wear-leveling. 217 int32_t block_cycles; 218 219 // Size of block caches in bytes. Each cache buffers a portion of a block in 220 // RAM. The littlefs needs a read cache, a program cache, and one additional 221 // cache per file. Larger caches can improve performance by storing more 222 // data and reducing the number of disk accesses. Must be a multiple of the 223 // read and program sizes, and a factor of the block size. 224 lfs_size_t cache_size; 225 226 // Size of the lookahead buffer in bytes. A larger lookahead buffer 227 // increases the number of blocks found during an allocation pass. The 228 // lookahead buffer is stored as a compact bitmap, so each byte of RAM 229 // can track 8 blocks. Must be a multiple of 8. 230 lfs_size_t lookahead_size; 231 232 // Optional statically allocated read buffer. Must be cache_size. 233 // By default lfs_malloc is used to allocate this buffer. 234 void *read_buffer; 235 236 // Optional statically allocated program buffer. Must be cache_size. 237 // By default lfs_malloc is used to allocate this buffer. 238 void *prog_buffer; 239 240 // Optional statically allocated lookahead buffer. Must be lookahead_size 241 // and aligned to a 32-bit boundary. By default lfs_malloc is used to 242 // allocate this buffer. 243 void *lookahead_buffer; 244 245 // Optional upper limit on length of file names in bytes. No downside for 246 // larger names except the size of the info struct which is controlled by 247 // the LFS_NAME_MAX define. Defaults to LFS_NAME_MAX when zero. Stored in 248 // superblock and must be respected by other littlefs drivers. 249 lfs_size_t name_max; 250 251 // Optional upper limit on files in bytes. No downside for larger files 252 // but must be <= LFS_FILE_MAX. Defaults to LFS_FILE_MAX when zero. Stored 253 // in superblock and must be respected by other littlefs drivers. 254 lfs_size_t file_max; 255 256 // Optional upper limit on custom attributes in bytes. No downside for 257 // larger attributes size but must be <= LFS_ATTR_MAX. Defaults to 258 // LFS_ATTR_MAX when zero. 259 lfs_size_t attr_max; 260 261 // Optional upper limit on total space given to metadata pairs in bytes. On 262 // devices with large blocks (e.g. 128kB) setting this to a low size (2-8kB) 263 // can help bound the metadata compaction time. Must be <= block_size. 264 // Defaults to block_size when zero. 265 lfs_size_t metadata_max; 266 267 #ifdef LFS_MULTIVERSION 268 // On-disk version to use when writing in the form of 16-bit major version 269 // + 16-bit minor version. This limiting metadata to what is supported by 270 // older minor versions. Note that some features will be lost. Defaults to 271 // to the most recent minor version when zero. 272 uint32_t disk_version; 273 #endif 274 }; 275 276 // File info structure 277 struct lfs_info { 278 // Type of the file, either LFS_TYPE_REG or LFS_TYPE_DIR 279 uint8_t type; 280 281 // Size of the file, only valid for REG files. Limited to 32-bits. 282 lfs_size_t size; 283 284 // Name of the file stored as a null-terminated string. Limited to 285 // LFS_NAME_MAX+1, which can be changed by redefining LFS_NAME_MAX to 286 // reduce RAM. LFS_NAME_MAX is stored in superblock and must be 287 // respected by other littlefs drivers. 288 char name[LFS_NAME_MAX+1]; 289 }; 290 291 // Filesystem info structure 292 struct lfs_fsinfo { 293 // On-disk version. 294 uint32_t disk_version; 295 296 // Size of a logical block in bytes. 297 lfs_size_t block_size; 298 299 // Number of logical blocks in filesystem. 300 lfs_size_t block_count; 301 302 // Upper limit on the length of file names in bytes. 303 lfs_size_t name_max; 304 305 // Upper limit on the size of files in bytes. 306 lfs_size_t file_max; 307 308 // Upper limit on the size of custom attributes in bytes. 309 lfs_size_t attr_max; 310 }; 311 312 // Custom attribute structure, used to describe custom attributes 313 // committed atomically during file writes. 314 struct lfs_attr { 315 // 8-bit type of attribute, provided by user and used to 316 // identify the attribute 317 uint8_t type; 318 319 // Pointer to buffer containing the attribute 320 void *buffer; 321 322 // Size of attribute in bytes, limited to LFS_ATTR_MAX 323 lfs_size_t size; 324 }; 325 326 // Optional configuration provided during lfs_file_opencfg 327 struct lfs_file_config { 328 // Optional statically allocated file buffer. Must be cache_size. 329 // By default lfs_malloc is used to allocate this buffer. 330 void *buffer; 331 332 // Optional list of custom attributes related to the file. If the file 333 // is opened with read access, these attributes will be read from disk 334 // during the open call. If the file is opened with write access, the 335 // attributes will be written to disk every file sync or close. This 336 // write occurs atomically with update to the file's contents. 337 // 338 // Custom attributes are uniquely identified by an 8-bit type and limited 339 // to LFS_ATTR_MAX bytes. When read, if the stored attribute is smaller 340 // than the buffer, it will be padded with zeros. If the stored attribute 341 // is larger, then it will be silently truncated. If the attribute is not 342 // found, it will be created implicitly. 343 struct lfs_attr *attrs; 344 345 // Number of custom attributes in the list 346 lfs_size_t attr_count; 347 }; 348 349 350 /// internal littlefs data structures /// 351 typedef struct lfs_cache { 352 lfs_block_t block; 353 lfs_off_t off; 354 lfs_size_t size; 355 uint8_t *buffer; 356 } lfs_cache_t; 357 358 typedef struct lfs_mdir { 359 lfs_block_t pair[2]; 360 uint32_t rev; 361 lfs_off_t off; 362 uint32_t etag; 363 uint16_t count; 364 bool erased; 365 bool split; 366 lfs_block_t tail[2]; 367 } lfs_mdir_t; 368 369 // littlefs directory type 370 typedef struct lfs_dir { 371 struct lfs_dir *next; 372 uint16_t id; 373 uint8_t type; 374 lfs_mdir_t m; 375 376 lfs_off_t pos; 377 lfs_block_t head[2]; 378 } lfs_dir_t; 379 380 // littlefs file type 381 typedef struct lfs_file { 382 struct lfs_file *next; 383 uint16_t id; 384 uint8_t type; 385 lfs_mdir_t m; 386 387 struct lfs_ctz { 388 lfs_block_t head; 389 lfs_size_t size; 390 } ctz; 391 392 uint32_t flags; 393 lfs_off_t pos; 394 lfs_block_t block; 395 lfs_off_t off; 396 lfs_cache_t cache; 397 398 const struct lfs_file_config *cfg; 399 } lfs_file_t; 400 401 typedef struct lfs_superblock { 402 uint32_t version; 403 lfs_size_t block_size; 404 lfs_size_t block_count; 405 lfs_size_t name_max; 406 lfs_size_t file_max; 407 lfs_size_t attr_max; 408 } lfs_superblock_t; 409 410 typedef struct lfs_gstate { 411 uint32_t tag; 412 lfs_block_t pair[2]; 413 } lfs_gstate_t; 414 415 // The littlefs filesystem type 416 typedef struct lfs { 417 lfs_cache_t rcache; 418 lfs_cache_t pcache; 419 420 lfs_block_t root[2]; 421 struct lfs_mlist { 422 struct lfs_mlist *next; 423 uint16_t id; 424 uint8_t type; 425 lfs_mdir_t m; 426 } *mlist; 427 uint32_t seed; 428 429 lfs_gstate_t gstate; 430 lfs_gstate_t gdisk; 431 lfs_gstate_t gdelta; 432 433 struct lfs_free { 434 lfs_block_t off; 435 lfs_block_t size; 436 lfs_block_t i; 437 lfs_block_t ack; 438 uint32_t *buffer; 439 } free; 440 441 const struct lfs_config *cfg; 442 lfs_size_t block_count; 443 lfs_size_t name_max; 444 lfs_size_t file_max; 445 lfs_size_t attr_max; 446 447 #ifdef LFS_MIGRATE 448 struct lfs1 *lfs1; 449 #endif 450 } lfs_t; 451 452 453 /// Filesystem functions /// 454 455 #ifndef LFS_READONLY 456 // Format a block device with the littlefs 457 // 458 // Requires a littlefs object and config struct. This clobbers the littlefs 459 // object, and does not leave the filesystem mounted. The config struct must 460 // be zeroed for defaults and backwards compatibility. 461 // 462 // Returns a negative error code on failure. 463 int lfs_format(lfs_t *lfs, const struct lfs_config *config); 464 #endif 465 466 // Mounts a littlefs 467 // 468 // Requires a littlefs object and config struct. Multiple filesystems 469 // may be mounted simultaneously with multiple littlefs objects. Both 470 // lfs and config must be allocated while mounted. The config struct must 471 // be zeroed for defaults and backwards compatibility. 472 // 473 // Returns a negative error code on failure. 474 int lfs_mount(lfs_t *lfs, const struct lfs_config *config); 475 476 // Unmounts a littlefs 477 // 478 // Does nothing besides releasing any allocated resources. 479 // Returns a negative error code on failure. 480 int lfs_unmount(lfs_t *lfs); 481 482 /// General operations /// 483 484 #ifndef LFS_READONLY 485 // Removes a file or directory 486 // 487 // If removing a directory, the directory must be empty. 488 // Returns a negative error code on failure. 489 int lfs_remove(lfs_t *lfs, const char *path); 490 #endif 491 492 #ifndef LFS_READONLY 493 // Rename or move a file or directory 494 // 495 // If the destination exists, it must match the source in type. 496 // If the destination is a directory, the directory must be empty. 497 // 498 // Returns a negative error code on failure. 499 int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath); 500 #endif 501 502 // Find info about a file or directory 503 // 504 // Fills out the info structure, based on the specified file or directory. 505 // Returns a negative error code on failure. 506 int lfs_stat(lfs_t *lfs, const char *path, struct lfs_info *info); 507 508 // Get a custom attribute 509 // 510 // Custom attributes are uniquely identified by an 8-bit type and limited 511 // to LFS_ATTR_MAX bytes. When read, if the stored attribute is smaller than 512 // the buffer, it will be padded with zeros. If the stored attribute is larger, 513 // then it will be silently truncated. If no attribute is found, the error 514 // LFS_ERR_NOATTR is returned and the buffer is filled with zeros. 515 // 516 // Returns the size of the attribute, or a negative error code on failure. 517 // Note, the returned size is the size of the attribute on disk, irrespective 518 // of the size of the buffer. This can be used to dynamically allocate a buffer 519 // or check for existence. 520 lfs_ssize_t lfs_getattr(lfs_t *lfs, const char *path, 521 uint8_t type, void *buffer, lfs_size_t size); 522 523 #ifndef LFS_READONLY 524 // Set custom attributes 525 // 526 // Custom attributes are uniquely identified by an 8-bit type and limited 527 // to LFS_ATTR_MAX bytes. If an attribute is not found, it will be 528 // implicitly created. 529 // 530 // Returns a negative error code on failure. 531 int lfs_setattr(lfs_t *lfs, const char *path, 532 uint8_t type, const void *buffer, lfs_size_t size); 533 #endif 534 535 #ifndef LFS_READONLY 536 // Removes a custom attribute 537 // 538 // If an attribute is not found, nothing happens. 539 // 540 // Returns a negative error code on failure. 541 int lfs_removeattr(lfs_t *lfs, const char *path, uint8_t type); 542 #endif 543 544 545 /// File operations /// 546 547 #ifndef LFS_NO_MALLOC 548 // Open a file 549 // 550 // The mode that the file is opened in is determined by the flags, which 551 // are values from the enum lfs_open_flags that are bitwise-ored together. 552 // 553 // Returns a negative error code on failure. 554 int lfs_file_open(lfs_t *lfs, lfs_file_t *file, 555 const char *path, int flags); 556 557 // if LFS_NO_MALLOC is defined, lfs_file_open() will fail with LFS_ERR_NOMEM 558 // thus use lfs_file_opencfg() with config.buffer set. 559 #endif 560 561 // Open a file with extra configuration 562 // 563 // The mode that the file is opened in is determined by the flags, which 564 // are values from the enum lfs_open_flags that are bitwise-ored together. 565 // 566 // The config struct provides additional config options per file as described 567 // above. The config struct must remain allocated while the file is open, and 568 // the config struct must be zeroed for defaults and backwards compatibility. 569 // 570 // Returns a negative error code on failure. 571 int lfs_file_opencfg(lfs_t *lfs, lfs_file_t *file, 572 const char *path, int flags, 573 const struct lfs_file_config *config); 574 575 // Close a file 576 // 577 // Any pending writes are written out to storage as though 578 // sync had been called and releases any allocated resources. 579 // 580 // Returns a negative error code on failure. 581 int lfs_file_close(lfs_t *lfs, lfs_file_t *file); 582 583 // Synchronize a file on storage 584 // 585 // Any pending writes are written out to storage. 586 // Returns a negative error code on failure. 587 int lfs_file_sync(lfs_t *lfs, lfs_file_t *file); 588 589 // Read data from file 590 // 591 // Takes a buffer and size indicating where to store the read data. 592 // Returns the number of bytes read, or a negative error code on failure. 593 lfs_ssize_t lfs_file_read(lfs_t *lfs, lfs_file_t *file, 594 void *buffer, lfs_size_t size); 595 596 #ifndef LFS_READONLY 597 // Write data to file 598 // 599 // Takes a buffer and size indicating the data to write. The file will not 600 // actually be updated on the storage until either sync or close is called. 601 // 602 // Returns the number of bytes written, or a negative error code on failure. 603 lfs_ssize_t lfs_file_write(lfs_t *lfs, lfs_file_t *file, 604 const void *buffer, lfs_size_t size); 605 #endif 606 607 // Change the position of the file 608 // 609 // The change in position is determined by the offset and whence flag. 610 // Returns the new position of the file, or a negative error code on failure. 611 lfs_soff_t lfs_file_seek(lfs_t *lfs, lfs_file_t *file, 612 lfs_soff_t off, int whence); 613 614 #ifndef LFS_READONLY 615 // Truncates the size of the file to the specified size 616 // 617 // Returns a negative error code on failure. 618 int lfs_file_truncate(lfs_t *lfs, lfs_file_t *file, lfs_off_t size); 619 #endif 620 621 // Return the position of the file 622 // 623 // Equivalent to lfs_file_seek(lfs, file, 0, LFS_SEEK_CUR) 624 // Returns the position of the file, or a negative error code on failure. 625 lfs_soff_t lfs_file_tell(lfs_t *lfs, lfs_file_t *file); 626 627 // Change the position of the file to the beginning of the file 628 // 629 // Equivalent to lfs_file_seek(lfs, file, 0, LFS_SEEK_SET) 630 // Returns a negative error code on failure. 631 int lfs_file_rewind(lfs_t *lfs, lfs_file_t *file); 632 633 // Return the size of the file 634 // 635 // Similar to lfs_file_seek(lfs, file, 0, LFS_SEEK_END) 636 // Returns the size of the file, or a negative error code on failure. 637 lfs_soff_t lfs_file_size(lfs_t *lfs, lfs_file_t *file); 638 639 640 /// Directory operations /// 641 642 #ifndef LFS_READONLY 643 // Create a directory 644 // 645 // Returns a negative error code on failure. 646 int lfs_mkdir(lfs_t *lfs, const char *path); 647 #endif 648 649 // Open a directory 650 // 651 // Once open a directory can be used with read to iterate over files. 652 // Returns a negative error code on failure. 653 int lfs_dir_open(lfs_t *lfs, lfs_dir_t *dir, const char *path); 654 655 // Close a directory 656 // 657 // Releases any allocated resources. 658 // Returns a negative error code on failure. 659 int lfs_dir_close(lfs_t *lfs, lfs_dir_t *dir); 660 661 // Read an entry in the directory 662 // 663 // Fills out the info structure, based on the specified file or directory. 664 // Returns a positive value on success, 0 at the end of directory, 665 // or a negative error code on failure. 666 int lfs_dir_read(lfs_t *lfs, lfs_dir_t *dir, struct lfs_info *info); 667 668 // Change the position of the directory 669 // 670 // The new off must be a value previous returned from tell and specifies 671 // an absolute offset in the directory seek. 672 // 673 // Returns a negative error code on failure. 674 int lfs_dir_seek(lfs_t *lfs, lfs_dir_t *dir, lfs_off_t off); 675 676 // Return the position of the directory 677 // 678 // The returned offset is only meant to be consumed by seek and may not make 679 // sense, but does indicate the current position in the directory iteration. 680 // 681 // Returns the position of the directory, or a negative error code on failure. 682 lfs_soff_t lfs_dir_tell(lfs_t *lfs, lfs_dir_t *dir); 683 684 // Change the position of the directory to the beginning of the directory 685 // 686 // Returns a negative error code on failure. 687 int lfs_dir_rewind(lfs_t *lfs, lfs_dir_t *dir); 688 689 690 /// Filesystem-level filesystem operations 691 692 // Find on-disk info about the filesystem 693 // 694 // Fills out the fsinfo structure based on the filesystem found on-disk. 695 // Returns a negative error code on failure. 696 int lfs_fs_stat(lfs_t *lfs, struct lfs_fsinfo *fsinfo); 697 698 // Finds the current size of the filesystem 699 // 700 // Note: Result is best effort. If files share COW structures, the returned 701 // size may be larger than the filesystem actually is. 702 // 703 // Returns the number of allocated blocks, or a negative error code on failure. 704 lfs_ssize_t lfs_fs_size(lfs_t *lfs); 705 706 // Traverse through all blocks in use by the filesystem 707 // 708 // The provided callback will be called with each block address that is 709 // currently in use by the filesystem. This can be used to determine which 710 // blocks are in use or how much of the storage is available. 711 // 712 // Returns a negative error code on failure. 713 int lfs_fs_traverse(lfs_t *lfs, int (*cb)(void*, lfs_block_t), void *data); 714 715 // Attempt to proactively find free blocks 716 // 717 // Calling this function is not required, but may allowing the offloading of 718 // the expensive block allocation scan to a less time-critical code path. 719 // 720 // Note: littlefs currently does not persist any found free blocks to disk. 721 // This may change in the future. 722 // 723 // Returns a negative error code on failure. Finding no free blocks is 724 // not an error. 725 int lfs_fs_gc(lfs_t *lfs); 726 727 #ifndef LFS_READONLY 728 // Attempt to make the filesystem consistent and ready for writing 729 // 730 // Calling this function is not required, consistency will be implicitly 731 // enforced on the first operation that writes to the filesystem, but this 732 // function allows the work to be performed earlier and without other 733 // filesystem changes. 734 // 735 // Returns a negative error code on failure. 736 int lfs_fs_mkconsistent(lfs_t *lfs); 737 #endif 738 739 #ifndef LFS_READONLY 740 // Grows the filesystem to a new size, updating the superblock with the new 741 // block count. 742 // 743 // Note: This is irreversible. 744 // 745 // Returns a negative error code on failure. 746 int lfs_fs_grow(lfs_t *lfs, lfs_size_t block_count); 747 #endif 748 749 #ifndef LFS_READONLY 750 #ifdef LFS_MIGRATE 751 // Attempts to migrate a previous version of littlefs 752 // 753 // Behaves similarly to the lfs_format function. Attempts to mount 754 // the previous version of littlefs and update the filesystem so it can be 755 // mounted with the current version of littlefs. 756 // 757 // Requires a littlefs object and config struct. This clobbers the littlefs 758 // object, and does not leave the filesystem mounted. The config struct must 759 // be zeroed for defaults and backwards compatibility. 760 // 761 // Returns a negative error code on failure. 762 int lfs_migrate(lfs_t *lfs, const struct lfs_config *cfg); 763 #endif 764 #endif 765 766 767 #ifdef __cplusplus 768 } /* extern "C" */ 769 #endif 770 771 #endif 772