Prechádzať zdrojové kódy

Update lfs_find_free_blocks to match the latest changes.

ondrap 2 rokov pred
rodič
commit
b637379210
2 zmenil súbory, kde vykonal 21 pridanie a 10 odobranie
  1. 17 10
      lfs.c
  2. 4 0
      lfs.h

+ 17 - 10
lfs.c

@@ -654,20 +654,27 @@ static int lfs_alloc(lfs_t *lfs, lfs_block_t *block) {
             return LFS_ERR_NOSPC;
         }
 
-        lfs->free.off = (lfs->free.off + lfs->free.size)
-                % lfs->block_count;
-        lfs->free.size = lfs_min(8*lfs->cfg->lookahead_size, lfs->free.ack);
-        lfs->free.i = 0;
-
-        // find mask of free blocks from tree
-        memset(lfs->free.buffer, 0, lfs->cfg->lookahead_size);
-        int err = lfs_fs_rawtraverse(lfs, lfs_alloc_lookahead, lfs, true);
-        if (err) {
-            lfs_alloc_drop(lfs);
+        int err = lfs_find_free_blocks(lfs);
+        if(err) {
             return err;
         }
     }
 }
+
+int lfs_find_free_blocks(lfs_t *lfs){
+    lfs->free.off = (lfs->free.off + lfs->free.size)
+        % lfs->block_count;
+    lfs->free.size = lfs_min(8*lfs->cfg->lookahead_size, lfs->free.ack);
+    lfs->free.i = 0;
+
+    // find mask of free blocks from tree
+    memset(lfs->free.buffer, 0, lfs->cfg->lookahead_size);
+    int const err = lfs_fs_rawtraverse(lfs, lfs_alloc_lookahead, lfs, true);
+    if (err) {
+        lfs_alloc_drop(lfs);
+    }
+    return err;
+}
 #endif
 
 /// Metadata pair and directory operations ///

+ 4 - 0
lfs.h

@@ -712,6 +712,10 @@ lfs_ssize_t lfs_fs_size(lfs_t *lfs);
 // Returns a negative error code on failure.
 int lfs_fs_traverse(lfs_t *lfs, int (*cb)(void*, lfs_block_t), void *data);
 
+// Use Traverse function and try to find free blocks. LittleFS free blocks search is unpredictable.
+// Search is costly operation which may delay write. In realtime write scenarios can be better to find them before a write.
+int lfs_find_free_blocks(lfs_t *lfs);
+
 #ifndef LFS_READONLY
 // Attempt to make the filesystem consistent and ready for writing
 //