[PATCH rtems 2/2] dosfs: Use peek support

Christian Mauderer christian.mauderer at embedded-brains.de
Fri Jan 22 13:24:29 UTC 2021


This speeds up reading fragmented files.
---
 cpukit/libfs/src/dosfs/fat.c      | 10 ++++++++++
 cpukit/libfs/src/dosfs/fat.h      |  5 +++++
 cpukit/libfs/src/dosfs/fat_file.c | 21 ++++++++++++++++-----
 3 files changed, 31 insertions(+), 5 deletions(-)

diff --git a/cpukit/libfs/src/dosfs/fat.c b/cpukit/libfs/src/dosfs/fat.c
index c687477d04..e5cbe6c375 100644
--- a/cpukit/libfs/src/dosfs/fat.c
+++ b/cpukit/libfs/src/dosfs/fat.c
@@ -200,6 +200,16 @@ _fat_block_read(
     return cmpltd;
 }
 
+void
+fat_block_peek(
+    fat_fs_info_t                        *fs_info,
+    const uint32_t                        blk,
+    const uint32_t                        blk_cnt
+    )
+{
+    rtems_bdbuf_peek(fs_info->vol.dd, blk, blk_cnt);
+}
+
 static ssize_t
 fat_block_write(
     fat_fs_info_t                        *fs_info,
diff --git a/cpukit/libfs/src/dosfs/fat.h b/cpukit/libfs/src/dosfs/fat.h
index 064b4747a9..dae69d6e4e 100644
--- a/cpukit/libfs/src/dosfs/fat.h
+++ b/cpukit/libfs/src/dosfs/fat.h
@@ -499,6 +499,11 @@ _fat_block_read(fat_fs_info_t                        *fs_info,
                 uint32_t                              count,
                 void                                 *buff);
 
+void
+fat_block_peek(fat_fs_info_t                        *fs_info,
+               const uint32_t                        blk,
+               const uint32_t                        blk_cnt);
+
 ssize_t
 fat_cluster_write(fat_fs_info_t                    *fs_info,
                     uint32_t                          start_cln,
diff --git a/cpukit/libfs/src/dosfs/fat_file.c b/cpukit/libfs/src/dosfs/fat_file.c
index b4af8a11ca..ef9df0a67c 100644
--- a/cpukit/libfs/src/dosfs/fat_file.c
+++ b/cpukit/libfs/src/dosfs/fat_file.c
@@ -301,8 +301,11 @@ fat_file_read(
     uint32_t       ofs = 0;
     uint32_t       save_ofs;
     uint32_t       sec = 0;
+    uint32_t       sec_peek = 0;
     uint32_t       byte = 0;
     uint32_t       c = 0;
+    uint32_t       blk = 0;
+    uint32_t       blk_cnt = 0;
 
     /* it couldn't be removed - otherwise cache update will be broken */
     if (count == 0)
@@ -345,19 +348,27 @@ fat_file_read(
         c = MIN(count, (fs_info->vol.bpc - ofs));
 
         sec = fat_cluster_num_to_sector_num(fs_info, cur_cln);
+
+        save_cln = cur_cln;
+        rc = fat_get_fat_cluster(fs_info, cur_cln, &cur_cln);
+        if ( rc != RC_OK )
+            return rc;
+
+        sec_peek = fat_cluster_num_to_sector_num(fs_info, cur_cln);
+        blk = fat_sector_num_to_block_num (fs_info, sec_peek);
+        blk_cnt = fs_info->vol.bpc >> fs_info->vol.bytes_per_block_log2;
+        if (blk_cnt == 0)
+            blk_cnt = 1;
+        fat_block_peek(fs_info, blk, blk_cnt);
+
         sec += (ofs >> fs_info->vol.sec_log2);
         byte = ofs & (fs_info->vol.bps - 1);
-
         ret = _fat_block_read(fs_info, sec, byte, c, buf + cmpltd);
         if ( ret < 0 )
             return -1;
 
         count -= c;
         cmpltd += c;
-        save_cln = cur_cln;
-        rc = fat_get_fat_cluster(fs_info, cur_cln, &cur_cln);
-        if ( rc != RC_OK )
-            return rc;
 
         ofs = 0;
     }
-- 
2.26.2



More information about the devel mailing list