Просмотр исходного кода

BUGFIX:
1. Delayed cache flush feature when flush is forced

UPTATES:
1. Demo app improvements.
2. Ext images update.

Grzegorz Kostka 12 лет назад
Родитель
Сommit
974cf28b9b
3 измененных файлов с 34 добавлено и 34 удалено
  1. 5 4
      demos/generic/main.c
  2. BIN
      ext_images.7z
  3. 29 30
      lwext4/ext4_blockdev.c

+ 5 - 4
demos/generic/main.c

@@ -354,7 +354,7 @@ int main(int argc, char **argv)
 
 	for (i = 0; i < rw_count; ++i) {
 
-		memset(wr_buff, i & 0xFF, rw_szie);
+		memset(wr_buff, i % 10 + '0', rw_szie);
 
 		r = ext4_fwrite(&f, wr_buff, rw_szie, &size);
 
@@ -380,7 +380,7 @@ int main(int argc, char **argv)
 	printf("ext4_read: %d * %d ..." , rw_count, rw_szie);
 
 	for (i = 0; i < rw_count; ++i) {
-		memset(wr_buff, i & 0xFF, rw_szie);
+		memset(wr_buff, i % 10 + '0', rw_szie);
 		r = ext4_fread(&f, rd_buff, rw_szie, &size);
 
 		if((r != EOK) || (size != rw_szie))
@@ -403,12 +403,13 @@ int main(int argc, char **argv)
 	if(sbstat)
 	    mp_stats();
 
-	if(bstat)
-	    block_stats();
 
 	if(cleanup_flag)
 	    cleanup();
 
+    if(bstat)
+        block_stats();
+
 	r = ext4_umount("/mp/");
 	printf("Test finish: OK\n");
     return EXIT_SUCCESS;


+ 29 - 30
lwext4/ext4_blockdev.c

@@ -96,6 +96,7 @@ int ext4_block_get(struct	ext4_blockdev *bdev, struct	ext4_block *b,
     uint32_t pb_cnt;
     bool	 is_new;
     int 	 r;
+    uint32_t i;
     ext4_assert(bdev && b);
 
     if(!(bdev->flags & EXT4_BDEV_INITIALIZED))
@@ -107,6 +108,33 @@ int ext4_block_get(struct	ext4_blockdev *bdev, struct	ext4_block *b,
     b->dirty = 0;
     b->lb_id = lba;
 
+    /*If cache is full we have to flush it anyway :(*/
+    if(ext4_bcache_is_full(bdev->bc) && bdev->cache_flush_delay){
+        for (i = 0; i < bdev->bc->cnt; ++i) {
+            /*Check if buffer free was delayed.*/
+            if(!bdev->bc->free_delay[i])
+                continue;
+
+            /*Check reference counter.*/
+            if(bdev->bc->refctr[i])
+                continue;
+
+            /*Buffer free was delayed and have no reference. Flush it.*/
+            r = ext4_block_set_direct(bdev,
+                    bdev->bc->data + bdev->bc->itemsize * i,
+                    bdev->bc->lba[i]);
+            if(r != EOK)
+                return r;
+
+            /*No delayed anymore*/
+            bdev->bc->free_delay[i] = 0;
+
+            /*Reduce refered block count*/
+            bdev->bc->ref_blocks--;
+        }
+    }
+
+
     r = ext4_bcache_alloc(bdev->bc, b, &is_new);
     if(r != EOK)
         return r;
@@ -141,7 +169,6 @@ int ext4_block_set(struct	ext4_blockdev *bdev, struct	ext4_block *b)
 {
     uint64_t pba;
     uint32_t pb_cnt;
-    uint32_t i;
     int r;
 
     ext4_assert(bdev && b);
@@ -159,35 +186,7 @@ int ext4_block_set(struct	ext4_blockdev *bdev, struct	ext4_block *b)
     if(bdev->cache_flush_delay){
 
         /*Free cahe block and mark as free delayed*/
-        ext4_bcache_free(bdev->bc, b, bdev->cache_flush_delay);
-
-        /*If cache is full we have to flush it anyway :(*/
-        if(ext4_bcache_is_full(bdev->bc)){
-            for (i = 0; i < bdev->bc->cnt; ++i) {
-                /*Check if buffer free was delayed.*/
-                if(!bdev->bc->free_delay[i])
-                    continue;
-
-                /*Check reference counter.*/
-                if(bdev->bc->refctr[i])
-                    continue;
-
-                /*Buffer free was delayed and have no reference. Flush it.*/
-                r = ext4_block_set_direct(bdev,
-                        bdev->bc->data + bdev->bc->itemsize * i,
-                        bdev->bc->lba[i]);
-                if(r != EOK)
-                    return r;
-
-                /*No delayed anymore*/
-                bdev->bc->free_delay[i] = 0;
-
-                /*Reduce refered block count*/
-                bdev->bc->ref_blocks--;
-            }
-        }
-
-        return EOK;
+        return ext4_bcache_free(bdev->bc, b, bdev->cache_flush_delay);
     }
 
     pba 	= (b->lb_id * bdev->lg_bsize) / bdev->ph_bsize;