@@ -3594,7 +3594,10 @@ bool fatDrive::directoryChange(uint32_t dirClustNumber, const direntry *useEntry
35943594bool 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