diff -r ff5437e4337c -r 48e57fb1237e userlibandfileserver/fileserver/sfile/sf_sys.cpp --- a/userlibandfileserver/fileserver/sfile/sf_sys.cpp Wed Oct 06 17:13:14 2010 +0100 +++ b/userlibandfileserver/fileserver/sfile/sf_sys.cpp Mon Oct 11 17:54:41 2010 +0100 @@ -1181,7 +1181,9 @@ if (err == CFsRequest::EReqActionBusy) return err; - DoCompleteDismountNotify(err); + // Complete, remove and delete notification requests + FsNotify::HandleDismount(EFsDismountNotifyClients, iDriveNumber, ETrue, err); + FsNotify::HandleDismount(EFsDismountForceDismount, iDriveNumber, ETrue, err); SetDismountDeferred(EFalse); @@ -1358,9 +1360,8 @@ // { CSessionFs* session = aRequest->Session(); - TInt drive = FsNotify::CancelDismountNotifySession(session, (TRequestStatus*)aRequest->Message().Ptr0()); - if (drive >= 0) - TheDrives[drive].SetDismountDeferred(EFalse); + FsNotify::CancelDismountNotifySession(session, (TRequestStatus*)aRequest->Message().Ptr0()); + return KErrNone; } @@ -1385,22 +1386,7 @@ if(!FsNotify::HandlePendingDismount(aRequest->Session(), driveNumber)) return KErrNotFound; - if(theDrive->DismountLocked()) - return KErrNone; - - TInt clampErr = theDrive->ClampsOnDrive(); - TInt err = KErrNone; - - if ((theDrive->DismountDeferred()) && (clampErr == 0 || clampErr == KErrNotSupported)) - { - // No clamps to worry about, so dismount immediately and complete the request - __ASSERT_DEBUG(aRequest->Drive()->GetFSys(), Fault(EAllowDismount)); - - // When the last client has responded, allow the media to be forcibly dismounted - err = theDrive->DeferredDismount(); - } - - return err; + return theDrive->DeferredDismountCheck(); } TInt TFsAllowDismount::Initialise(CFsRequest* aRequest) @@ -1412,6 +1398,23 @@ } +TInt TFsDeferredDismount::Initialise(CFsRequest* /*aRequest*/) + { + return KErrNone; + } + +/* +Dismount the file system - this internal request is queued when one client issues a EFsDismountNotifyClients +request and another client with an outstanding EFsDismountRegisterClient closes their session (in the context +of the main file server thread) without sending a EFsAllowDismount request. + +*/ +TInt TFsDeferredDismount::DoRequestL(CFsRequest* aRequest) + { + return TheDrives[aRequest->DriveNumber()].DeferredDismountCheck(); + } + + TInt TFsMountProxyDrive::DoRequestL(CFsRequest* aRequest) { return LocalDrives::MountProxyDrive(aRequest);