summaryrefslogtreecommitdiffstats
path: root/cpukit/libfs/src/dosfs/fat.h
diff options
context:
space:
mode:
authorRalf Kirchner <ralf.kirchner@embedded-brains.de>2012-11-28 14:43:32 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2012-12-05 15:26:48 +0100
commita20fbe78ec1a84a557ed9bcf5412b1b7c530aa35 (patch)
tree83bb1d7d288143056a788344a768f3496a969801 /cpukit/libfs/src/dosfs/fat.h
parentfstests/fsdosfsformat01: New test (diff)
downloadrtems-a20fbe78ec1a84a557ed9bcf5412b1b7c530aa35.tar.bz2
dosfs: Block size optimization
Change block size of bdbuf to the cluster size if the data clusters are aligned on a cluster boundary. This enables fast access to data clusters.
Diffstat (limited to 'cpukit/libfs/src/dosfs/fat.h')
-rw-r--r--cpukit/libfs/src/dosfs/fat.h39
1 files changed, 26 insertions, 13 deletions
diff --git a/cpukit/libfs/src/dosfs/fat.h b/cpukit/libfs/src/dosfs/fat.h
index dab2471900..48b149199d 100644
--- a/cpukit/libfs/src/dosfs/fat.h
+++ b/cpukit/libfs/src/dosfs/fat.h
@@ -298,6 +298,9 @@ typedef struct fat_vol_s
uint8_t spc_log2; /* log2 of spc */
uint16_t bpc; /* bytes per cluster */
uint8_t bpc_log2; /* log2 of bytes per cluster */
+ uint8_t sectors_per_block; /* sectors per bdbuf block */
+ uint16_t bytes_per_block; /* number of bytes for the bduf block device handling */
+ uint8_t bytes_per_block_log2; /* log2 of bytes_per_block */
uint8_t fats; /* number of FATs */
uint8_t type; /* FAT type */
uint32_t mask;
@@ -436,6 +439,25 @@ fat_cluster_num_to_sector512_num(
fs_info->vol.sec_mul);
}
+static inline uint32_t
+ fat_sector_num_to_block_num (const fat_fs_info_t *fs_info,
+ const uint32_t sector_number)
+{
+ return sector_number >> (fs_info->vol.bytes_per_block_log2 - fs_info->vol.sec_log2);
+}
+
+static inline uint32_t
+ fat_sector_offset_to_block_offset (const fat_fs_info_t *fs_info,
+ const uint32_t sector,
+ const uint32_t sector_offset)
+{
+ return sector_offset +
+ ((sector -
+ fat_block_num_to_sector_num (fs_info,
+ fat_sector_num_to_block_num (fs_info, sector)))
+ << fs_info->vol.sec_log2);
+}
+
static inline void
fat_buf_mark_modified(fat_fs_info_t *fs_info)
{
@@ -443,8 +465,10 @@ fat_buf_mark_modified(fat_fs_info_t *fs_info)
}
int
-fat_buf_access(fat_fs_info_t *fs_info, uint32_t blk, int op_type,
- rtems_bdbuf_buffer **buf);
+fat_buf_access(fat_fs_info_t *fs_info,
+ uint32_t sec_num,
+ int op_type,
+ uint8_t **sec_buf);
int
fat_buf_release(fat_fs_info_t *fs_info);
@@ -469,18 +493,7 @@ _fat_block_zero(fat_fs_info_t *fs_info,
uint32_t offset,
uint32_t count);
-int
-_fat_block_release(fat_fs_info_t *fs_info);
-
-ssize_t
-fat_cluster_read(fat_fs_info_t *fs_info,
- uint32_t cln,
- void *buff);
-ssize_t
-fat_cluster_write(fat_fs_info_t *fs_info,
- uint32_t cln,
- const void *buff);
int
fat_init_volume_info(fat_fs_info_t *fs_info, const char *device);