TYPE_OF_OPEN xixfs_DecodeFileObject( IN PFILE_OBJECT pFileObject, OUT PXIXFS_FCB *ppFCB, OUT PXIXFS_CCB *ppCCB ) { TYPE_OF_OPEN TypeOfOpen; PAGED_CODE(); DebugTrace(DEBUG_LEVEL_TRACE, (DEBUG_TARGET_DIRINFO|DEBUG_TARGET_FCB|DEBUG_TARGET_FILEINFO), ("Enter xixfs_DecodeFileObject\n")); TypeOfOpen = (TYPE_OF_OPEN)XIXCORE_MASK_FLAGS((ULONG_PTR)pFileObject->FsContext2, TYPE_OF_OPEN_MASK); if(TypeOfOpen == UnopenedFileObject){ *ppFCB = NULL; *ppCCB = NULL; }else{ *ppFCB = pFileObject->FsContext; *ppCCB = pFileObject->FsContext2; XIXCORE_CLEAR_FLAGS((ULONG_PTR)*ppCCB, TYPE_OF_OPEN_MASK); } DebugTrace(DEBUG_LEVEL_TRACE, (DEBUG_TARGET_DIRINFO|DEBUG_TARGET_FCB|DEBUG_TARGET_FILEINFO), ("Eixt xixfs_DecodeFileObject\n")); return TypeOfOpen; }
NTSTATUS xixfs_QueryFsAttributeInfo( IN PXIXFS_IRPCONTEXT pIrpContext, IN PXIXFS_VCB pVcb, IN PFILE_FS_ATTRIBUTE_INFORMATION Buffer, IN uint32 Length, IN OUT uint32 *ByteToReturn ) { uint32 FileSystemAttribute = 0; uint32 ByteToCopy = 0; NTSTATUS RC = STATUS_SUCCESS; PAGED_CODE(); DebugTrace(DEBUG_LEVEL_TRACE, (DEBUG_TARGET_VOLINFO|DEBUG_TARGET_IRPCONTEXT), ("Enter xixfs_QueryFsAttributeInfo \n")); if(Length < sizeof(FILE_FS_ATTRIBUTE_INFORMATION)){ *ByteToReturn = 0; return STATUS_INVALID_PARAMETER; } Length -= FIELD_OFFSET( FILE_FS_ATTRIBUTE_INFORMATION, FileSystemName ); XIXCORE_CLEAR_FLAGS(Length, 1); if(Length >= 10){ ByteToCopy = 10; } else { ByteToCopy = Length; RC = STATUS_BUFFER_OVERFLOW; } FileSystemAttribute = (FILE_CASE_SENSITIVE_SEARCH | FILE_CASE_PRESERVED_NAMES | FILE_UNICODE_ON_DISK ); // Added by ILGU HONG for readonly 09082006 if(pVcb->XixcoreVcb.IsVolumeWriteProtected){ FileSystemAttribute |= FILE_READ_ONLY_VOLUME; } // Added by ILGU HONG for readonly end Buffer->FileSystemAttributes = FileSystemAttribute; Buffer->MaximumComponentNameLength = XIFS_MAX_NAME_LEN; Buffer->FileSystemNameLength = ByteToCopy; RtlCopyMemory(Buffer->FileSystemName, L"XIXFS", Buffer->FileSystemNameLength); *ByteToReturn = ((FIELD_OFFSET( FILE_FS_ATTRIBUTE_INFORMATION, FileSystemName ) + 3 + Buffer->FileSystemNameLength)/4)*4; DebugTrace(DEBUG_LEVEL_TRACE, (DEBUG_TARGET_VOLINFO|DEBUG_TARGET_IRPCONTEXT), ("Exit xixfs_QueryFsAttributeInfo \n")); return RC; }
NTSTATUS xixfs_QueryFsDeviceInfo( IN PXIXFS_IRPCONTEXT pIrpContext, IN PXIXFS_VCB pVcb, IN PFILE_FS_DEVICE_INFORMATION Buffer, IN uint32 Length, IN OUT uint32 *ByteToReturn ) { PAGED_CODE(); DebugTrace(DEBUG_LEVEL_TRACE, (DEBUG_TARGET_VOLINFO|DEBUG_TARGET_IRPCONTEXT), ("Enter xixfs_QueryFsDeviceInfo \n")); if(Length < sizeof(FILE_FS_DEVICE_INFORMATION)){ *ByteToReturn = 0; return STATUS_INVALID_PARAMETER; } Buffer->DeviceType = FILE_DEVICE_DISK; Buffer->Characteristics = pVcb->TargetDeviceObject->Characteristics; // Added by ILGU HONG for readonly 09052006 if(pVcb->XixcoreVcb.IsVolumeWriteProtected){ XIXCORE_SET_FLAGS(Buffer->Characteristics, FILE_READ_ONLY_DEVICE); }else{ XIXCORE_CLEAR_FLAGS(Buffer->Characteristics, FILE_READ_ONLY_DEVICE); } // Added by ILGU HONG for readonly end *ByteToReturn = sizeof(FILE_FS_DEVICE_INFORMATION); DebugTrace(DEBUG_LEVEL_TRACE, (DEBUG_TARGET_VOLINFO|DEBUG_TARGET_IRPCONTEXT), ("Exit xixfs_QueryFsDeviceInfo \n")); return STATUS_SUCCESS; }
int xixfs_ResourceThreadFunction( void *lpParameter ) { PXIXFS_LINUX_VCB pVCB = NULL; PXIXFS_LINUX_META_CTX pCtx = NULL; PXIXCORE_META_CTX xixcoreCtx = NULL; int RC =0; #if LINUX_VERSION_25_ABOVE int TimeOut; #endif unsigned long flags; DebugTrace(DEBUG_LEVEL_TRACE, (DEBUG_TARGET_FSCTL|DEBUG_TARGET_VOLINFO ), ("Enter xixfs_ResourceThreadFunction .\n")); #if defined(NDAS_ORG2423) || defined(NDAS_SIGPENDING_OLD) spin_lock_irqsave(¤t->sigmask_lock, flags); siginitsetinv(¤t->blocked, sigmask(SIGKILL)|sigmask(SIGTERM)); recalc_sigpending(current); spin_unlock_irqrestore(¤t->sigmask_lock, flags); #else spin_lock_irqsave(¤t->sighand->siglock, flags); siginitsetinv(¤t->blocked, sigmask(SIGKILL)|sigmask(SIGTERM)); recalc_sigpending(); spin_unlock_irqrestore(¤t->sighand->siglock, flags); #endif #if LINUX_VERSION_25_ABOVE daemonize("XixMetaThread"); #else daemonize(); #endif pCtx = (PXIXFS_LINUX_META_CTX)lpParameter; XIXCORE_ASSERT(pCtx); pVCB = pCtx->VCBCtx; XIXFS_ASSERT_VCB(pVCB); xixcoreCtx = &pVCB->XixcoreVcb.MetaContext; while(1){ if(signal_pending(current)) { flush_signals(current); } #if LINUX_VERSION_25_ABOVE TimeOut = DEFAULT_XIXFS_UPDATEWAIT; RC = wait_event_timeout(pCtx->VCBMetaEvent, XIXCORE_TEST_FLAGS(xixcoreCtx->VCBMetaFlags, XIXCORE_META_FLAGS_MASK), TimeOut); #else mod_timer(&(pCtx->VCBMetaTimeOut), jiffies+ 180*HZ); wait_event(pCtx->VCBMetaEvent, XIXCORE_TEST_FLAGS(xixcoreCtx->VCBMetaFlags, XIXCORE_META_FLAGS_MASK)); #endif DebugTrace(DEBUG_LEVEL_TRACE, (DEBUG_TARGET_FSCTL|DEBUG_TARGET_VOLINFO ), ("!!!!! Wake up HELLOE ResourceThreadFunction .\n")); //printk(KERN_DEBUG "!!!!! Wake UP HELLOE ResourceThreadFunction .\n"); spin_lock(&(pCtx->MetaLock)); //DebugTrace(DEBUG_LEVEL_TRACE, DEBUG_TARGET_CHECK, // ("spin_lock(&(pCtx->MetaLock)) pCtx(%p)\n", pCtx )); #if LINUX_VERSION_25_ABOVE if(RC == 0 ) { #else if(XIXCORE_TEST_FLAGS(xixcoreCtx->VCBMetaFlags, XIXCORE_META_FLAGS_TIMEOUT)) { XIXCORE_CLEAR_FLAGS(xixcoreCtx->VCBMetaFlags, XIXCORE_META_FLAGS_TIMEOUT); #endif DebugTrace(DEBUG_LEVEL_ALL, (DEBUG_TARGET_FSCTL|DEBUG_TARGET_VOLINFO |DEBUG_TARGET_ALL), ("Request Call timeout : xixfs_ResourceThreadFunction .\n")); spin_unlock(&(pCtx->MetaLock)); //DebugTrace(DEBUG_LEVEL_TRACE, DEBUG_TARGET_CHECK, // ("spin_unlock(&(pCtx->MetaLock)) pCtx(%p)\n", pCtx )); if(XIXCORE_TEST_FLAGS(xixcoreCtx->ResourceFlag, XIXCORE_META_RESOURCE_NEED_UPDATE)){ XIXCORE_CLEAR_FLAGS(xixcoreCtx->ResourceFlag, XIXCORE_META_RESOURCE_NEED_UPDATE); RC = xixfs_UpdateMetaData(pCtx); if( RC <0 ) { DebugTrace(DEBUG_LEVEL_ALL, (DEBUG_TARGET_FSCTL|DEBUG_TARGET_VOLINFO |DEBUG_TARGET_ALL), ("fail(0x%x) xixfs_ResourceThreadFunction --> xixfs_UpdateMetaData .\n", RC)); } } #if LINUX_VERSION_25_ABOVE continue; }else if(XIXCORE_TEST_FLAGS(xixcoreCtx->VCBMetaFlags, XIXCORE_META_FLAGS_UPDATE)) { #else } if(XIXCORE_TEST_FLAGS(xixcoreCtx->VCBMetaFlags, XIXCORE_META_FLAGS_UPDATE)) { #endif XIXCORE_CLEAR_FLAGS(xixcoreCtx->VCBMetaFlags, XIXCORE_META_FLAGS_UPDATE); spin_unlock(&(pCtx->MetaLock)); //DebugTrace(DEBUG_LEVEL_TRACE, DEBUG_TARGET_CHECK, // ("spin_unlock(&(pCtx->MetaLock)) pCtx(%p)\n", pCtx )); if(XIXCORE_TEST_FLAGS(xixcoreCtx->ResourceFlag, XIXCORE_META_RESOURCE_NEED_UPDATE)){ XIXCORE_CLEAR_FLAGS(xixcoreCtx->ResourceFlag, XIXCORE_META_RESOURCE_NEED_UPDATE); RC = xixfs_UpdateMetaData(pCtx); if( RC <0 ) { DebugTrace(DEBUG_LEVEL_ALL, (DEBUG_TARGET_FSCTL|DEBUG_TARGET_VOLINFO |DEBUG_TARGET_ALL), ("fail(0x%x) xixfs_ResourceThreadFunction --> xixfs_UpdateMetaData .\n", RC)); } } xixfs_wakeup_resource_waiter(pCtx); continue; }else if(XIXCORE_TEST_FLAGS(xixcoreCtx->VCBMetaFlags, XIXCORE_META_FLAGS_KILL_THREAD)) { XIXCORE_CLEAR_FLAGS(xixcoreCtx->VCBMetaFlags, XIXCORE_META_FLAGS_RECHECK_RESOURCES); XIXCORE_SET_FLAGS(xixcoreCtx->VCBMetaFlags, XIXCORE_META_FLAGS_INSUFFICIENT_RESOURCES); spin_unlock(&(pCtx->MetaLock)); //DebugTrace(DEBUG_LEVEL_TRACE, DEBUG_TARGET_CHECK, // ("spin_unlock(&(pCtx->MetaLock)) pCtx(%p)\n", pCtx )); DebugTrace(DEBUG_LEVEL_ALL, (DEBUG_TARGET_FSCTL|DEBUG_TARGET_VOLINFO |DEBUG_TARGET_ALL), ("Stop Thread : xixfs_ResourceThreadFunction .\n")); xixfs_wakeup_resource_waiter(pCtx); #if LINUX_VERSION_25_ABOVE complete_all(&(pCtx->VCBMetaThreadStopCompletion)); #else del_timer(&(pCtx->VCBMetaTimeOut)); xixfs_wakeup_metaThread_stop_waiter(pCtx); #endif break; }else if( XIXCORE_TEST_FLAGS(xixcoreCtx->VCBMetaFlags, XIXCORE_META_FLAGS_RECHECK_RESOURCES)){ spin_unlock(&(pCtx->MetaLock)); //DebugTrace(DEBUG_LEVEL_TRACE, DEBUG_TARGET_CHECK, // ("spin_unlock(&(pCtx->MetaLock)) pCtx(%p)\n", pCtx )); DebugTrace(DEBUG_LEVEL_ALL, (DEBUG_TARGET_FSCTL|DEBUG_TARGET_VOLINFO |DEBUG_TARGET_ALL), ("get more resource : xixfs_ResourceThreadFunction .\n")); RC = xixfs_GetMoreCheckOutLotMap(pCtx); DebugTrace(DEBUG_LEVEL_ALL, (DEBUG_TARGET_FSCTL|DEBUG_TARGET_VOLINFO |DEBUG_TARGET_ALL), ("End xixfs_GetMoreCheckOutLotMap .\n")); if( RC <0 ) { DebugTrace(DEBUG_LEVEL_ALL, (DEBUG_TARGET_FSCTL|DEBUG_TARGET_VOLINFO |DEBUG_TARGET_ALL), ("fail(0x%x) xixfs_ResourceThreadFunction --> xixfs_GetMoreCheckOutLotMap .\n", RC)); }else { spin_lock(&(pCtx->MetaLock)); //DebugTrace(DEBUG_LEVEL_TRACE, DEBUG_TARGET_CHECK, // ("spin_lock(&(pCtx->MetaLock)) pCtx(%p)\n", pCtx )); XIXCORE_CLEAR_FLAGS(xixcoreCtx->VCBMetaFlags, XIXCORE_META_FLAGS_RECHECK_RESOURCES); spin_unlock(&(pCtx->MetaLock)); //DebugTrace(DEBUG_LEVEL_TRACE, DEBUG_TARGET_CHECK, // ("spin_unlock(&(pCtx->MetaLock)) pCtx(%p)\n", pCtx )); DebugTrace(DEBUG_LEVEL_ALL, (DEBUG_TARGET_FSCTL|DEBUG_TARGET_VOLINFO |DEBUG_TARGET_ALL), ("WAKE UP WAITING THREAD!! .\n")); xixfs_wakeup_resource_waiter(pCtx); } continue; }else { DebugTrace(DEBUG_LEVEL_ALL, (DEBUG_TARGET_FSCTL|DEBUG_TARGET_VOLINFO |DEBUG_TARGET_ALL), ("Request Call Unrecognized : xixfs_ResourceThreadFunction .\n")); spin_unlock(&(pCtx->MetaLock)); //DebugTrace(DEBUG_LEVEL_TRACE, DEBUG_TARGET_CHECK, // ("spin_unlock(&(pCtx->MetaLock)) pCtx(%p)\n", pCtx )); } } DebugTrace(DEBUG_LEVEL_TRACE, (DEBUG_TARGET_FSCTL|DEBUG_TARGET_VOLINFO ), ("Exit xixfs_ResourceThreadFunction .\n")); return 0; }
VOID xixfs_CleanupFlushVCB( IN PXIXFS_IRPCONTEXT pIrpContext, IN PXIXFS_VCB pVCB, IN BOOLEAN DisMountVCB ) { //PAGED_CODE(); ASSERT_IRPCONTEXT( pIrpContext ); ASSERT_VCB( pVCB ); ASSERT_EXCLUSIVE_XIFS_GDATA; ASSERT_EXCLUSIVE_VCB(pVCB); DebugTrace(DEBUG_LEVEL_INFO, (DEBUG_TARGET_PNP| DEBUG_TARGET_VCB| DEBUG_TARGET_IRPCONTEXT), ("xixfs_CleanupFlushVCB Status(%ld).\n", pVCB->VCBState)); DebugTrace(DEBUG_LEVEL_INFO, (DEBUG_TARGET_PNP| DEBUG_TARGET_VCB| DEBUG_TARGET_IRPCONTEXT), ("11 Current VCB->PtrVPB->ReferenceCount %d \n", pVCB->PtrVPB->ReferenceCount)); XifsdLockVcb( pIrpContext, pVCB ); XIXCORE_SET_FLAGS(pVCB->VCBFlags, XIFSD_VCB_FLAGS_DEFERED_CLOSE); if(DisMountVCB){ if(pVCB->VolumeDasdFCB != NULL){ pVCB->VolumeDasdFCB->FCBReference -= 1; pVCB->VolumeDasdFCB->FCBUserReference -= 1; } if(pVCB->MetaFCB != NULL){ pVCB->MetaFCB->FCBReference -=1; pVCB->MetaFCB->FCBUserReference -= 1; } if(pVCB->RootDirFCB != NULL){ pVCB->RootDirFCB->FCBReference -=1; pVCB->RootDirFCB->FCBUserReference -= 1; } } XifsdUnlockVcb(pIrpContext, pVCB); xixfs_PurgeVolume(pIrpContext, pVCB, DisMountVCB); DebugTrace(DEBUG_LEVEL_INFO, (DEBUG_TARGET_PNP| DEBUG_TARGET_VCB| DEBUG_TARGET_IRPCONTEXT), ("22 Current VCB->PtrVPB->ReferenceCount %d \n", pVCB->PtrVPB->ReferenceCount)); if(DisMountVCB){ // Added by ILGU HONG XifsdReleaseVcb(TRUE, pVCB); DebugTrace(DEBUG_LEVEL_INFO, (DEBUG_TARGET_FSCTL|DEBUG_TARGET_VOLINFO ), ("VCB %d/%d \n", pVCB->VCBReference, pVCB->VCBUserReference)); CcWaitForCurrentLazyWriterActivity(); XifsdAcquireVcbExclusive(TRUE, pVCB, FALSE); xixfs_RealCloseFCB((PVOID)pVCB); } XifsdLockVcb( pIrpContext, pVCB ); XIXCORE_CLEAR_FLAGS(pVCB->VCBFlags, XIFSD_VCB_FLAGS_DEFERED_CLOSE); XifsdUnlockVcb(pIrpContext, pVCB); // Added by ILGU HONG END if(DisMountVCB){ // changed by ILGU HONG for readonly 09052006 if(!pVCB->XixcoreVcb.IsVolumeWriteProtected){ LARGE_INTEGER TimeOut; // // Stop Meta Update process // KeSetEvent(&pVCB->VCBUmountEvent, 0, FALSE); TimeOut.QuadPart = - DEFAULT_XIFS_UMOUNTWAIT; KeWaitForSingleObject(&pVCB->VCBStopOkEvent, Executive, KernelMode, FALSE, &TimeOut); xixcore_DeregisterHost(&pVCB->XixcoreVcb); // Added by ILGU HONG for 08312006 if(pVCB->NdasVolBacl_Id){ xixfs_RemoveUserBacl(pVCB->TargetDeviceObject, pVCB->NdasVolBacl_Id); } // Added by ILGU HONG End } // changed by ILGU HONG for readonly end } return; }