diff options
| -rw-r--r-- | fs/fat/fat.c | 59 | 
1 files changed, 33 insertions, 26 deletions
| diff --git a/fs/fat/fat.c b/fs/fat/fat.c index 48c88448a..fbc2d7de1 100644 --- a/fs/fat/fat.c +++ b/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,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); |