Skip to content

Commit bd7a4ab

Browse files
FAT driver: Apply the same optimizations to the addDirectoryEntry, which should then help performance where copying a lot of files in the same directory is concerned (for example, Windows 2000 setup)
1 parent 65fc102 commit bd7a4ab

1 file changed

Lines changed: 13 additions & 5 deletions

File tree

src/dos/drive_fat.cpp

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3594,7 +3594,10 @@ bool fatDrive::directoryChange(uint32_t dirClustNumber, const direntry *useEntry
35943594
bool fatDrive::addDirectoryEntry(uint32_t dirClustNumber, const direntry& useEntry,const char *lfn) {
35953595
if (unformatted) return false;
35963596

3597+
clusterChainMemory dir_ccm;
35973598
direntry sectbuf[MAX_DIRENTS_PER_SECTOR]; /* 16 directory entries per 512 byte sector */
3599+
uint32_t sectbuf_sector = 0;
3600+
bool sectbuf_valid = false;
35983601
uint32_t tmpsector;
35993602
uint16_t dirPos = 0;
36003603
unsigned int need = 1;
@@ -3647,19 +3650,24 @@ bool fatDrive::addDirectoryEntry(uint32_t dirClustNumber, const direntry& useEnt
36473650
if(dirPos >= BPB.v.BPB_RootEntCnt) return false;
36483651
tmpsector = firstRootDirSect+logentsector;
36493652
} else {
3650-
tmpsector = getAbsoluteSectFromChain(dirClustNumber, logentsector);
3653+
tmpsector = getAbsoluteSectFromChain(dirClustNumber, logentsector, &dir_ccm);
36513654
/* A zero sector number can't happen - we need to allocate more room for this directory*/
36523655
if(tmpsector == 0) {
36533656
uint32_t newClust;
3654-
newClust = appendCluster(dirClustNumber);
3657+
newClust = appendCluster(dirClustNumber, &dir_ccm);
36553658
if(newClust == 0) return false;
36563659
zeroOutCluster(newClust);
36573660
/* Try again to get tmpsector */
3658-
tmpsector = getAbsoluteSectFromChain(dirClustNumber, logentsector);
3661+
tmpsector = getAbsoluteSectFromChain(dirClustNumber, logentsector, &dir_ccm);
36593662
if(tmpsector == 0) return false; /* Give up if still can't get more room for directory */
36603663
}
36613664
}
3662-
readSector(tmpsector,sectbuf);
3665+
3666+
if (!sectbuf_valid || sectbuf_sector != tmpsector) {
3667+
readSector(tmpsector,sectbuf);
3668+
sectbuf_sector = tmpsector;
3669+
sectbuf_valid = true;
3670+
}
36633671

36643672
/* Deleted file entry or end of directory list */
36653673
if ((sectbuf[entryoffset].entryname[0] == 0xe5) || (sectbuf[entryoffset].entryname[0] == 0x00)) {
@@ -3706,7 +3714,7 @@ bool fatDrive::addDirectoryEntry(uint32_t dirClustNumber, const direntry& useEnt
37063714
if(dirPos >= BPB.v.BPB_RootEntCnt) return false;
37073715
tmpsector = firstRootDirSect+logentsector;
37083716
} else {
3709-
tmpsector = getAbsoluteSectFromChain(dirClustNumber, logentsector);
3717+
tmpsector = getAbsoluteSectFromChain(dirClustNumber, logentsector, &dir_ccm);
37103718
/* A zero sector number can't happen - we need to allocate more room for this directory*/
37113719
if(tmpsector == 0) return false;
37123720
}

0 commit comments

Comments
 (0)