Lines Matching refs:block
69 PRINTK(" block number: %u\n", g_blockNum);
140 OsBcacheBlock *block = NULL;
143 for (; node != NULL; node = (block->num < num) ? node->rb_right : node->rb_left) {
144 block = rb_entry(node, OsBcacheBlock, rbNode);
145 if (block->num == num) {
146 return block;
152 static VOID RbAddBlock(OsBcache *bc, OsBcacheBlock *block)
159 rb_link_node(&block->rbNode, NULL, &bc->rbRoot.rb_node);
161 for (; node != NULL; link = (b->num > block->num) ? &node->rb_left : &node->rb_right, node = *link) {
163 if (b->num == block->num) {
164 PRINT_ERR("RbAddBlock fail, b->num = %llu, block->num = %llu\n", b->num, block->num);
168 rb_link_node(&block->rbNode, &b->rbNode, link);
170 rb_insert_color(&block->rbNode, &bc->rbRoot);
173 static inline VOID RbDelBlock(OsBcache *bc, OsBcacheBlock *block)
175 rb_erase(&block->rbNode, &bc->rbRoot);
178 static inline VOID ListMoveBlockToHead(OsBcache *bc, OsBcacheBlock *block)
180 LOS_ListDelete(&block->listNode);
181 LOS_ListAdd(&bc->listHead, &block->listNode);
184 static inline VOID FreeBlock(OsBcache *bc, OsBcacheBlock *block)
186 block->used = FALSE;
187 LOS_ListAdd(&bc->freeListHead, &block->listNode);
246 static INT32 BlockRead(OsBcache *bc, OsBcacheBlock *block, UINT8 *buf)
249 (block->num) << GetValLog2(bc->sectorPerBlock));
252 if (block->modified == FALSE) {
253 if (block->listNode.pstNext != NULL) {
254 LOS_ListDelete(&block->listNode); /* list del block */
255 RbDelBlock(bc, block);
257 FreeBlock(bc, block);
262 block->readFlag = TRUE;
266 static INT32 BcacheGetFlag(OsBcache *bc, OsBcacheBlock *block)
273 if (block->readFlag == TRUE) {
278 flag &= block->flag[i];
285 ret = BlockRead(bc, block, bc->rwBuffer);
291 val = block->flag[i];
311 if (memcpy_s(block->data + pos, bc->blockSize - pos, bc->rwBuffer + pos, currentSize) != EOK) {
324 static VOID BcacheSetFlag(const OsBcache *bc, OsBcacheBlock *block, UINT32 pos, UINT32 size)
339 block->flag[i] |= 1u << (UNINT_MAX_SHIFT_BITS - j);
348 static INT32 BcacheSyncBlock(OsBcache *bc, OsBcacheBlock *block)
353 if (block->modified == TRUE) {
354 D(("bcache writing block = %llu\n", block->num));
356 ret = FindFlagPos(block->flag, bc->sectorPerBlock >> UNINT_LOG2_SHIFT, &start, &end);
360 ret = BcacheGetFlag(bc, block);
368 ret = bc->bwriteFun(bc->priv, (const UINT8 *)(block->data + (start * bc->sectorSize)),
369 len, (block->num * bc->sectorPerBlock) + start);
371 block->modified = FALSE;
374 PRINT_ERR("BcacheSyncBlock fail, ret = %d, len = %u, block->num = %llu, start = %u\n",
375 ret, len, block->num, start);
381 static void NumListAdd(OsBcache *bc, OsBcacheBlock *block)
386 if (temp->num > block->num) {
387 LOS_ListTailInsert(&temp->numNode, &block->numNode);
392 LOS_ListTailInsert(&bc->numHead, &block->numNode);
395 static void AddBlock(OsBcache *bc, OsBcacheBlock *block)
397 RbAddBlock(bc, block);
398 NumListAdd(bc, block);
399 bc->sumNum += block->num;
401 LOS_ListAdd(&bc->listHead, &block->listNode);
404 static void DelBlock(OsBcache *bc, OsBcacheBlock *block)
406 LOS_ListDelete(&block->listNode); /* lru list del */
407 LOS_ListDelete(&block->numNode); /* num list del */
408 bc->sumNum -= block->num;
410 RbDelBlock(bc, block); /* rb tree del */
411 FreeBlock(bc, block); /* free list add */
414 static BOOL BlockAllDirty(const OsBcache *bc, OsBcacheBlock *block)
420 if (block->modified == TRUE) {
421 if (block->allDirty) {
425 if (FindFlagPos(block->flag, len, &start, &end) == ENOERR) {
427 block->allDirty = TRUE;
452 /* try get free block first, if failed free a useless block */
456 OsBcacheBlock *block = NULL;
458 LOS_DL_LIST_FOR_EACH_ENTRY(block, &bc->freeListHead, OsBcacheBlock, listNode) {
459 if (block->readBuff == read) {
460 block->used = TRUE;
461 LOS_ListDelete(&block->listNode);
462 return block; /* get free one */
468 block = LOS_DL_LIST_ENTRY(node, OsBcacheBlock, listNode);
469 node = block->listNode.pstPrev;
471 if (block->readBuff == read) {
472 if (block->modified == TRUE) {
473 BcacheSyncBlock(bc, block);
476 DelBlock(bc, block);
477 block->used = TRUE;
478 LOS_ListDelete(&block->listNode);
479 return block; /* get used one */
538 /* get the min write block num of block cache buffer */
542 OsBcacheBlock *block = NULL;
544 LOS_DL_LIST_FOR_EACH_ENTRY(block, &bc->numHead, OsBcacheBlock, numNode) {
545 if (!block->readBuff) {
546 ret = block->num;
563 /* fallback, this may happen when the block previously flushed, use read buffer */
570 return GetBaseBlock(bc); /* new block */
578 /* this is a sync thread synced block! */
602 OsBcacheBlock *block = NULL;
610 block = LOS_DL_LIST_ENTRY(node, OsBcacheBlock, listNode);
611 ret = BcacheSyncBlock(bc, block);
623 static VOID BlockInit(OsBcache *bc, OsBcacheBlock *block, UINT64 num)
625 (VOID)memset_s(block->flag, sizeof(block->flag), 0, sizeof(block->flag));
626 block->num = num;
627 block->readFlag = FALSE;
628 if (block->modified == TRUE) {
629 block->modified = FALSE;
632 block->allDirty = FALSE;
638 OsBcacheBlock *block = NULL;
642 * First check if the most recently used block is the requested block,
647 block = (first->num == num) ? first : RbFindBlock(bc, num);
650 if (block != NULL) {
651 D(("bcache block = %llu found in cache\n", num));
653 UINT32 index = ((UINT32)(block->data - g_memStart)) / g_dataSize;
658 if (first != block) {
659 ListMoveBlockToHead(bc, block);
661 *dblock = block;
663 if ((bc->prereadFun != NULL) && (readData == TRUE) && (block->pgHit == 1)) {
664 block->pgHit = 0;
665 bc->prereadFun(bc, block);
671 D(("bcache block = %llu NOT found in cache\n", num));
673 block = AllocNewBlock(bc, readData, num);
674 if (block == NULL) {
675 block = GetSlowBlock(bc, readData);
678 if (block == NULL) {
682 UINT32 index = ((UINT32)(block->data - g_memStart)) / g_dataSize;
686 BlockInit(bc, block, num);
689 D(("bcache reading block = %llu\n", block->num));
691 ret = BlockRead(bc, block, block->data);
696 bc->prereadFun(bc, block);
700 AddBlock(bc, block);
702 *dblock = block;
708 OsBcacheBlock *block = NULL;
710 LOS_DL_LIST_FOR_EACH_ENTRY_SAFE(block, next, &bc->listHead, OsBcacheBlock, listNode) {
711 DelBlock(bc, block);
723 OsBcacheBlock *block = NULL;
742 /* init block memory pool */
758 block = (OsBcacheBlock *)(VOID *)blockMem;
759 block->data = dataMem;
760 block->readBuff = (i < CONFIG_FS_FAT_READ_NUMS) ? TRUE : FALSE;
763 bc->wStart = block;
766 LOS_ListTailInsert(&bc->freeListHead, &block->listNode);
772 bc->wEnd = block;
826 OsBcacheBlock *block = NULL;
856 ret = BcacheGetBlock(bc, num, useRead, &block);
862 if ((block->readFlag == FALSE) && (block->modified == TRUE)) {
863 ret = BcacheGetFlag(bc, block);
868 } else if ((block->readFlag == FALSE) && (block->modified == FALSE)) {
869 ret = BlockRead(bc, block, block->data);
876 if (LOS_CopyFromKernel((VOID *)tempBuf, size, (VOID *)(block->data + pos), currentSize) != EOK) {
894 OsBcacheBlock *block = NULL;
919 ret = BcacheGetBlock(bc, num, FALSE, &block);
925 if (LOS_CopyToKernel((VOID *)(block->data + pos), bc->blockSize - (UINT32)pos,
930 if (block->modified == FALSE) {
931 block->modified = TRUE;
935 (void)memset_s(block->flag, sizeof(block->flag), 0xFF, sizeof(block->flag));
936 block->allDirty = TRUE;
938 BcacheSetFlag(bc, block, (UINT32)pos, currentSize);
1137 OsBcacheBlock *block = NULL;
1155 ret = BcacheGetBlock(bc, bc->curBlockNum + i, TRUE, &block);
1157 PRINT_ERR("read block %llu error : %d!\n", bc->curBlockNum, ret);
1163 if (block != NULL) {
1164 block->pgHit = 1; /* preread complete */
1173 const OsBcacheBlock *block = arg2;
1176 bc->curBlockNum = block->num;