mirror of
https://github.com/Stichting-MINIX-Research-Foundation/u-boot.git
synced 2025-09-17 07:56:25 -04:00
FAT: Fix redundant sector read
With the previous code, the remaining prefetched sectors were read again after each sector. With this patch, each sector is read only once, thus making the prefetch useful. Signed-off-by: Benoît Thébaudeau <benoit.thebaudeau@advansee.com> Cc: Wolfgang Denk <wd@denx.de>
This commit is contained in:
parent
88503ad3bb
commit
cd1b042c5c
21
fs/fat/fat.c
21
fs/fat/fat.c
@ -775,7 +775,7 @@ do_fat_read(const char *filename, void *buffer, unsigned long maxsize, int dols)
|
||||
volume_info volinfo;
|
||||
fsdata datablock;
|
||||
fsdata *mydata = &datablock;
|
||||
dir_entry *dentptr;
|
||||
dir_entry *dentptr = NULL;
|
||||
__u16 prevcksum = 0xffff;
|
||||
char *subname = "";
|
||||
__u32 cursect;
|
||||
@ -874,6 +874,7 @@ do_fat_read(const char *filename, void *buffer, unsigned long maxsize, int dols)
|
||||
while (1) {
|
||||
int i;
|
||||
|
||||
if (j == 0) {
|
||||
debug("FAT read sect=%d, clust_size=%d, DIRENTSPERBLOCK=%zd\n",
|
||||
cursect, mydata->clust_size, DIRENTSPERBLOCK);
|
||||
|
||||
@ -887,6 +888,7 @@ do_fat_read(const char *filename, void *buffer, unsigned long maxsize, int dols)
|
||||
}
|
||||
|
||||
dentptr = (dir_entry *) do_fat_read_block;
|
||||
}
|
||||
|
||||
for (i = 0; i < DIRENTSPERBLOCK; i++) {
|
||||
char s_name[14], l_name[VFAT_MAXLEN_BYTES];
|
||||
@ -1028,13 +1030,14 @@ do_fat_read(const char *filename, void *buffer, unsigned long maxsize, int dols)
|
||||
* completely processed.
|
||||
*/
|
||||
++j;
|
||||
int fat32_end = 0;
|
||||
if ((mydata->fatsize == 32) && (j == mydata->clust_size)) {
|
||||
int rootdir_end = 0;
|
||||
if (mydata->fatsize == 32) {
|
||||
if (j == mydata->clust_size) {
|
||||
int nxtsect = 0;
|
||||
int nxt_clust = 0;
|
||||
|
||||
nxt_clust = get_fatent(mydata, root_cluster);
|
||||
fat32_end = CHECK_CLUST(nxt_clust, 32);
|
||||
rootdir_end = CHECK_CLUST(nxt_clust, 32);
|
||||
|
||||
nxtsect = mydata->data_begin +
|
||||
(nxt_clust * mydata->clust_size);
|
||||
@ -1043,13 +1046,17 @@ do_fat_read(const char *filename, void *buffer, unsigned long maxsize, int dols)
|
||||
|
||||
cursect = nxtsect;
|
||||
j = 0;
|
||||
}
|
||||
} else {
|
||||
cursect++;
|
||||
if (j == PREFETCH_BLOCKS)
|
||||
j = 0;
|
||||
|
||||
rootdir_end = (++cursect - mydata->rootdir_sect >=
|
||||
rootdir_size);
|
||||
}
|
||||
|
||||
/* If end of rootdir reached */
|
||||
if ((mydata->fatsize == 32 && fat32_end) ||
|
||||
(mydata->fatsize != 32 && j == rootdir_size)) {
|
||||
if (rootdir_end) {
|
||||
if (dols == LS_ROOT) {
|
||||
printf("\n%d file(s), %d dir(s)\n\n",
|
||||
files, dirs);
|
||||
|
Loading…
x
Reference in New Issue
Block a user