userlibandfileserver/fileserver/sfile/sf_file_cache.cpp
changeset 131 e880629062dd
parent 0 a41df078684a
child 134 95847726fe57
--- a/userlibandfileserver/fileserver/sfile/sf_file_cache.cpp	Tue May 04 09:44:26 2010 +0100
+++ b/userlibandfileserver/fileserver/sfile/sf_file_cache.cpp	Wed May 05 05:11:16 2010 +0100
@@ -1503,6 +1503,11 @@
 					// Need to reset currentOperation.iReadWriteArgs.iTotalLength here to make sure 
 					// TFsFileWrite::PostInitialise() doesn't think there's no data left to process
 					aMsgRequest.ReStart();
+					
+					//Need to preserve the current state otherwise if we are over the ram threshold 
+					//the request can end up in a livelock trying to repeatedly flush.
+					currentOperation->iState = EStWriteThrough;
+					
 					if (r == CFsRequest::EReqActionBusy || r != CFsRequest::EReqActionComplete)
 						return r;
 					}
@@ -1594,17 +1599,13 @@
 
 void CFileCache::PropagateFlushErrorToAllFileShares()
 	{
-	FileShares->Lock();
-	TInt count = FileShares->Count();
-	while(count--)
+	ASSERT(IsDriveThread());
+	TDblQueIter<CFileShare> fileShareIter(iFileCB->FileShareList());
+	CFileShare* pFileShare;
+	while ((pFileShare = fileShareIter++) != NULL)
 		{
-		CFileShare* share = (CFileShare*)(*FileShares)[count];
-		if (&share->File() == iFileCB)
-			{
-			share->iFlushError = iFlushError;
-			}
+		pFileShare->iFlushError = iFlushError;
 		}
-	FileShares->Unlock();
 	}
 
 /**