X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=blobdiff_plain;f=yaffs_tagscompat.c;h=7622b1af7c0d3ff3970e7020fe69dbd062fd3dec;hp=61880d5284fe3c598aa89a5b4757161b4b17fe55;hb=e39518410bfa410b09e4b270755f756b91456001;hpb=84699e12e914cb78ae3a1da48c99ed679b934153 diff --git a/yaffs_tagscompat.c b/yaffs_tagscompat.c index 61880d5..7622b1a 100644 --- a/yaffs_tagscompat.c +++ b/yaffs_tagscompat.c @@ -1,16 +1,14 @@ /* - * YAFFS: Yet another FFS. A NAND-flash specific file system. - * yaffs_tagscompat.h: Tags compatability layer to use YAFFS1 formatted NAND. + * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. * - * Copyright (C) 2002 Aleph One Ltd. + * Copyright (C) 2002-2007 Aleph One Ltd. + * for Toby Churchill Ltd and Brightstar Engineering * * Created by Charles Manning * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. - * - * $Id: yaffs_tagscompat.c,v 1.6 2005-08-11 02:33:03 marty Exp $ */ #include "yaffs_guts.h" @@ -47,7 +45,7 @@ static const char yaffs_countBitsTable[256] = { 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 }; -static int yaffs_CountBits(__u8 x) +int yaffs_CountBits(__u8 x) { int retVal; retVal = yaffs_countBitsTable[x]; @@ -213,13 +211,13 @@ static int yaffs_ReadChunkFromNAND(struct yaffs_DeviceStruct *dev, if (eccResult1 > 0) { T(YAFFS_TRACE_ERROR, (TSTR - ("**>>ecc error fix performed on chunk %d:0" + ("**>>yaffs ecc error fix performed on chunk %d:0" TENDSTR), chunkInNAND)); dev->eccFixed++; } else if (eccResult1 < 0) { T(YAFFS_TRACE_ERROR, (TSTR - ("**>>ecc error unfixed on chunk %d:0" + ("**>>yaffs ecc error unfixed on chunk %d:0" TENDSTR), chunkInNAND)); dev->eccUnfixed++; } @@ -227,13 +225,13 @@ static int yaffs_ReadChunkFromNAND(struct yaffs_DeviceStruct *dev, if (eccResult2 > 0) { T(YAFFS_TRACE_ERROR, (TSTR - ("**>>ecc error fix performed on chunk %d:1" + ("**>>yaffs ecc error fix performed on chunk %d:1" TENDSTR), chunkInNAND)); dev->eccFixed++; } else if (eccResult2 < 0) { T(YAFFS_TRACE_ERROR, (TSTR - ("**>>ecc error unfixed on chunk %d:1" + ("**>>yaffs ecc error unfixed on chunk %d:1" TENDSTR), chunkInNAND)); dev->eccUnfixed++; } @@ -262,24 +260,24 @@ static int yaffs_ReadChunkFromNAND(struct yaffs_DeviceStruct *dev, if (nspare.eccres1 > 0) { T(YAFFS_TRACE_ERROR, (TSTR - ("**>>ecc error fix performed on chunk %d:0" + ("**>>mtd ecc error fix performed on chunk %d:0" TENDSTR), chunkInNAND)); } else if (nspare.eccres1 < 0) { T(YAFFS_TRACE_ERROR, (TSTR - ("**>>ecc error unfixed on chunk %d:0" + ("**>>mtd ecc error unfixed on chunk %d:0" TENDSTR), chunkInNAND)); } if (nspare.eccres2 > 0) { T(YAFFS_TRACE_ERROR, (TSTR - ("**>>ecc error fix performed on chunk %d:1" + ("**>>mtd ecc error fix performed on chunk %d:1" TENDSTR), chunkInNAND)); } else if (nspare.eccres2 < 0) { T(YAFFS_TRACE_ERROR, (TSTR - ("**>>ecc error unfixed on chunk %d:1" + ("**>>mtd ecc error unfixed on chunk %d:1" TENDSTR), chunkInNAND)); } @@ -455,20 +453,22 @@ int yaffs_TagsCompatabilityReadChunkWithTagsFromNAND(yaffs_Device * dev, int deleted = (yaffs_CountBits(spare.pageStatus) < 7) ? 1 : 0; - yaffs_GetTagsFromSpare(dev, &spare, &tags); - eTags->chunkDeleted = deleted; - eTags->objectId = tags.objectId; - eTags->chunkId = tags.chunkId; - eTags->byteCount = tags.byteCount; - eTags->serialNumber = tags.serialNumber; 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;