diff -r d37db4dcc88d -r 1560c419b176 userlibandfileserver/fileserver/sfat32/sl_mnt.cpp --- a/userlibandfileserver/fileserver/sfat32/sl_mnt.cpp Tue Aug 24 14:49:21 2010 +0100 +++ b/userlibandfileserver/fileserver/sfat32/sl_mnt.cpp Tue Aug 31 11:31:15 2010 +0100 @@ -690,10 +690,31 @@ #endif - - const TUint32 freeClusters = FAT().NumberOfFreeClusters(bSyncOp); + //-- find out number of free clusters on the volume + TUint32 freeClusters = FAT().NumberOfFreeClusters(EFalse); //-- this is a _current_ amount of free clusters, this operation is non-blocking + + if(bSyncOp) + {//-- the "::VolumeL()" query is synchronous, see if we can make it semi-synchronous + const TUint32 KSyncScanThresholdMB = FatConfig().FAT32_SyncScanThresholdMB(); + + if(!KSyncScanThresholdMB) + {//-- the free clusters scan threshold isn't set, the query is fully synchronous. + //-- this call will block until FAT scan thread finishes + __PRINT1(_L("CFatMountCB::VolumeL() drv:%d #1"), DriveNumber()); + freeClusters = FAT().NumberOfFreeClusters(ETrue); //-- this will be _true_ amount of free clusters + } + else + {//-- request number of free clusters enough to satisfy the threshold value + const TUint32 KClustersRequired = (TUint32)((TUint64)KSyncScanThresholdMB << 20) >> ClusterSizeLog2(); + __PRINT2(_L("CFatMountCB::VolumeL() drv:%d req clusters:%d"), DriveNumber(), KClustersRequired); + (void)FAT().RequestFreeClusters(KClustersRequired); + freeClusters = FAT().NumberOfFreeClusters(EFalse); //-- _current_ amount of free clusters, this operation is non-blocking + } + + } + aVolume.iFree = (TInt64)freeClusters << ClusterSizeLog2(); - __PRINT1(_L("CFatMountCB::VolumeL() free clusters:%d"), freeClusters); + __PRINT2(_L("CFatMountCB::VolumeL() drv:%d, free clusters:%d"), DriveNumber(), freeClusters); if(drvInfo.iType==EMediaRam) @@ -1639,7 +1660,7 @@ const TInt maxClusters=((aLength+clusterRelativePos-1)>>ClusterSizeLog2())+1; const TInt clusterListLen=FAT().CountContiguousClustersL(aPos.iCluster,endCluster,maxClusters); const TInt writeLength=Min(aLength,(clusterListLen<WriteL(dataStart,writeLength,aSrc,aMessage,anOffset, aFlag)); @@ -1670,7 +1691,7 @@ if((aPos.iPos != 0) && (badcluster == aPos.iCluster) && (aLastcluster == 0) && (aPos.iCluster == cluster)) { //Copy the contents already present in this cluster to new cluster allocated. const TInt sizeToRead = aPos.iPos - ((aPos.iPos >> ClusterSizeLog2()) << ClusterSizeLog2()); - dataStart = FAT().DataPositionInBytes(aPos.iCluster) + ClusterRelativePos((aPos.iPos - sizeToRead)); + dataStart = FAT().DataPositionInBytesL(aPos.iCluster) + ClusterRelativePos((aPos.iPos - sizeToRead)); //-- Allocate the buffer required to copy the contents from bad cluster @@ -1699,7 +1720,7 @@ { //Calculate and copy the contents to new cluster. aPos.iCluster = goodcluster; - dataStart = FAT().DataPositionInBytes(aPos.iCluster) + ClusterRelativePos(aPos.iPos - sizeToRead); + dataStart = FAT().DataPositionInBytesL(aPos.iCluster) + ClusterRelativePos(aPos.iPos - sizeToRead); r = LocalDrive()->Write(dataStart, clustBuf); if(r == KErrNone) @@ -1807,7 +1828,7 @@ const TInt maxClusters=((aLength+clusterRelativePos-1)>>ClusterSizeLog2())+1; const TInt clusterListLen=FAT().CountContiguousClustersL(aPos.iCluster,endCluster,maxClusters); const TInt readLength=Min(aLength,(clusterListLen<ReadL(dataStart,readLength,aTrg,aMessage,anOffset, aFlag)); @@ -3171,7 +3192,7 @@ User::Leave(KErrCorrupt); TBuf8 uidBuf; - iRawDisk->ReadCachedL(FAT().DataPositionInBytes(aCluster),sizeof(TCheckedUid),uidBuf); + iRawDisk->ReadCachedL(FAT().DataPositionInBytesL(aCluster),sizeof(TCheckedUid),uidBuf); __ASSERT_DEBUG(uidBuf.Length()==sizeof(TCheckedUid),Fault(EFatReadUidFailed)); TCheckedUid uid(uidBuf); anEntry.iType=uid.UidType(); @@ -3247,7 +3268,7 @@ // Read the remaining length or the entire cluster block whichever is smaller TInt readLength = Min(aLength-readTotal,(clusterListLen<0,Fault(EReadFileSectionFailed)); - TInt64 dataAddress=(FAT().DataPositionInBytes(cluster))+pos; + TInt64 dataAddress=(FAT().DataPositionInBytesL(cluster))+pos; iRawDisk->ReadL(dataAddress,readLength,aTrg,aMessage,readTotal, 0); readTotal += readLength; @@ -3451,7 +3472,7 @@ if (!IsRootDir(aPos)) { TInt relPos=ClusterRelativePos(aPos.iPos); - return FAT().DataPositionInBytes(aPos.iCluster)+relPos; + return FAT().DataPositionInBytesL(aPos.iCluster)+relPos; } if (aPos.iPos+StartOfRootDirInBytes()>=RootDirEnd()) User::Leave(KErrDirFull); // Past last root dir entry @@ -4100,7 +4121,7 @@ User::LeaveIfError(r); if ( caps().iType&EMediaRam ) { - realPosition = FAT().DataPositionInBytes( aPos.iCluster ); + realPosition = FAT().DataPositionInBytesL( aPos.iCluster ); aPos.iCluster = I64LOW((realPosition - aInfo.iStartBlockAddress)>>ClusterSizeLog2()); blockMapEntry.SetStartBlock( aPos.iCluster ); }