-
- memset(t,0,sizeof(yaffs_ExtendedTags));
-
- yaffs_InitialiseTags(t);
-
- if(pt->t.sequenceNumber != 0xFFFFFFFF)
- {
- // Page is in use
- yaffs_ECCOther ecc;
- yaffs_ECCCalculateOther((unsigned char *)&pt->t,sizeof(yaffs_PackedTags2TagsPart),&ecc);
- t->eccResult = yaffs_ECCCorrectOther((unsigned char *)&pt->t,sizeof(yaffs_PackedTags2TagsPart),&pt->ecc,&ecc);
- t->blockBad = 0;
- t->chunkUsed = 1;
- t->objectId = pt->t.objectId;
- t->chunkId = pt->t.chunkId;
- t->byteCount = pt->t.byteCount;
- t->chunkDeleted = 0;
- t->serialNumber = 0;
- t->sequenceNumber = pt->t.sequenceNumber;
-
- // Do extra header info stuff
-
- if(pt->t.chunkId & EXTRA_HEADER_INFO_FLAG)
- {
- t->chunkId = 0;
- t->byteCount = 0;
-
- t->extraHeaderInfoAvailable = 1;
- t->extraParentObjectId = pt->t.chunkId & (~(ALL_EXTRA_FLAGS));
- t->extraIsShrinkHeader = (pt->t.chunkId & EXTRA_SHRINK_FLAG) ? 1 : 0;
- t->extraObjectType = pt->t.objectId >> EXTRA_OBJECT_TYPE_SHIFT;
- t->objectId &= ~EXTRA_OBJECT_TYPE_MASK;
-
- if(t->extraObjectType == YAFFS_OBJECT_TYPE_HARDLINK)
- {
- t->extraEquivalentObjectId = pt->t.byteCount;
- }
- else
- {
- t->extraFileLength = pt->t.byteCount;
- }
+void yaffs_unpack_tags2(struct yaffs_ext_tags *t, struct yaffs_packed_tags2 *pt,
+ int tags_ecc)
+{
+ enum yaffs_ecc_result ecc_result = YAFFS_ECC_RESULT_NO_ERROR;
+
+ if (pt->t.seq_number != 0xFFFFFFFF && tags_ecc) {
+ /* Chunk is in use and we need to do ECC */
+
+ struct yaffs_ecc_other ecc;
+ int result;
+ yaffs_ecc_calc_other((unsigned char *)&pt->t,
+ sizeof(struct yaffs_packed_tags2_tags_only),
+ &ecc);
+ result =
+ yaffs_ecc_correct_other((unsigned char *)&pt->t,
+ sizeof(struct yaffs_packed_tags2_tags_only),
+ &pt->ecc, &ecc);
+ switch (result) {
+ case 0:
+ ecc_result = YAFFS_ECC_RESULT_NO_ERROR;
+ break;
+ case 1:
+ ecc_result = YAFFS_ECC_RESULT_FIXED;
+ break;
+ case -1:
+ ecc_result = YAFFS_ECC_RESULT_UNFIXED;
+ break;
+ default:
+ ecc_result = YAFFS_ECC_RESULT_UNKNOWN;