int xixfs_GetMoreCheckOutLotMap( PXIXFS_LINUX_META_CTX pCtx ) { int RC = 0; PXIXFS_LINUX_VCB pVCB = NULL; PXIXCORE_BITMAP_EMUL_CONTEXT pDiskBitmapEmulCtx= NULL; PXIXCORE_LOT_MAP pTempFreeLotMap ; uint32 size = 0; uint32 BuffSize = 0; uint32 trycount = 0; PXIXCORE_META_CTX xixcoreCtx = NULL; XIXCORE_ASSERT(pCtx); pVCB = pCtx->VCBCtx; XIXFS_ASSERT_VCB(pVCB); xixcoreCtx = &pVCB->XixcoreVcb.MetaContext; pDiskBitmapEmulCtx = kmalloc(sizeof(XIXCORE_BITMAP_EMUL_CONTEXT), GFP_KERNEL); if(!pDiskBitmapEmulCtx) { DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("Fail xixfs_GetMoreCheckOutLotMap --> can't alloc bitmap emul ctx .\n")); return -1; } memset(pDiskBitmapEmulCtx, 0, sizeof(XIXCORE_BITMAP_EMUL_CONTEXT)); pTempFreeLotMap = kmalloc(sizeof(XIXCORE_LOT_MAP), GFP_KERNEL); if(!pTempFreeLotMap) { DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("Fail xixfs_GetMoreCheckOutLotMap --> can't alloc pTempFreeLotMap .\n")); kfree(pDiskBitmapEmulCtx); return -1; } memset(pDiskBitmapEmulCtx, 0, sizeof(XIXCORE_LOT_MAP)); DebugTrace(DEBUG_LEVEL_TRACE, (DEBUG_TARGET_FSCTL|DEBUG_TARGET_VOLINFO ), ("Enter xixfs_GetMoreCheckOutLotMap.\n")); retry: RC = xixcore_LotLock( &pVCB->XixcoreVcb, xixcoreCtx->HostRegLotMapIndex, &xixcoreCtx->HostRegLotMapLockStatus, 1, 1 ); if( RC <0 ){ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("Fail(0x%x)xixfs_GetMoreCheckOutLotMap --> xixfs_LotLock .\n", RC)); if(trycount > 3) { kfree(pDiskBitmapEmulCtx); kfree(pTempFreeLotMap); return RC; } trycount++; goto retry; } printk(KERN_DEBUG "Get HOT LOT LOCK \n"); // Zero Bit map context; memset(pDiskBitmapEmulCtx, 0, sizeof(XIXCORE_BITMAP_EMUL_CONTEXT)); // Read Disk Bitmap information RC = xixcore_InitializeBitmapContext( pDiskBitmapEmulCtx, &pVCB->XixcoreVcb, xixcoreCtx->HostCheckOutLotMapIndex, xixcoreCtx->FreeLotMapIndex, xixcoreCtx->CheckOutLotMapIndex ); if( RC < 0 ){ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("FAIL xixfs_GetMoreCheckOutLotMap --> xixfs_InitializeBitmapContext (0x%x) .\n", RC)); goto error_out; } memset(pTempFreeLotMap, 0, sizeof(XIXCORE_LOT_MAP)); size = SECTOR_ALIGNED_SIZE(pVCB->XixcoreVcb.SectorSizeBit, (uint32) ((pVCB->XixcoreVcb.NumLots + 7)/8 + sizeof(XIDISK_BITMAP_DATA) -1)); BuffSize = size*2; pTempFreeLotMap->Data = xixcore_AllocateBuffer(BuffSize); if(!pTempFreeLotMap->Data){ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("FAIL xixfs_GetMoreCheckOutLotMap -->Allocate TempFreeLotMap .\n")); RC =-ENOMEM; goto error_out; } memset(xixcore_GetDataBuffer(pTempFreeLotMap->Data),0, BuffSize); // Update Disk Free bitmap , dirty map and Checkout Bitmap from free Bitmap RC = xixcore_ReadDirmapFromBitmapContext(pDiskBitmapEmulCtx); if( RC < 0){ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("FAIL xixfs_GetMoreCheckOutLotMap --> xixfs_ReadDirmapFromBitmapContext (0x%x) .\n", RC)); goto error_out; } /* { uint32 i = 0; uint8 *Data; Data = xixcore_GetDataBufferOfBitMap(pDiskBitmapEmulCtx->UsedBitmap.Data); DebugTrace(DEBUG_LEVEL_INFO, DEBUG_TARGET_RESOURCE,("Host CheckOut BitMap \n")); for(i = 0; i<2; i++){ DebugTrace(DEBUG_LEVEL_INFO, DEBUG_TARGET_RESOURCE, ("<%i>[%02x]:[%02x]:[%02x]:[%02x]:[%02x]:[%02x]:[%02x]:[%02x]\n", i*8,Data[i*8],Data[i*8 +1],Data[i*8 +2],Data[i*8 +3], Data[i*8 +4],Data[i*8 +5],Data[i*8 +6],Data[i*8 +7])); } } */ RC = xixcore_ReadFreemapFromBitmapContext(pDiskBitmapEmulCtx); if( RC < 0){ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("FAIL xixfs_GetMoreCheckOutLotMap --> xixfs_ReadFreemapFromBitmapContext(0x%x) .\n", RC)); goto error_out; } /* { uint32 i = 0; uint8 * Data; Data = xixcore_GetDataBufferOfBitMap(pDiskBitmapEmulCtx->UnusedBitmap.Data); DebugTrace(DEBUG_LEVEL_INFO, DEBUG_TARGET_RESOURCE,("Disk Free Bitmap\n")); for(i = 0; i<2; i++){ DebugTrace(DEBUG_LEVEL_INFO, DEBUG_TARGET_RESOURCE, ("<%i>[%02x]:[%02x]:[%02x]:[%02x]:[%02x]:[%02x]:[%02x]:[%02x]\n", i*8,Data[i*8],Data[i*8 +1],Data[i*8 +2],Data[i*8 +3], Data[i*8 +4],Data[i*8 +5],Data[i*8 +6],Data[i*8 +7])); } } */ RC = xixcore_ReadCheckoutmapFromBitmapContext(pDiskBitmapEmulCtx); if( RC < 0){ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("FAIL xixfs_GetMoreCheckOutLotMap --> xixfs_ReadCheckoutmapFromBitmapContext(0x%x) .\n", RC)); goto error_out; } /* { uint32 i = 0; uint8 * Data; Data = xixcore_GetDataBufferOfBitMap(pDiskBitmapEmulCtx->CheckOutBitmap.Data); DebugTrace(DEBUG_LEVEL_INFO, DEBUG_TARGET_RESOURCE,("Disk CheckOut Bitmap\n")); for(i = 0; i<2; i++){ DebugTrace(DEBUG_LEVEL_INFO, DEBUG_TARGET_RESOURCE, ("<%i>[%02x]:[%02x]:[%02x]:[%02x]:[%02x]:[%02x]:[%02x]:[%02x]\n", i*8,Data[i*8],Data[i*8 +1],Data[i*8 +2],Data[i*8 +3], Data[i*8 +4],Data[i*8 +5],Data[i*8 +6],Data[i*8 +7])); } } */ // Get Real FreeMap without CheckOut xixcore_XORMap(&(pDiskBitmapEmulCtx->UnusedBitmap), &(pDiskBitmapEmulCtx->CheckOutBitmap)); /* { uint32 i = 0; uint8 * Data; Data = xixcore_GetDataBuffer(pDiskBitmapEmulCtx->UnusedBitmap.Data); DebugTrace(DEBUG_LEVEL_INFO, DEBUG_TARGET_RESOURCE,("Disk Real free Bitmap\n")); for(i = 0; i<2; i++){ DebugTrace(DEBUG_LEVEL_INFO, DEBUG_TARGET_RESOURCE, ("<%i>[%02x]:[%02x]:[%02x]:[%02x]:[%02x]:[%02x]:[%02x]:[%02x]\n", i*8,Data[i*8],Data[i*8 +1],Data[i*8 +2],Data[i*8 +3], Data[i*8 +4],Data[i*8 +5],Data[i*8 +6],Data[i*8 +7])); } } */ RC = xixcore_SetCheckOutLotMap((PXIXCORE_LOT_MAP)&pDiskBitmapEmulCtx->UnusedBitmap, pTempFreeLotMap, xixcoreCtx->HostRecordIndex + 1); if( RC < 0 ){ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("Fail SetCheckOutLotMap Status (0x%x) .\n", RC)); goto error_out; } /* { uint32 i = 0; uint8 *Data; Data = xixcore_GetDataBufferOfBitMap(pTempFreeLotMap->Data); DebugTrace(DEBUG_LEVEL_INFO, DEBUG_TARGET_RESOURCE,("Allocated Bit Map\n")); for(i = 0; i<2; i++){ DebugTrace(DEBUG_LEVEL_INFO, DEBUG_TARGET_RESOURCE, ("<%i>[%02x]:[%02x]:[%02x]:[%02x]:[%02x]:[%02x]:[%02x]:[%02x]\n", i*8,Data[i*8],Data[i*8 +1],Data[i*8 +2],Data[i*8 +3], Data[i*8 +4],Data[i*8 +5],Data[i*8 +6],Data[i*8 +7])); } } */ //Update Host CheckOutLotMap xixcore_ORMap(&(pDiskBitmapEmulCtx->UsedBitmap), pTempFreeLotMap); /* { uint32 i = 0; uint8 *Data; Data = xixcore_GetDataBufferOfBitMap(pDiskBitmapEmulCtx->UsedBitmap.Data); DebugTrace(DEBUG_LEVEL_INFO, DEBUG_TARGET_RESOURCE,("After Allocate Host Checkout Bitmap\n")); for(i = 0; i<2; i++){ DebugTrace(DEBUG_LEVEL_INFO, DEBUG_TARGET_RESOURCE, ("<%i>[%02x]:[%02x]:[%02x]:[%02x]:[%02x]:[%02x]:[%02x]:[%02x]\n", i*8,Data[i*8],Data[i*8 +1],Data[i*8 +2],Data[i*8 +3], Data[i*8 +4],Data[i*8 +5],Data[i*8 +6],Data[i*8 +7])); } } { uint32 i = 0; uint8 * Data; Data = xixcore_GetDataBufferOfBitMap(xixcoreCtx->HostFreeLotMap->Data); DebugTrace(DEBUG_LEVEL_INFO, DEBUG_TARGET_RESOURCE,("Before Allocate Host free Bitmap\n")); for(i = 0; i<2; i++){ DebugTrace(DEBUG_LEVEL_INFO, DEBUG_TARGET_RESOURCE, ("<%i>[%02x]:[%02x]:[%02x]:[%02x]:[%02x]:[%02x]:[%02x]:[%02x]\n", i*8,Data[i*8],Data[i*8 +1],Data[i*8 +2],Data[i*8 +3], Data[i*8 +4],Data[i*8 +5],Data[i*8 +6],Data[i*8 +7])); } } */ //Update Host FreeLotMap xixcore_ORMap(xixcoreCtx->HostFreeLotMap, pTempFreeLotMap); /* { uint32 i = 0; uint8 *Data; Data = xixcore_GetDataBufferOfBitMap(xixcoreCtx->HostFreeLotMap->Data); DebugTrace(DEBUG_LEVEL_INFO, DEBUG_TARGET_RESOURCE,("After Allocate Host free Bitmap\n")); for(i = 0; i<2; i++){ DebugTrace(DEBUG_LEVEL_INFO, DEBUG_TARGET_RESOURCE, ("<%i>[%02x]:[%02x]:[%02x]:[%02x]:[%02x]:[%02x]:[%02x]:[%02x]\n", i*8,Data[i*8],Data[i*8 +1],Data[i*8 +2],Data[i*8 +3], Data[i*8 +4],Data[i*8 +5],Data[i*8 +6],Data[i*8 +7])); } } */ //Update Disk CheckOut BitMap xixcore_ORMap(&(pDiskBitmapEmulCtx->CheckOutBitmap), pTempFreeLotMap); /* { uint32 i = 0; uint8 * Data; Data = xixcore_GetDataBufferOfBitMap(pDiskBitmapEmulCtx->CheckOutBitmap.Data); DebugTrace(DEBUG_LEVEL_INFO, DEBUG_TARGET_RESOURCE,("After Allocate Disk CheckOut Bitmap\n")); for(i = 0; i<2; i++){ DebugTrace(DEBUG_LEVEL_INFO, DEBUG_TARGET_RESOURCE, ("<%i>[%02x]:[%02x]:[%02x]:[%02x]:[%02x]:[%02x]:[%02x]:[%02x]\n", i*8,Data[i*8],Data[i*8 +1],Data[i*8 +2],Data[i*8 +3], Data[i*8 +4],Data[i*8 +5],Data[i*8 +6],Data[i*8 +7])); } } */ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("STEP 0 pDiskBitmapEmulCtx->BitmapLotHeader(%p)\n", pDiskBitmapEmulCtx->BitmapLotHeader)); // Added by ILGU HONG 2006 06 12 xixcoreCtx->VolumeFreeMap->BitMapBytes = pDiskBitmapEmulCtx->UnusedBitmap.BitMapBytes; xixcoreCtx->VolumeFreeMap->MapType = pDiskBitmapEmulCtx->UnusedBitmap.MapType; xixcoreCtx->VolumeFreeMap->NumLots = pDiskBitmapEmulCtx->UnusedBitmap.NumLots; /* memcpy(xixcore_GetDataBufferOfBitMap(pCtx->VolumeFreeMap->Data), xixcore_GetDataBufferOfBitMap(pDiskBitmapEmulCtx->UnusedBitmap.Data), pCtx->VolumeFreeMap->BitMapBytes ); */ // Added by ILGU HONG 2006 06 12 End DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("STEP 1 pDiskBitmapEmulCtx->BitmapLotHeader(%p)\n", pDiskBitmapEmulCtx->BitmapLotHeader)); // Update Disk Information RC = xixcore_WriteCheckoutmapFromBitmapContext(pDiskBitmapEmulCtx); DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("STEP 2 pDiskBitmapEmulCtx->BitmapLotHeader(%p)\n", pDiskBitmapEmulCtx->BitmapLotHeader)); if( RC < 0){ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("FAIL xixfs_GetMoreCheckOutLotMap --> xixfs_WriteCheckoutmapFromBitmapContext(0x%x) .\n", RC)); goto error_out; } // Update Host Record Information RC = xixcore_WriteDirmapFromBitmapContext(pDiskBitmapEmulCtx); DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("STEP 3 pDiskBitmapEmulCtx->BitmapLotHeader(%p)\n", pDiskBitmapEmulCtx->BitmapLotHeader)); if( RC < 0){ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("FAIL xixfs_GetMoreCheckOutLotMap --> xixfs_WriteDirmapFromBitmapContext(0x%x) .\n", RC)); goto error_out; } DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("STEP 4 pDiskBitmapEmulCtx->BitmapLotHeader(%p)\n", pDiskBitmapEmulCtx->BitmapLotHeader)); RC = xixcore_WriteBitMapWithBuffer( &pVCB->XixcoreVcb, xixcoreCtx->HostUsedLotMapIndex, xixcoreCtx->HostDirtyLotMap, pDiskBitmapEmulCtx->LotHeader, pDiskBitmapEmulCtx->BitmapLotHeader, 0 ); DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("STEP 5 pDiskBitmapEmulCtx->BitmapLotHeader(%p)\n", pDiskBitmapEmulCtx->BitmapLotHeader)); if( RC < 0){ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("FAIL xixfs_GetMoreCheckOutLotMap -->xixfs_WriteBitMapWithBuffer(0x%x) .\n", RC)); goto error_out; } RC = xixcore_WriteBitMapWithBuffer( &pVCB->XixcoreVcb, xixcoreCtx->HostUnUsedLotMapIndex, xixcoreCtx->HostFreeLotMap, pDiskBitmapEmulCtx->LotHeader, pDiskBitmapEmulCtx->BitmapLotHeader, 0 ); DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("STEP 6 pDiskBitmapEmulCtx->BitmapLotHeader(%p)\n", pDiskBitmapEmulCtx->BitmapLotHeader)); if( RC < 0){ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("FAIL xixfs_GetMoreCheckOutLotMap -->xixfs_WriteBitMapWithBuffer(0x%x) .\n", RC)); goto error_out; } error_out: xixcore_LotUnLock( &pVCB->XixcoreVcb, xixcoreCtx->HostRegLotMapIndex, &(xixcoreCtx->HostRegLotMapLockStatus) ); printk(KERN_DEBUG "Free HOT LOT LOCK \n"); if(pDiskBitmapEmulCtx) { xixcore_CleanupBitmapContext(pDiskBitmapEmulCtx); kfree(pDiskBitmapEmulCtx); } if(pTempFreeLotMap){ if(pTempFreeLotMap->Data){ xixcore_FreeBuffer(pTempFreeLotMap->Data); } kfree(pTempFreeLotMap); } DebugTrace(DEBUG_LEVEL_TRACE, (DEBUG_TARGET_FSCTL|DEBUG_TARGET_VOLINFO ), ("Exit XifsdGetMoreCheckOutLotMap Status (0x%x).\n", RC)); return RC; }
int xixfs_UpdateMetaData( PXIXFS_LINUX_META_CTX pCtx ) { int RC = 0; PXIX_BUF tmpBuf = NULL; PXIX_BUF tmpLotHeader = NULL; PXIXFS_LINUX_VCB pVCB = NULL; PXIXCORE_META_CTX xixcoreCtx; DebugTrace(DEBUG_LEVEL_TRACE, (DEBUG_TARGET_FSCTL|DEBUG_TARGET_VOLINFO ), ("Enter xixfs_UpdateMetaData .\n")); XIXCORE_ASSERT(pCtx); pVCB = pCtx->VCBCtx; XIXFS_ASSERT_VCB(pVCB); xixcoreCtx = &pVCB->XixcoreVcb.MetaContext; tmpBuf = (PXIX_BUF)xixcore_AllocateBuffer(XIDISK_DUP_LOT_MAP_INFO_SIZE); if(!tmpBuf) { DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("Fail allocate xbuf : xixfs_UpdateMetaData Host Dirty map .\n")); RC = - ENOMEM; return RC; } memset(xixcore_GetDataBuffer(&tmpBuf->xixcore_buffer), 0, XIDISK_DUP_LOT_MAP_INFO_SIZE); tmpLotHeader = (PXIX_BUF)xixcore_AllocateBuffer(XIDISK_DUP_COMMON_LOT_HEADER_SIZE); if(!tmpLotHeader) { DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("Fail allocate xbuf : xixfs_UpdateMetaData Host Dirty map .\n")); RC = - ENOMEM; goto error_out; } memset(xixcore_GetDataBuffer(&tmpLotHeader->xixcore_buffer), 0, XIDISK_DUP_COMMON_LOT_HEADER_SIZE); RC = xixcore_WriteBitMapWithBuffer(&pVCB->XixcoreVcb, xixcoreCtx->HostUsedLotMapIndex, xixcoreCtx->HostDirtyLotMap, &tmpLotHeader->xixcore_buffer, &tmpBuf->xixcore_buffer, 0); if( RC < 0 ){ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("Fail Status(0x%x) xixfs_UpdateMetaData--> xixfs_WriteBitMapWithBuffer Host Dirty map .\n", RC)); goto error_out; } memset(xixcore_GetDataBuffer(&tmpBuf->xixcore_buffer), 0, XIDISK_MAP_LOT_SIZE); RC = xixcore_WriteBitMapWithBuffer(&pVCB->XixcoreVcb, xixcoreCtx->HostUnUsedLotMapIndex, xixcoreCtx->HostFreeLotMap, &tmpLotHeader->xixcore_buffer, &tmpBuf->xixcore_buffer, 0); if(RC < 0){ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("Fail Status(0x%x) xixfs_UpdateMetaData--> xixfs_WriteBitMapWithBuffer Host Free map.\n", RC)); goto error_out; } error_out: if( tmpBuf ) { xixcore_FreeBuffer( &tmpBuf->xixcore_buffer); } if(tmpLotHeader) { xixcore_FreeBuffer(&tmpLotHeader->xixcore_buffer); } DebugTrace(DEBUG_LEVEL_TRACE, (DEBUG_TARGET_FSCTL|DEBUG_TARGET_VOLINFO ), ("Exit Status(0x%x) xixfs_UpdateMetaData .\n", RC)); return RC; }
int xixcore_call xixcore_CheckFileDirFromBitMapContext( PXIXCORE_VCB VCB, PXIXCORE_BITMAP_EMUL_CONTEXT BitmapEmulCtx ) { int RC = 0; PXIDISK_COMMON_LOT_HEADER pCommonLotHeader = NULL; PXIXCORE_LOT_MAP HostFreeMap = NULL; PXIXCORE_LOT_MAP HostDirtyMap = NULL; PXIXCORE_LOT_MAP HostCheckOutMap = NULL; xc_int64 SearchIndex = -1; PXIXCORE_BUFFER xbuf = NULL; PXIXCORE_BUFFER LotHeader = NULL; xc_uint32 Size = 0; int Reason = 0; DebugTrace(DEBUG_LEVEL_TRACE, (DEBUG_TARGET_FSCTL|DEBUG_TARGET_VOLINFO ), ("Enter xixcore_CheckFileDirFromBitMapContext .\n")); HostFreeMap = (PXIXCORE_LOT_MAP)&(BitmapEmulCtx->UnusedBitmap); HostDirtyMap = (PXIXCORE_LOT_MAP)&(BitmapEmulCtx->UsedBitmap); HostCheckOutMap = (PXIXCORE_LOT_MAP)&(BitmapEmulCtx->CheckOutBitmap); if(VCB->SectorSize > XIDISK_FILE_INFO_SIZE){ Size = VCB->SectorSize; }else{ Size = XIDISK_FILE_INFO_SIZE; } xbuf = xixcore_AllocateBuffer(XIDISK_DUP_FILE_INFO_SIZE); if(!xbuf) { DebugTrace(DEBUG_LEVEL_ALL, DEBUG_TARGET_ALL, ("Fail xixcore_CheckFileDirFromBitMapContext->Allocate xBuff\n")); return XCCODE_ENOMEM; } LotHeader = xixcore_AllocateBuffer(XIDISK_DUP_COMMON_LOT_HEADER_SIZE); if(!LotHeader) { xixcore_FreeBuffer(xbuf); DebugTrace(DEBUG_LEVEL_ALL, DEBUG_TARGET_ALL, ("Fail xixcore_CheckFileDirFromBitMapContext->Allocate xBuff\n")); return XCCODE_ENOMEM; } // Check Start with Host Dirty map while(1) { SearchIndex = xixcore_FindSetBit( VCB->NumLots, SearchIndex, xixcore_GetDataBufferOfBitMap(HostDirtyMap->Data) ); if((xc_uint64)SearchIndex >= VCB->NumLots){ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("Fail xixcore_CheckFileDirFromBitMapContext-->xixcore_FindSetBit End of Lot.\n")); break; } if(SearchIndex < 24){ continue; } DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("Searched Index (%lld).\n", SearchIndex)); xixcore_ZeroBufferOffset(LotHeader); memset(xixcore_GetDataBuffer(LotHeader), 0,XIDISK_DUP_COMMON_LOT_HEADER_SIZE); // Read Lot map info RC = xixcore_RawReadLotHeader( VCB->XixcoreBlockDevice, VCB->LotSize, VCB->SectorSize, VCB->SectorSizeBit, SearchIndex, LotHeader, &Reason ); if( RC < 0){ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("Fail(0x%x) (Reason %x)xixcore_CheckFileDirFromBitMapContext-->RawReadLot .\n", RC, Reason)); if(RC == XCCODE_CRCERROR){ pCommonLotHeader = (PXIDISK_COMMON_LOT_HEADER)xixcore_GetDataBufferWithOffset(LotHeader); goto invalidate_lot; }else{ goto error_out; } } // Check Lot map info pCommonLotHeader = (PXIDISK_COMMON_LOT_HEADER)xixcore_GetDataBufferWithOffset(LotHeader); DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("Lot (%lld) Type(0x%x) Flags(0x%x).\n", SearchIndex, pCommonLotHeader->LotInfo.Type, pCommonLotHeader->LotInfo.Flags)); if( (pCommonLotHeader->LotInfo.Type & (LOT_INFO_TYPE_INVALID|LOT_INFO_TYPE_FILE|LOT_INFO_TYPE_DIRECTORY)) && (pCommonLotHeader->LotInfo.LotSignature == VCB->VolumeLotSignature)) { if((pCommonLotHeader->LotInfo.Type == LOT_INFO_TYPE_INVALID) || (pCommonLotHeader->LotInfo.Flags == LOT_FLAG_INVALID )) { DebugTrace(DEBUG_LEVEL_ALL, DEBUG_TARGET_ALL, ("!!!!! Find Null bitmap information Lot %lld !!!!!!\n", SearchIndex)); xixcore_InitializeCommonLotHeader( pCommonLotHeader, VCB->VolumeLotSignature, LOT_INFO_TYPE_INVALID, LOT_FLAG_INVALID, SearchIndex, SearchIndex, 0, 0, 0, 0, 0 ); RC = xixcore_RawWriteLotHeader( VCB->XixcoreBlockDevice, VCB->LotSize, VCB->SectorSize, VCB->SectorSizeBit, SearchIndex, LotHeader, &Reason ); if( RC < 0){ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("Fail(0x%x) (Reason %x)xixcore_CheckFileDirFromBitMapContext-->WriteReadLot .\n", RC, Reason)); goto error_out; } // Update Lot map xixcore_ClearBit(SearchIndex, (unsigned long *)xixcore_GetDataBufferOfBitMap(HostDirtyMap->Data)); xixcore_SetBit(SearchIndex, (unsigned long *)xixcore_GetDataBufferOfBitMap(HostFreeMap->Data)); }else if((pCommonLotHeader->LotInfo.Type == LOT_INFO_TYPE_FILE) && (pCommonLotHeader->LotInfo.Flags == LOT_FLAG_BEGIN)){ PXIDISK_FILE_INFO pFileHeader; xc_uint32 i = 0; xc_uint32 AddrStartIndex = 0; xc_uint32 AddrSavedIndex = 0; xc_uint64 AdditionalAddrLot = 0; xc_uint32 bDelete = 0; xc_uint32 bStop = 0; xc_uint64 *Addr = NULL; xc_uint32 DefaultSecPerLotAddr = (xc_uint32)(VCB->AddrLotSize/sizeof(xc_uint64)); DebugTrace(DEBUG_LEVEL_ALL, DEBUG_TARGET_ALL, ("!!!!! Find a Valid Information Lot %lld !!!!!!\n", SearchIndex)); RC = xixcore_AuxLotLock( VCB, SearchIndex, 0, 0 ); if( RC < 0){ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("Fail(0x%x)xixcore_CheckFileDirFromBitMapContext--> xixcore_AuxLotLock .\n", RC)); continue; } xixcore_ZeroBufferOffset(xbuf); memset(xixcore_GetDataBuffer(xbuf), 0,XIDISK_DUP_FILE_INFO_SIZE); RC = xixcore_RawReadFileHeader( VCB->XixcoreBlockDevice, VCB->LotSize, VCB->SectorSize, VCB->SectorSizeBit, SearchIndex, xbuf, &Reason ); if( RC < 0){ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("Fail(0x%x) (Reason %x)xixcore_CheckFileDirFromBitMapContext-->xixcore_RawReadLotAndFileHeader .\n", RC, Reason)); xixcore_AuxLotUnLock( VCB, SearchIndex ); if(RC == XCCODE_CRCERROR){ pCommonLotHeader = (PXIDISK_COMMON_LOT_HEADER)xixcore_GetDataBufferWithOffset(LotHeader); goto invalidate_lot; }else{ goto error_out; } } AddrStartIndex = 0; i = 0; pFileHeader = (PXIDISK_FILE_INFO)xixcore_GetDataBufferWithOffset(xbuf); if(pFileHeader->State == XIFS_FD_STATE_DELETED){ bDelete = 1; } AdditionalAddrLot = pFileHeader->AddressMapIndex; do{ xixcore_ZeroBufferOffset(xbuf); memset(xixcore_GetDataBuffer(xbuf), 0,XIDISK_DUP_FILE_INFO_SIZE); RC = xixcore_RawReadAddressOfFile( VCB->XixcoreBlockDevice, VCB->LotSize, VCB->SectorSize, VCB->SectorSizeBit, SearchIndex, AdditionalAddrLot, VCB->AddrLotSize, &AddrSavedIndex, AddrStartIndex, xbuf, &Reason ); if( RC < 0){ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("Fail(0x%x) (Reason %x)xixcore_CheckFileDirFromBitMapContext-->xixcore_RawReadAddressOfFile .\n", RC, Reason)); bStop = 1; break; } Addr = (xc_uint64 *)xixcore_GetDataBufferWithOffset(xbuf); for(i = 0; i<DefaultSecPerLotAddr; i++){ if((Addr[i] != 0) && (Addr[i] >= 24) && (Addr[i] < VCB->NumLots)){ if(xixcore_TestBit(Addr[i] , (unsigned long *)xixcore_GetDataBufferOfBitMap(HostCheckOutMap->Data))){ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("Update Addr Info Lo(%lld)\n", Addr[i])); if(bDelete == 1){ xixcore_ClearBit(Addr[i], (unsigned long *)xixcore_GetDataBufferOfBitMap(HostDirtyMap->Data)); xixcore_SetBit(Addr[i], (unsigned long *)xixcore_GetDataBufferOfBitMap(HostFreeMap->Data)); }else{ xixcore_ClearBit(Addr[i], (unsigned long *)xixcore_GetDataBufferOfBitMap(HostFreeMap->Data)); xixcore_SetBit(Addr[i], (unsigned long *)xixcore_GetDataBufferOfBitMap(HostDirtyMap->Data)); } } }else{ bStop = 1; break; } } AddrStartIndex ++; }while(bStop == 0); xixcore_AuxLotUnLock( VCB, SearchIndex ); } }else{ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("Failed Lot (%lld) Type(0x%x) Flags(0x%x).\n", SearchIndex, pCommonLotHeader->LotInfo.Type, pCommonLotHeader->LotInfo.Flags)); if(pCommonLotHeader->LotInfo.LotSignature != VCB->VolumeLotSignature){ invalidate_lot: DebugTrace(DEBUG_LEVEL_ALL, DEBUG_TARGET_ALL, ("!!!!! Find a inaccurate bitmap information Lot %lld !!!!!!\n", SearchIndex)); xixcore_InitializeCommonLotHeader( pCommonLotHeader, VCB->VolumeLotSignature, LOT_INFO_TYPE_INVALID, LOT_FLAG_INVALID, SearchIndex, SearchIndex, 0, 0, 0, 0, 0 ); RC = xixcore_RawWriteLotHeader( VCB->XixcoreBlockDevice, VCB->LotSize, VCB->SectorSize, VCB->SectorSizeBit, SearchIndex, LotHeader, &Reason ); if( RC < 0){ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("Fail(0x%x) (Reason %x)xixcore_CheckFileDirFromBitMapContext-->xixcore_RawWriteLotHeader .\n", RC, Reason)); goto error_out; } xixcore_ClearBit(SearchIndex, (unsigned long *)xixcore_GetDataBufferOfBitMap(HostDirtyMap->Data)); xixcore_SetBit(SearchIndex, (unsigned long *)xixcore_GetDataBufferOfBitMap(HostFreeMap->Data)); } } } SearchIndex = -1; // Check Start with Host Free map while(1) { SearchIndex = xixcore_FindSetBit(VCB->NumLots, SearchIndex, xixcore_GetDataBufferOfBitMap(HostFreeMap->Data)); if((xc_uint64)SearchIndex >= VCB->NumLots){ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("Fail xixcore_CheckFileDirFromBitMapContext-->xixcore_FindSetBit End of Lot.\n")); break; } if(SearchIndex < 24){ continue; } DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("Searched Index (%lld).\n", SearchIndex)); xixcore_ZeroBufferOffset(LotHeader); memset(xixcore_GetDataBuffer(LotHeader), 0,XIDISK_DUP_COMMON_LOT_HEADER_SIZE); // Read Lot map info RC = xixcore_RawReadLotHeader( VCB->XixcoreBlockDevice, VCB->LotSize, VCB->SectorSize, VCB->SectorSizeBit, SearchIndex, LotHeader, &Reason ); if( RC < 0){ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("Fail(0x%x) (Reason %x)xixcore_CheckFileDirFromBitMapContext-->xixcore_RawReasdLotHeader .\n", RC, Reason)); if(RC == XCCODE_CRCERROR){ continue; }else{ goto error_out; } } pCommonLotHeader = (PXIDISK_COMMON_LOT_HEADER)xixcore_GetDataBufferWithOffset(LotHeader); // Check Lot map info if( pCommonLotHeader->LotInfo.Type & (LOT_INFO_TYPE_INVALID | LOT_INFO_TYPE_FILE | LOT_INFO_TYPE_DIRECTORY)) { if( (pCommonLotHeader->LotInfo.Type != LOT_INFO_TYPE_INVALID) && (pCommonLotHeader->LotInfo.Flags != LOT_FLAG_INVALID ) && (pCommonLotHeader->LotInfo.LotSignature == VCB->VolumeLotSignature)) { DebugTrace(DEBUG_LEVEL_ALL, DEBUG_TARGET_ALL, ("!!!!! Find a Used bitmap information Lot %lld !!!!!!\n", SearchIndex)); // Update Lot map xixcore_ClearBit(SearchIndex, (unsigned long *)xixcore_GetDataBufferOfBitMap(HostFreeMap->Data)); xixcore_SetBit(SearchIndex, (unsigned long *)xixcore_GetDataBufferOfBitMap(HostDirtyMap->Data)); } } } error_out: if(xbuf) { xixcore_FreeBuffer(xbuf); } if(LotHeader){ xixcore_FreeBuffer(LotHeader); } DebugTrace(DEBUG_LEVEL_TRACE, (DEBUG_TARGET_FSCTL|DEBUG_TARGET_VOLINFO ), ("Exit xixcore_CheckFileDirFromBitMapContext Status(0x%x).\n", RC)); return RC; }
NTSTATUS xixfs_QueryFsSizeInfo ( IN PXIXFS_IRPCONTEXT pIrpContext, IN PXIXFS_VCB pVcb, IN PFILE_FS_SIZE_INFORMATION Buffer, IN uint32 Length, IN OUT uint32 *ByteToReturn ) { PAGED_CODE(); DebugTrace(DEBUG_LEVEL_TRACE, (DEBUG_TARGET_VOLINFO|DEBUG_TARGET_IRPCONTEXT), ("Enter xixfs_QueryFsSizeInfo \n")); if(Length < sizeof(FILE_FS_SIZE_INFORMATION)){ *ByteToReturn = 0; return STATUS_INVALID_PARAMETER; } Buffer->TotalAllocationUnits.QuadPart = xixfs_GetLcnFromLot(pVcb->XixcoreVcb.LotSize, pVcb->XixcoreVcb.NumLots ); // changed by ILGU HONG for readonly 09052006 if(pVcb->XixcoreVcb.IsVolumeWriteProtected){ Buffer->AvailableAllocationUnits.QuadPart = ((pVcb->XixcoreVcb.LotSize/CLUSTER_SIZE)* pVcb->XixcoreVcb.NumLots); }else{ Buffer->AvailableAllocationUnits.QuadPart = ((pVcb->XixcoreVcb.LotSize/CLUSTER_SIZE)* xixcore_FindSetBitCount(pVcb->XixcoreVcb.NumLots, xixcore_GetDataBuffer(pVcb->XixcoreVcb.MetaContext.VolumeFreeMap->Data)) ); } // changed by ILGU HONG for readonly end Buffer->SectorsPerAllocationUnit = (CLUSTER_SIZE / pVcb->XixcoreVcb.SectorSize); Buffer->BytesPerSector = pVcb->XixcoreVcb.SectorSize; /* DbgPrint("1 NumLots(%I64d): TotalUnit(%I64d):AvailableUnit(%I64d):SecPerUnit(%ld):BytesPerSec(%ld)\n", pVcb->NumLots, Buffer->TotalAllocationUnits.QuadPart, Buffer->AvailableAllocationUnits.QuadPart, Buffer->SectorsPerAllocationUnit, Buffer->BytesPerSector); */ *ByteToReturn =(( sizeof(FILE_FS_SIZE_INFORMATION) + 7)/8)*8; DebugTrace(DEBUG_LEVEL_TRACE, (DEBUG_TARGET_VOLINFO|DEBUG_TARGET_IRPCONTEXT), ("Exit xixfs_QueryFsSizeInfo \n")); return STATUS_SUCCESS; }
int xixcore_call xixcore_CreateNewFile( PXIXCORE_VCB pVCB, PXIXCORE_FCB pDir, xc_uint32 bIsFile, xc_uint8 * Name, xc_uint32 NameLength, xc_uint32 FileAttribute, PXIXCORE_DIR_EMUL_CONTEXT DirContext, xc_uint64 *NewFileId ) { int RC = 0; PXIXCORE_BUFFER xbuf = NULL; PXIXCORE_BUFFER LotHeader = NULL; xc_int64 BeginingLotIndex = 0; xc_uint32 bLotAlloc = 0; xc_uint32 IsDirSet = 0; xc_uint32 ChildType = 0; xc_uint64 ChildIndex = 0; xc_int32 Reason = 0; PXIDISK_COMMON_LOT_HEADER pLotHeader = NULL; PXIDISK_FILE_INFO pFileInfo = NULL; PXIDISK_DIR_INFO pDirInfo = NULL; PXIDISK_ADDR_MAP pAddressMap = NULL; xc_uint32 AddrStartSectorIndex = 0; xc_uint64 EntryIndex = 0; DebugTrace(DEBUG_LEVEL_TRACE, (DEBUG_TARGET_DIRINFO|DEBUG_TARGET_FCB|DEBUG_TARGET_FILEINFO), ("Enter xixcore_CreateNewFile \n")); XIXCORE_ASSERT_FCB(pDir); XIXCORE_ASSERT_VCB(pVCB); // Changed by ILGU HONG for readonly 09052006 if(pVCB->IsVolumeWriteProtected){ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("ERROR xixcore_CreateNewFile : is read only .\n")); RC = XCCODE_EPERM; return RC; } // Changed by ILGU HONG for readonly end ChildType = (bIsFile)?(XIFS_FD_TYPE_FILE):(XIFS_FD_TYPE_DIRECTORY); if(NameLength > (XIFS_MAX_FILE_NAME_LENGTH * sizeof(xc_le16) )){ DebugTrace(DEBUG_LEVEL_INFO, (DEBUG_TARGET_DIRINFO|DEBUG_TARGET_FCB|DEBUG_TARGET_FILEINFO), ("FileNameLen(%d).\n", NameLength)); NameLength = XIFS_MAX_FILE_NAME_LENGTH * sizeof(xc_le16); } xbuf = xixcore_AllocateBuffer(XIDISK_DUP_FILE_INFO_SIZE); if(xbuf == NULL) { DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("ERROR xixcore_CreateNewFile : can't allocate xbuf .\n")); RC = XCCODE_ENOMEM; return RC; } LotHeader = xixcore_AllocateBuffer(XIDISK_DUP_COMMON_LOT_HEADER_SIZE); if(LotHeader == NULL) { xixcore_FreeBuffer(xbuf); DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("ERROR xixcore_CreateNewFile : can't allocate LotHeader .\n")); RC = XCCODE_ENOMEM; return RC; } RC = xixcore_FindDirEntry ( pVCB, pDir, (xc_uint8 *)Name, NameLength, DirContext, &EntryIndex, 1 ); if(RC >= 0){ RC = XCCODE_EPERM; goto error_out; } BeginingLotIndex = xixcore_AllocVCBLot(pVCB); if(BeginingLotIndex < 0 ){ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("ERROR xixcore_CreateNewFile : can't allocate lot.\n")); RC =XCCODE_ENOSPC; goto error_out; } bLotAlloc = 1; RC = xixcore_AddChildToDir( pVCB, pDir, BeginingLotIndex, ChildType, Name, NameLength, DirContext, &ChildIndex ); if( RC < 0 ){ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("ERROR(0x%x) xixcore_CreateNewFile : xixcore_AddChildToDir.\n", RC)); goto error_out; } IsDirSet =1; xixcore_ZeroBufferOffset(xbuf); memset(xixcore_GetDataBuffer(xbuf), 0,XIDISK_DUP_FILE_INFO_SIZE); xixcore_ZeroBufferOffset(LotHeader); memset(xixcore_GetDataBuffer(LotHeader), 0,XIDISK_DUP_COMMON_LOT_HEADER_SIZE); DebugTrace(DEBUG_LEVEL_INFO, (DEBUG_TARGET_DIRINFO|DEBUG_TARGET_FCB|DEBUG_TARGET_FILEINFO), ("Make File Info.\n")); RC = xixcore_RawReadLotHeader( pVCB->XixcoreBlockDevice, pVCB->LotSize, pVCB->SectorSize, pVCB->SectorSizeBit, BeginingLotIndex, LotHeader, &Reason ); if(RC < 0 ){ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("ERROR(0x%x) Reason(0x%x) xixcore_CreateNewFile : xixcore_RawWriteLotAndFileHeader.\n", RC, Reason)); if(RC == XCCODE_CRCERROR){ xixcore_ZeroBufferOffset(LotHeader); }else{ goto error_out; } } RC = xixcore_RawReadFileHeader( pVCB->XixcoreBlockDevice, pVCB->LotSize, pVCB->SectorSize, pVCB->SectorSizeBit, BeginingLotIndex, xbuf, &Reason ); if(RC < 0 ){ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("ERROR(0x%x) Reason(0x%x) xixcore_CreateNewFile : xixcore_RawWriteFileHeader.\n", RC, Reason)); if(RC == XCCODE_CRCERROR){ xixcore_ZeroBufferOffset(xbuf); }else{ goto error_out; } } if(ChildType == XIFS_FD_TYPE_FILE){ pFileInfo = (PXIDISK_FILE_INFO)xixcore_GetDataBufferWithOffset(xbuf); pLotHeader = (PXIDISK_COMMON_LOT_HEADER)xixcore_GetDataBufferWithOffset(LotHeader); xixcore_InitializeCommonLotHeader( pLotHeader, pVCB->VolumeLotSignature, LOT_INFO_TYPE_FILE, LOT_FLAG_BEGIN, BeginingLotIndex, BeginingLotIndex, 0, 0, 0, sizeof(XIDISK_FILE_HEADER), pVCB->LotSize - sizeof(XIDISK_FILE_HEADER) ); pLotHeader->Lock.LockState = XIDISK_LOCK_RELEASED; pLotHeader->Lock.LockAcquireTime=0; memcpy(pLotHeader->Lock.LockHostSignature, pVCB->HostId , 16); // Changed by ILGU HONG // chesung suggest //RtlCopyMemory(pLotHeader->Lock.LockHostMacAddress, PtrVCB->HostMac, 6); memcpy(pLotHeader->Lock.LockHostMacAddress, pVCB->HostMac, 32); memset(pFileInfo, 0, (XIDISK_COMMON_LOT_HEADER_SIZE - XIXCORE_MD5DIGEST_AND_SEQSIZE)); pFileInfo->Access_time = xixcore_GetCurrentTime64(); pFileInfo->Change_time = xixcore_GetCurrentTime64(); pFileInfo->Create_time = xixcore_GetCurrentTime64(); pFileInfo->Modified_time = xixcore_GetCurrentTime64(); memcpy(pFileInfo->OwnHostId , pVCB->HostId, 16); pFileInfo->ParentDirLotIndex = pDir->LotNumber; pFileInfo->LotIndex = BeginingLotIndex; pFileInfo->State = XIFS_FD_STATE_CREATE; pFileInfo->ACLState = 0; pFileInfo->FileAttribute = (FileAttribute|FILE_ATTRIBUTE_ARCHIVE); pFileInfo->AccessFlags = FILE_SHARE_READ; pFileInfo->FileSize = 0; pFileInfo->AllocationSize = pVCB->LotSize - XIDISK_FILE_HEADER_SIZE; pFileInfo->AddressMapIndex = 0; pFileInfo->LinkCount = 1; pFileInfo->NameSize = NameLength; pFileInfo->AddressMapIndex = 0; XIXCORE_SET_FLAGS(pFileInfo->Type, XIFS_FD_TYPE_FILE); memcpy(pFileInfo->Name, Name, NameLength); pFileInfo->AddressMapIndex = 0; }else{ pDirInfo = (PXIDISK_DIR_INFO)xixcore_GetDataBufferWithOffset(xbuf); pLotHeader = (PXIDISK_COMMON_LOT_HEADER)xixcore_GetDataBufferWithOffset(LotHeader); xixcore_InitializeCommonLotHeader( pLotHeader, pVCB->VolumeLotSignature, LOT_INFO_TYPE_DIRECTORY, LOT_FLAG_BEGIN, BeginingLotIndex, BeginingLotIndex, 0, 0, 0, sizeof(XIDISK_FILE_HEADER_LOT), pVCB->LotSize - sizeof(XIDISK_DIR_HEADER_LOT) ); pLotHeader->Lock.LockState= XIDISK_LOCK_RELEASED; pLotHeader->Lock.LockAcquireTime= 0;; memcpy(pLotHeader->Lock.LockHostSignature, pVCB->HostId , 16); // Changed by ILGU HONG // chesung suggest //RtlCopyMemory(pLotHeader->Lock.LockHostMacAddress, PtrVCB->HostMac, 6); memcpy(pLotHeader->Lock.LockHostMacAddress, pVCB->HostMac, 32); memset(pDirInfo, 0, (XIDISK_COMMON_LOT_HEADER_SIZE - XIXCORE_MD5DIGEST_AND_SEQSIZE)); pDirInfo->Access_time = xixcore_GetCurrentTime64(); pDirInfo->Change_time = xixcore_GetCurrentTime64(); pDirInfo->Create_time = xixcore_GetCurrentTime64(); pDirInfo->Modified_time = xixcore_GetCurrentTime64(); memcpy(pDirInfo->OwnHostId ,pVCB->HostId, 16); pDirInfo->ParentDirLotIndex = pDir->LotNumber; pDirInfo->LotIndex = BeginingLotIndex; pDirInfo->State = XIFS_FD_STATE_CREATE; pDirInfo->ACLState = 0; pDirInfo->FileAttribute = (FileAttribute | FILE_ATTRIBUTE_DIRECTORY); pDirInfo->AccessFlags = FILE_SHARE_READ; pDirInfo->FileSize = 0; pDirInfo->AllocationSize = pVCB->LotSize - XIDISK_DIR_HEADER_SIZE; pDirInfo->LinkCount = 1; XIXCORE_SET_FLAGS(pDirInfo->Type, XIFS_FD_TYPE_DIRECTORY); pDirInfo->NameSize = NameLength; memcpy(pDirInfo->Name, Name, NameLength); pDirInfo->AddressMapIndex = 0; } RC = xixcore_RawWriteFileHeader( pVCB->XixcoreBlockDevice, pVCB->LotSize, pVCB->SectorSize, pVCB->SectorSizeBit, BeginingLotIndex, xbuf, &Reason ); if(RC < 0 ){ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("ERROR(0x%x) Reason(0x%x) xixcore_CreateNewFile : xixcore_RawWriteFileHeader.\n", RC, Reason)); goto error_out; } RC = xixcore_RawWriteLotHeader( pVCB->XixcoreBlockDevice, pVCB->LotSize, pVCB->SectorSize, pVCB->SectorSizeBit, BeginingLotIndex, LotHeader, &Reason ); if(RC < 0 ){ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("ERROR(0x%x) Reason(0x%x) xixcore_CreateNewFile : xixcore_RawWriteLotAndFileHeader.\n", RC, Reason)); goto error_out; } xixcore_ZeroBufferOffset(xbuf); memset(xixcore_GetDataBuffer(xbuf), 0, XIDISK_DUP_FILE_INFO_SIZE); pAddressMap = (PXIDISK_ADDR_MAP)xixcore_GetDataBufferWithOffset(xbuf); pAddressMap->LotNumber[0] = BeginingLotIndex; RC = xixcore_RawWriteAddressOfFile( pVCB->XixcoreBlockDevice, pVCB->LotSize, pVCB->SectorSize, pVCB->SectorSizeBit, BeginingLotIndex, 0, pDir->AddrLotSize, &AddrStartSectorIndex, 0, xbuf, &Reason); if(RC < 0 ){ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("ERROR(0x%x) Reason(0x%x) xixcore_CreateNewFile : xixcore_RawWriteAddressOfFile.\n", RC, Reason)); goto error_out; } if(ChildType == XIFS_FD_TYPE_DIRECTORY) { PXIDISK_HASH_VALUE_TABLE pTable = NULL; xixcore_ZeroBufferOffset(xbuf); memset(xixcore_GetDataBuffer(xbuf), 0, XIDISK_DUP_FILE_INFO_SIZE); RC = xixcore_RawReadDirEntryHashValueTable( pVCB->XixcoreBlockDevice, pVCB->LotSize, pVCB->SectorSize, pVCB->SectorSizeBit, BeginingLotIndex, xbuf, &Reason ); if(RC < 0 ){ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("ERROR(0x%x) Reason(0x%x) xixcore_CreateNewFile : xixcore_RawWriteDirEntryHashValueTable.\n", RC, Reason)); if(RC == XCCODE_CRCERROR){ xixcore_ZeroBufferOffset(xbuf); }else{ goto error_out; } } pTable = (PXIDISK_HASH_VALUE_TABLE)xixcore_GetDataBufferWithOffset(xbuf); memset(pTable, 0, (XIDISK_HASH_VALUE_TABLE_SIZE - XIXCORE_MD5DIGEST_AND_SEQSIZE)); RC = xixcore_RawWriteDirEntryHashValueTable( pVCB->XixcoreBlockDevice, pVCB->LotSize, pVCB->SectorSize, pVCB->SectorSizeBit, BeginingLotIndex, xbuf, &Reason ); if(RC < 0 ){ DebugTrace(DEBUG_LEVEL_ERROR, DEBUG_TARGET_ALL, ("ERROR(0x%x) Reason(0x%x) xixcore_CreateNewFile : xixcore_RawWriteDirEntryHashValueTable.\n", RC, Reason)); goto error_out; } } *NewFileId = BeginingLotIndex; //xixcore_NotifyChange(pVCB, XIXCORE_META_FLAGS_UPDATE); RC = XCCODE_SUCCESS; error_out: if( RC < 0 ) { if(IsDirSet == 1){ xixcore_DeleteChildFromDir( pVCB, pDir, ChildIndex, DirContext ); } if(bLotAlloc == 1) { xixcore_FreeVCBLot(pVCB, BeginingLotIndex); } } if(xbuf) { xixcore_FreeBuffer(xbuf); } if(LotHeader){ xixcore_FreeBuffer(LotHeader); } DebugTrace(DEBUG_LEVEL_TRACE, (DEBUG_TARGET_DIRINFO|DEBUG_TARGET_FCB|DEBUG_TARGET_FILEINFO), ("Exit (0x%x) xixcore_CreateNewFile \n", RC)); return RC; }