X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=blobdiff_plain;f=yaffs_tagsmarshall.c;h=d568208e91bd53ece6b685707ecca481c693c183;hp=44a83b12ca4d07cfa84fbb86fc80961ff738bf5a;hb=HEAD;hpb=a78bce6f4a7042fa153ab32d2bb263ecf7d27b66 diff --git a/yaffs_tagsmarshall.c b/yaffs_tagsmarshall.c index 44a83b1..397715d 100644 --- a/yaffs_tagsmarshall.c +++ b/yaffs_tagsmarshall.c @@ -1,17 +1,20 @@ /* * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. * - * Copyright (C) 2002-2011 Aleph One Ltd. - * for Toby Churchill Ltd and Brightstar Engineering + * Copyright (C) 2002-2018 Aleph One Ltd. * * 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. + * + * This file handles the marshalling (ie internal<-->external structure + * translation between the internal tags and the stored tags in Yaffs2-style + * tags storage. */ -#include "yaffs_guts.h" +#include "yaffs_tagsmarshall.h" #include "yaffs_trace.h" #include "yaffs_packedtags2.h" @@ -43,9 +46,9 @@ static int yaffs_tags_marshall_write(struct yaffs_dev *dev, (struct yaffs_packed_tags2_tags_only *)(data + dev-> data_bytes_per_chunk); - yaffs_pack_tags2_tags_only(pt2tp, tags); + yaffs_pack_tags2_tags_only(dev, pt2tp, tags); } else { - yaffs_pack_tags2(&pt, tags, !dev->param.no_tags_ecc); + yaffs_pack_tags2(dev, &pt, tags, !dev->param.no_tags_ecc); } retval = dev->drv.drv_write_chunk_fn(dev, nand_chunk, @@ -97,17 +100,24 @@ static int yaffs_tags_marshall_read(struct yaffs_dev *dev, BUG(); + if (retval == YAFFS_FAIL) { + if (local_data) + yaffs_release_temp_buffer(dev, data); + + return YAFFS_FAIL; + } + if (dev->param.inband_tags) { if (tags) { struct yaffs_packed_tags2_tags_only *pt2tp; pt2tp = (struct yaffs_packed_tags2_tags_only *) &data[dev->data_bytes_per_chunk]; - yaffs_unpack_tags2_tags_only(tags, pt2tp); + yaffs_unpack_tags2_tags_only(dev, tags, pt2tp); } } else if (tags) { memcpy(packed_tags_ptr, spare_buffer, packed_tags_size); - yaffs_unpack_tags2(tags, &pt, !dev->param.no_tags_ecc); + yaffs_unpack_tags2(dev, tags, &pt, !dev->param.no_tags_ecc); } if (local_data) @@ -118,7 +128,7 @@ static int yaffs_tags_marshall_read(struct yaffs_dev *dev, dev->n_ecc_unfixed++; } - if (tags && ecc_result == -YAFFS_ECC_RESULT_FIXED) { + if (tags && ecc_result == YAFFS_ECC_RESULT_FIXED) { if (tags->ecc_result <= YAFFS_ECC_RESULT_NO_ERROR) tags->ecc_result = YAFFS_ECC_RESULT_FIXED; dev->n_ecc_fixed++; @@ -166,10 +176,7 @@ static int yaffs_tags_marshall_query_block(struct yaffs_dev *dev, int block_no, "block query returns seq %d state %d", *seq_number, *state); - if (retval == 0) - return YAFFS_OK; - else - return YAFFS_FAIL; + return retval; } static int yaffs_tags_marshall_mark_bad(struct yaffs_dev *dev, int block_no)