BOOLEAN xixfs_IHaveLotLock( IN uint8 * HostMac, IN uint64 LotNumber, IN uint8 * VolumeId ) { NTSTATUS RC = STATUS_UNSUCCESSFUL; PXIXFSDG_PKT pPacket = NULL; PXIXFS_LOCK_BROADCAST pPacketData = NULL; uint8 DstAddress[6] ={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; //PAGED_CODE(); DebugTrace(DEBUG_LEVEL_TRACE, (DEBUG_TARGET_RESOURCE| DEBUG_TARGET_FCB|DEBUG_TARGET_LOCK), ("Enter xixfs_IHaveLotLock \n")); // Changed by ILGU HONG // chesung suggest /* if(FALSE ==xixfs_AllocDGPkt(&pPacket, HostMac, DstAddress, XIXFS_TYPE_LOCK_BROADCAST)) { return FALSE; } */ if(FALSE ==xixfs_AllocDGPkt(&pPacket, HostMac, NULL, XIXFS_TYPE_LOCK_BROADCAST)) { return FALSE; } pPacketData = &(pPacket->RawDataDG.LockBroadcast); // Changed by ILGU HONG RtlCopyMemory(pPacketData->VolumeId, VolumeId, 16); pPacketData->LotNumber = HTONLL(LotNumber); pPacket->TimeOut.QuadPart = xixcore_GetCurrentTime64() + DEFAULT_REQUEST_MAX_TIMEOUT; ExAcquireFastMutexUnsafe(&XiGlobalData.XifsComCtx.SendPktListMutex); InsertTailList(&(XiGlobalData.XifsComCtx.SendPktList), &(pPacket->PktListEntry) ); ExReleaseFastMutexUnsafe(&XiGlobalData.XifsComCtx.SendPktListMutex); KeSetEvent(&(XiGlobalData.XifsComCtx.CliSendDataEvent),0, FALSE); DebugTrace(DEBUG_LEVEL_TRACE, (DEBUG_TARGET_RESOURCE| DEBUG_TARGET_FCB|DEBUG_TARGET_LOCK), ("Exit xixfs_IHaveLotLock \n")); return TRUE; }
int xixcore_call xixcore_HaveLotLock( uint8 * HostMac, uint8 * LockOwnerMac, uint64 LotNumber, uint8 * VolumeId, uint8 * LockOwnerId ) { // Request LotLock state to Lock Owner int RC = 0; PXIXFSDG_PKT pPacket = NULL; PXIXFS_LOCK_REQUEST pPacketData = NULL; int waitStatus = LOCK_INVALID; DECLARE_COMPLETION(wait); DebugTrace(DEBUG_LEVEL_TRACE, (DEBUG_TARGET_RESOURCE| DEBUG_TARGET_FCB|DEBUG_TARGET_LOCK), ("Enter xixfs_AreYouHaveLotLock \n")); RC = xixfs_AllocDGPkt( &pPacket, HostMac, LockOwnerMac, XIXFS_TYPE_LOCK_REQUEST ) ; if(RC < 0 ) { DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("Error (0x%x) xixfs_AreYouHaveLotLock:xixfs_AllocDGPkt \n", RC)); return RC; } // Changed by ILGU HONG // chesung suggest DebugTrace(DEBUG_LEVEL_INFO, (DEBUG_TARGET_RESOURCE| DEBUG_TARGET_FCB|DEBUG_TARGET_LOCK), ("Packet Dest Info [0x%02x:%02x:%02x:%02x:%02x:%02x]\n", LockOwnerMac[26], LockOwnerMac[27], LockOwnerMac[28], LockOwnerMac[29], LockOwnerMac[30], LockOwnerMac[31])); pPacketData = &(pPacket->RawDataDG.LockReq); memcpy(pPacketData->LotOwnerID, LockOwnerId, 6); // Changed by ILGU HONG // chesung suggest memcpy(pPacketData->VolumeId, VolumeId, 16); memcpy(pPacketData->LotOwnerMac, LockOwnerMac, 32); pPacketData->LotNumber = XI_HTONLL(LotNumber); pPacketData->PacketNumber = XI_HTONL(atomic_read(&(xixfs_linux_global.EventCtx.PacketNumber))); atomic_inc(&(xixfs_linux_global.EventCtx.PacketNumber)); pPacket->TimeOut = xixcore_GetCurrentTime64()+ DEFAULT_REQUEST_MAX_TIMEOUT; pPacket->PkCtl.PktCompletion = &wait; pPacket->PkCtl.status=&waitStatus; printk(KERN_DEBUG "WAIT lock request\n"); xixfs_Pkt_add_sendqueue( &xixfs_linux_global.EventCtx, pPacket ); wait_for_completion(&wait); printk(KERN_DEBUG "END WAIT lock request\n"); if(waitStatus == LOCK_OWNED_BY_OWNER){ DebugTrace(DEBUG_LEVEL_CRITICAL, (DEBUG_TARGET_RESOURCE| DEBUG_TARGET_FCB|DEBUG_TARGET_LOCK), ("Exit xixfs_AreYouHaveLotLock Lock is realy acquired by other \n")); return 1; }else{ DebugTrace(DEBUG_LEVEL_CRITICAL, (DEBUG_TARGET_RESOURCE| DEBUG_TARGET_FCB|DEBUG_TARGET_LOCK), ("Exit XifsdAreYouHaveLotLock Lock is status(0x%x) \n", waitStatus)); return 0; } }
NTSTATUS xixfs_SendRenameLinkBC( IN BOOLEAN Wait, IN uint32 SubCommand, IN uint8 * HostMac, IN uint64 LotNumber, IN uint8 * VolumeId, IN uint64 OldParentLotNumber, IN uint64 NewParentLotNumber ) { NTSTATUS RC = STATUS_UNSUCCESSFUL; PXIXFSDG_PKT pPacket = NULL; PXIXFS_FILE_CHANGE_BROADCAST pPacketData = NULL; XIFS_LOCK_CONTROL LockControl; uint8 DstAddress[6] ={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; DebugTrace(DEBUG_LEVEL_TRACE, (DEBUG_TARGET_RESOURCE| DEBUG_TARGET_FCB|DEBUG_TARGET_LOCK), ("Enter XifsdSendRenameLinkBC \n")); ASSERT(Wait); // Changed by ILGU HONG // chesung suggest /* if(FALSE ==xixfs_AllocDGPkt(&pPacket, HostMac, DstAddress, XIXFS_TYPE_FILE_CHANGE)) { return FALSE; } */ if(FALSE ==xixfs_AllocDGPkt(&pPacket, HostMac, NULL, XIXFS_TYPE_FILE_CHANGE)) { return FALSE; } pPacketData = &(pPacket->RawDataDG.FileChangeReq); // Changed by ILGU HONG RtlCopyMemory(pPacketData->VolumeId, VolumeId, 16); pPacketData->LotNumber = HTONLL(LotNumber); pPacketData->PrevParentLotNumber = HTONLL(OldParentLotNumber); pPacketData->NewParentLotNumber = HTONLL(NewParentLotNumber); pPacketData->SubCommand =HTONL(SubCommand); pPacket->TimeOut.QuadPart = xixcore_GetCurrentTime64() + DEFAULT_REQUEST_MAX_TIMEOUT; ExAcquireFastMutexUnsafe(&XiGlobalData.XifsComCtx.SendPktListMutex); InsertTailList(&(XiGlobalData.XifsComCtx.SendPktList), &(pPacket->PktListEntry) ); ExReleaseFastMutexUnsafe(&XiGlobalData.XifsComCtx.SendPktListMutex); KeSetEvent(&(XiGlobalData.XifsComCtx.CliSendDataEvent),0, FALSE); DebugTrace(DEBUG_LEVEL_TRACE, (DEBUG_TARGET_RESOURCE| DEBUG_TARGET_FCB|DEBUG_TARGET_LOCK), ("Exit XifsdSendRenameLinkBC \n")); return STATUS_SUCCESS; }
NTSTATUS xixfs_SendFileChangeRC( IN BOOLEAN Wait, IN uint8 * HostMac, IN uint64 LotNumber, IN uint8 * VolumeId, IN uint64 FileLength, IN uint64 AllocationLength, IN uint64 UpdateStartOffset ) { NTSTATUS RC = STATUS_UNSUCCESSFUL; PXIXFSDG_PKT pPacket = NULL; PXIXFS_FILE_LENGTH_CHANGE_BROADCAST pPacketData = NULL; uint8 DstAddress[6] ={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; DebugTrace(DEBUG_LEVEL_TRACE, (DEBUG_TARGET_RESOURCE| DEBUG_TARGET_FCB|DEBUG_TARGET_LOCK), ("Enter xixfs_SendFileChangeRC \n")); ASSERT(Wait); // Changed by ILGU HONG // chesung suggest /* if(FALSE ==xixfs_AllocDGPkt(&pPacket, HostMac, DstAddress, XIXFS_TYPE_FILE_LENGTH_CHANGE)) { return FALSE; } */ if(FALSE ==xixfs_AllocDGPkt(&pPacket, HostMac, DstAddress, XIXFS_TYPE_FILE_LENGTH_CHANGE)) { return FALSE; } pPacketData = &(pPacket->RawDataDG.FileLenChangeReq); // Changed by ILGU HONG RtlCopyMemory(pPacketData->VolumeId, VolumeId, 16); pPacketData->LotNumber = HTONLL(LotNumber); pPacketData->FileLength = HTONLL(FileLength); pPacketData->AllocationLength = HTONLL(AllocationLength); pPacketData->WriteStartOffset = HTONLL(UpdateStartOffset); pPacket->TimeOut.QuadPart = xixcore_GetCurrentTime64() + DEFAULT_REQUEST_MAX_TIMEOUT; ExAcquireFastMutexUnsafe(&XiGlobalData.XifsComCtx.SendPktListMutex); InsertTailList(&(XiGlobalData.XifsComCtx.SendPktList), &(pPacket->PktListEntry) ); ExReleaseFastMutexUnsafe(&XiGlobalData.XifsComCtx.SendPktListMutex); KeSetEvent(&(XiGlobalData.XifsComCtx.CliSendDataEvent),0, FALSE); DebugTrace(DEBUG_LEVEL_TRACE, (DEBUG_TARGET_RESOURCE| DEBUG_TARGET_FCB|DEBUG_TARGET_LOCK), ("Exit xixfs_SendFileChangeRC \n")); return STATUS_SUCCESS; }