FAT: Fix redundant sector read
PATCH 3/7 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.
--- .../fs/fat/fat.c | 59 +++++++++++--------- 1 file changed, 33 insertions(+), 26 deletions(-)
fs/fat/fat.c +33 -26
@@ -777,7 +777,7 @@ do_fat_read (const char *filename, void *buffer, unsigned long maxsize,volume_info volinfo;fsdata datablock;fsdata *mydata = &datablock; -dir_entry *dentptr; +dir_entry *dentptr =NULL ;__u16 prevcksum =0xffff ;char *subname ="" ;__u32 cursect;
@@ -876,19 +876,21 @@ do_fat_read (const char *filename, void *buffer, unsigned long maxsize,while (1 ) {int i; -debug ("FAT read sect=%d, clust_size=%d, DIRENTSPERBLOCK=%zd\n" , - cursect, mydata->clust_size,DIRENTSPERBLOCK ); +if (j ==0 ) { +debug ("FAT read sect=%d, clust_size=%d, DIRENTSPERBLOCK=%zd\n" , + cursect, mydata->clust_size,DIRENTSPERBLOCK ); -if (disk_read (cursect, - (mydata->fatsize ==32 ) ? - (mydata->clust_size) : -PREFETCH_BLOCKS , - do_fat_read_block) <0 ) { -debug ("Error: reading rootdir block\n" ); - goto exit; - } +if (disk_read (cursect, + (mydata->fatsize ==32 ) ? + (mydata->clust_size) : +PREFETCH_BLOCKS , + do_fat_read_block) <0 ) { +debug ("Error: reading rootdir block\n" ); + goto exit; + } - dentptr = (dir_entry *) do_fat_read_block; + dentptr = (dir_entry *) do_fat_read_block; + }for (i =0 ; i <DIRENTSPERBLOCK ; i++) {char s_name[14 ], l_name[VFAT_MAXLEN_BYTES ];
@@ -1030,28 +1032,33 @@ do_fat_read (const char *filename, void *buffer, unsigned long maxsize,* completely processed. */ ++j; -int fat32_end =0 ; -if ((mydata->fatsize ==32 ) && (j == mydata->clust_size)) { -int nxtsect =0 ; -int nxt_clust =0 ; +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 ); + nxt_clust =get_fatent (mydata, root_cluster); + rootdir_end =CHECK_CLUST (nxt_clust,32 ); - nxtsect = mydata->data_begin + - (nxt_clust * mydata->clust_size); + nxtsect = mydata->data_begin + + (nxt_clust * mydata->clust_size); - root_cluster = nxt_clust; + root_cluster = nxt_clust; - cursect = nxtsect; - j =0 ; + 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);
PATCH v2 4/8 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.
---
Changes for v2:
- Patch renumbering because of the new v2 1/8.
- Possible code style changes due to the new v2 1/8.
.../fs/fat/fat.c | 59 +++++++++++--------- 1 file changed, 33 insertions(+), 26 deletions(-)
fs/fat/fat.c +33 -26
@@ -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,19 +874,21 @@ do_fat_read(const char *filename, void *buffer, unsigned long maxsize, int dols)while (1 ) {int i; -debug ("FAT read sect=%d, clust_size=%d, DIRENTSPERBLOCK=%zd\n" , - cursect, mydata->clust_size,DIRENTSPERBLOCK ); +if (j ==0 ) { +debug ("FAT read sect=%d, clust_size=%d, DIRENTSPERBLOCK=%zd\n" , + cursect, mydata->clust_size,DIRENTSPERBLOCK ); -if (disk_read (cursect, - (mydata->fatsize ==32 ) ? - (mydata->clust_size) : -PREFETCH_BLOCKS , - do_fat_read_block) <0 ) { -debug ("Error: reading rootdir block\n" ); - goto exit; - } +if (disk_read (cursect, + (mydata->fatsize ==32 ) ? + (mydata->clust_size) : +PREFETCH_BLOCKS , + do_fat_read_block) <0 ) { +debug ("Error: reading rootdir block\n" ); + goto exit; + } - dentptr = (dir_entry *) do_fat_read_block; + dentptr = (dir_entry *) do_fat_read_block; + }for (i =0 ; i <DIRENTSPERBLOCK ; i++) {char s_name[14 ], l_name[VFAT_MAXLEN_BYTES ];
@@ -1028,28 +1030,33 @@ 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 nxtsect =0 ; -int nxt_clust =0 ; +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 ); + nxt_clust =get_fatent (mydata, root_cluster); + rootdir_end =CHECK_CLUST (nxt_clust,32 ); - nxtsect = mydata->data_begin + - (nxt_clust * mydata->clust_size); + nxtsect = mydata->data_begin + + (nxt_clust * mydata->clust_size); - root_cluster = nxt_clust; + root_cluster = nxt_clust; - cursect = nxtsect; - j =0 ; + 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);
Wolfgang Denk
AppliedPATCH v2 4/8 FAT: Fix redundant sector read
Dear Beno?t Th?baudeau,
Quoted 6 lines · In message <[email protected]> you…
With the previous code, the remaining prefetched sectors were read again af> ter each sector. With this patch, each sector is read only once, thus making th> e prefetch useful.
Signed-off-by Beno?t Th?baudeau <[email protected]>Cc Wolfgang Denk <[email protected]>
Quoted 7 lines
---
Changes for v2:
- Patch renumbering because of the new v2 1/8.
- Possible code style changes due to the new v2 1/8.
.../fs/fat/fat.c| 59 +++++++++++-----> ----1 file changed, 33 insertions(+), 26 deletions(-)
Applied, thanks.
Best regards,
Wolfgang Denk
Signature · 5 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de Q: What do you get when you cross an ethernet with an income statement? A: A local area networth.