mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-21 14:41:31 +00:00
fs/fat: Improve error handling
The FAT filesystem fails silently in inexplicable ways when given a filesystem with a block-size that does not match the device sector size. In theory this is not an unsupportable combination but requires a major rewrite of a lot of the filesystem. Until that occurs, the filesystem should detect that scenario and display a helpful error message. This scenario in particular occurred on a 512-byte blocksize FAT fs stored in an El-Torito boot volume on a CD-ROM (2048-byte sector size). Additionally, in many circumstances the ->block_read method will not return a negative number to indicate an error but instead return 0 to indicate the number of blocks successfully read (IE: None). The FAT filesystem should defensively check to ensure that it got all of the sectors that it asked for when reading. Signed-off-by: Kyle Moffett <Kyle.D.Moffett@boeing.com>
This commit is contained in:
parent
9813b750f3
commit
46236b1407
1 changed files with 14 additions and 4 deletions
18
fs/fat/fat.c
18
fs/fat/fat.c
|
@ -274,6 +274,8 @@ get_cluster (fsdata *mydata, __u32 clustnum, __u8 *buffer,
|
||||||
{
|
{
|
||||||
__u32 idx = 0;
|
__u32 idx = 0;
|
||||||
__u32 startsect;
|
__u32 startsect;
|
||||||
|
__u32 nr_sect;
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (clustnum > 0) {
|
if (clustnum > 0) {
|
||||||
startsect = mydata->data_begin +
|
startsect = mydata->data_begin +
|
||||||
|
@ -284,16 +286,19 @@ get_cluster (fsdata *mydata, __u32 clustnum, __u8 *buffer,
|
||||||
|
|
||||||
debug("gc - clustnum: %d, startsect: %d\n", clustnum, startsect);
|
debug("gc - clustnum: %d, startsect: %d\n", clustnum, startsect);
|
||||||
|
|
||||||
if (disk_read(startsect, size / mydata->sect_size, buffer) < 0) {
|
nr_sect = size / mydata->sect_size;
|
||||||
debug("Error reading data\n");
|
ret = disk_read(startsect, nr_sect, buffer);
|
||||||
|
if (ret != nr_sect) {
|
||||||
|
debug("Error reading data (got %d)\n", ret);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (size % mydata->sect_size) {
|
if (size % mydata->sect_size) {
|
||||||
__u8 tmpbuf[mydata->sect_size];
|
__u8 tmpbuf[mydata->sect_size];
|
||||||
|
|
||||||
idx = size / mydata->sect_size;
|
idx = size / mydata->sect_size;
|
||||||
if (disk_read(startsect + idx, 1, tmpbuf) < 0) {
|
ret = disk_read(startsect + idx, 1, tmpbuf);
|
||||||
debug("Error reading data\n");
|
if (ret != 1) {
|
||||||
|
debug("Error reading data (got %d)\n", ret);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
buffer += idx * mydata->sect_size;
|
buffer += idx * mydata->sect_size;
|
||||||
|
@ -803,6 +808,11 @@ do_fat_read (const char *filename, void *buffer, unsigned long maxsize,
|
||||||
|
|
||||||
mydata->sect_size = (bs.sector_size[1] << 8) + bs.sector_size[0];
|
mydata->sect_size = (bs.sector_size[1] << 8) + bs.sector_size[0];
|
||||||
mydata->clust_size = bs.cluster_size;
|
mydata->clust_size = bs.cluster_size;
|
||||||
|
if (mydata->sect_size != cur_part_info.blksz) {
|
||||||
|
printf("Error: FAT sector size mismatch (fs=%hu, dev=%lu)\n",
|
||||||
|
mydata->sect_size, cur_part_info.blksz);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (mydata->fatsize == 32) {
|
if (mydata->fatsize == 32) {
|
||||||
mydata->data_begin = mydata->rootdir_sect -
|
mydata->data_begin = mydata->rootdir_sect -
|
||||||
|
|
Loading…
Add table
Reference in a new issue