Insert invalid blocks at free blocks beginning.
authorbatt <batt@38d2e660-2303-0410-9eaa-f027e97ec537>
Thu, 7 Feb 2008 21:27:28 +0000 (21:27 +0000)
committerbatt <batt@38d2e660-2303-0410-9eaa-f027e97ec537>
Thu, 7 Feb 2008 21:27:28 +0000 (21:27 +0000)
git-svn-id: https://src.develer.com/svnoss/bertos/trunk@1096 38d2e660-2303-0410-9eaa-f027e97ec537

fs/battfs.c

index 422ce9e69c5bd79ed42717cf66331b1f8ef77460..9923cc273cdd2d559d00c1bfc0ff9675598b7f48 100644 (file)
@@ -199,14 +199,14 @@ static void movePages(struct BattFsSuper *disk, pgcnt_t src, int offset)
  * Insert \a page into page allocation array of \a disk, using \a filelen_table and
  * \a free_number to compute position.
  */
-static void insertFreePage(struct BattFsSuper *disk, pgoff_t *filelen_table, mark_t mark, pgcnt_t page)
+static void insertFreePage(struct BattFsSuper *disk, mark_t mark, pgcnt_t page)
 {
-       ASSERT(mark >= disk->free_start);
-       ASSERT(mark < disk->free_next);
+       ASSERT(mark - disk->free_start < disk->free_next - disk->free_start);
 
-       pgcnt_t free_pos = countPages(filelen_table, BATTFS_MAX_FILES - 1);
-       free_pos += mark - disk->free_start;
-       TRACEMSG("mark:%d, page:%d, free_start:%d, free_next:%d, free_pos:%d\n",
+       pgcnt_t free_pos = disk->page_count - disk->free_next + mark;
+       ASSERT(free_pos < disk->page_count);
+
+       TRACEMSG("mark:%u, page:%u, free_start:%u, free_next:%u, free_pos:%u\n",
                mark, page, disk->free_start, disk->free_next, free_pos);
 
        ASSERT(disk->page_array[free_pos] == PAGE_UNSET_SENTINEL);
@@ -452,17 +452,17 @@ bool battfs_init(struct BattFsSuper *disk)
                                if (!battfs_markFree(disk, &hdr, old_page))
                                        return false;
 
-                               insertFreePage(disk, filelen_table, hdr.mark, old_page);
+                               insertFreePage(disk, hdr.mark, old_page);
                        }
                }
                else
                {
                        /* Check if page is free */
                        if (hdr.fcs_free != computeFcsFree(&hdr))
-                               /* Page is not a valid marked page, insert at the end of list */
-                               hdr.mark = disk->free_next++;
+                               /* Page is not a valid marked page, insert at list beginning */
+                               hdr.mark = --disk->free_start;
 
-                       insertFreePage(disk, filelen_table, hdr.mark, page);
+                       insertFreePage(disk, hdr.mark, page);
                }
        }