1 |
/* fat.c - Support for FAT filesystems. |
/* fat.c - Support for FAT filesystems. |
2 |
Copyright (C) 2002 Free Software Foundation, Inc. |
Copyright (C) 2002, 2003 Free Software Foundation, Inc. |
3 |
Written by Marcus Brinkmann. |
Written by Marcus Brinkmann. |
4 |
|
|
5 |
This file is part of the GNU Hurd. |
This file is part of the GNU Hurd. |
151 |
error (1, 0, "Number of total sectors is zero"); |
error (1, 0, "Number of total sectors is zero"); |
152 |
|
|
153 |
if (bytes_per_sector & (store->block_size - 1)) |
if (bytes_per_sector & (store->block_size - 1)) |
154 |
error (1, 0, "Block size of filesystem is not a multiple of the block size " |
error (1, 0, "Block size of filesystem is not |
155 |
"of the store"); |
" a multiple of the block size of the store"); |
156 |
|
|
157 |
if (read_word (sblock->reserved_sectors) == 0) |
if (read_word (sblock->reserved_sectors) == 0) |
158 |
error (1, 0, "Number of reserved sectors is zero"); |
error (1, 0, "Number of reserved sectors is zero"); |
164 |
if (sectors_per_fat == 0) |
if (sectors_per_fat == 0) |
165 |
error (1, 0, "Number of sectors per fat is zero"); |
error (1, 0, "Number of sectors per fat is zero"); |
166 |
|
|
167 |
nr_of_root_dir_sectors = ((read_word (sblock->nr_of_root_dirents) * FAT_DIR_REC_LEN) |
nr_of_root_dir_sectors = ((read_word (sblock->nr_of_root_dirents) * |
168 |
- 1) / bytes_per_sector + 1; |
FAT_DIR_REC_LEN) - 1) / bytes_per_sector + 1; |
|
if (nr_of_root_dir_sectors & (sectors_per_cluster - 1)) |
|
|
error (1, 0, "Number of root dir sectors is not a multiple of sectors_per_cluster"); |
|
169 |
|
|
170 |
first_root_dir_byte = (read_word (sblock->reserved_sectors) |
first_root_dir_byte = (read_word (sblock->reserved_sectors) |
171 |
+ (sblock->nr_of_fat_tables * sectors_per_fat)) << log2_bytes_per_sector; |
+ (sblock->nr_of_fat_tables * sectors_per_fat)) << log2_bytes_per_sector; |
172 |
first_data_sector = (first_root_dir_byte >> log2_bytes_per_sector) + nr_of_root_dir_sectors; |
first_data_sector = (first_root_dir_byte >> log2_bytes_per_sector) |
173 |
|
+ nr_of_root_dir_sectors; |
174 |
first_data_byte = first_data_sector << log2_bytes_per_sector; |
first_data_byte = first_data_sector << log2_bytes_per_sector; |
175 |
|
|
176 |
nr_of_clusters = (total_sectors - first_data_sector) / sectors_per_cluster; |
nr_of_clusters = (total_sectors - first_data_sector) / sectors_per_cluster; |