int yaffs_TagsCompatabilityQueryNANDBlock(struct yaffs_DeviceStruct *dev, int blockNo, yaffs_BlockState * state, int *sequenceNumber) { yaffs_Spare spare0, spare1; static yaffs_Spare spareFF; static int init; yaffs_ECCResult dummy; if (!init) { memset(&spareFF, 0xFF, sizeof(spareFF)); init = 1; } *sequenceNumber = 0; yaffs_ReadChunkFromNAND(dev, blockNo * dev->nChunksPerBlock, NULL, &spare0, &dummy, 1); yaffs_ReadChunkFromNAND(dev, blockNo * dev->nChunksPerBlock + 1, NULL, &spare1, &dummy, 1); if (yaffs_CountBits(spare0.blockStatus & spare1.blockStatus) < 7) *state = YAFFS_BLOCK_STATE_DEAD; else if (memcmp(&spareFF, &spare0, sizeof(spareFF)) == 0) *state = YAFFS_BLOCK_STATE_EMPTY; else *state = YAFFS_BLOCK_STATE_NEEDS_SCANNING; return YAFFS_OK; }
int yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(yaffs_Device * dev, int chunkInNAND, __u8 * data, yaffs_ExtendedTags * eTags) { #ifdef DEBUG_YAFFS2 printk("yaffs_TagsCompatabilityReadChunkWithTagsFromNAND\n"); #endif yaffs_Spare spare; yaffs_Tags tags; yaffs_ECCResult eccResult; static yaffs_Spare spareFF; static int init; if (!init) { memset(&spareFF, 0xFF, sizeof(spareFF)); init = 1; } if (yaffs_ReadChunkFromNAND (dev, chunkInNAND, data, &spare, &eccResult, 1)) { /* eTags may be NULL */ if (eTags) { int deleted = (yaffs_CountBits(spare.pageStatus) < 7) ? 1 : 0; eTags->chunkDeleted = deleted; eTags->eccResult = eccResult; eTags->blockBad = 0; /* We're reading it */ /* therefore it is not a bad block */ eTags->chunkUsed = (memcmp(&spareFF, &spare, sizeof(spareFF)) != 0) ? 1 : 0; if (eTags->chunkUsed) { yaffs_GetTagsFromSpare(dev, &spare, &tags); eTags->objectId = tags.objectId; eTags->chunkId = tags.chunkId; eTags->byteCount = tags.byteCount; eTags->serialNumber = tags.serialNumber; } } return YAFFS_OK; } else { return YAFFS_FAIL; } }