smp8671/android下yaffs2文件莫名丢失问题分析2
解决了前一篇文章中说的问题后,当时以为真的解决问题了。周五晚升级软件,继续测试,下周一看运行状况。结果很不幸,问题又出现了,还是丢失文件的问题。看了上一篇改的代码,看来改的另外一个问题,yaffs多进程会挂起。这次出现的问题才是真正的丢失文件问题。看来这个版本里yaffs有好多问题啊。真不知道sigma-design怎么搞的,难道都没测出来这些问题么?
继续调试问题,根据打印发现经常有so库找不到,libui.so,libdvm.so,libmedia_jni.so都可能找不到,有时甚至找不到2个库。
int nandmtd2_ReadChunkWithTagsFromNAND(yaffs_dev_t *dev, int nand_chunk, __u8 *data, yaffs_ext_tags *tags){struct mtd_info *mtd = yaffs_dev_to_mtd(dev);#if (MTD_VERSION_CODE > MTD_VERSION(2, 6, 17))struct mtd_oob_ops ops;#endifsize_t dummy;int retval = 0;int localData = 0; int windsome_read_twice = 1; int windsome_path = 0;loff_t addr = ((loff_t) nand_chunk) * dev->param.total_bytes_per_chunk;yaffs_PackedTags2 pt;int packed_tags_size = dev->param.no_tags_ecc ? sizeof(pt.t) : sizeof(pt);void * packed_tags_ptr = dev->param.no_tags_ecc ? (void *) &pt.t: (void *)&pt;T(YAFFS_TRACE_MTD, (TSTR ("nandmtd2_ReadChunkWithTagsFromNAND chunk %d data %p tags %p" TENDSTR), nand_chunk, data, tags));if (dev->param.inband_tags) {if (!data) {localData = 1;data = yaffs_get_temp_buffer(dev, __LINE__);}}#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))windsome_read_twice_pos: data[0]='w';data[1]='\5';data[2]='n';data[3]='d';data[4]='s';data[5]='o';data[6]='m';data[7]='e';if (dev->param.inband_tags || (data && !tags)) {retval = mtd->read(mtd, addr, dev->param.total_bytes_per_chunk, &dummy, data); windsome_path = 0;} else if (tags) {ops.mode = MTD_OOB_AUTO;ops.ooblen = packed_tags_size;ops.len = data ? dev->data_bytes_per_chunk : packed_tags_size;ops.ooboffs = 0;ops.datbuf = data;ops.oobbuf = yaffs_dev_to_lc(dev)->spareBuffer;retval = mtd->read_oob(mtd, addr, &ops); windsome_path = 1;} if (data[0]=='w' && data[1]=='\5' && data[2]=='n' && data[3]=='d' && data[4]=='s' && data[5]=='o' && data[6]=='m' && data[7]=='e') { printk ("windsome%d: %d mtd read error! why???? len=%d, dummy_len=%d, nand_chunk=%d, addr=0x%llx, retval=%d\n", windsome_path, windsome_read_twice, dev->param.total_bytes_per_chunk, dummy, nand_chunk, addr, retval); if (windsome_read_twice > 0) { printk ("windsome: try again!\n"); windsome_read_twice--; goto windsome_read_twice_pos; } }#elseif (!dev->param.inband_tags && data && tags) {retval = mtd->read_ecc(mtd, addr, dev->data_bytes_per_chunk, &dummy, data, dev->spareBuffer, NULL);} else {if (data)retval = mtd->read(mtd, addr, dev->data_bytes_per_chunk, &dummy, data);if (!dev->param.inband_tags && tags)retval = mtd->read_oob(mtd, addr, mtd->oobsize, &dummy, dev->spareBuffer);}#endifif (dev->param.inband_tags) {if (tags) {yaffs_PackedTags2TagsPart *pt2tp;pt2tp = (yaffs_PackedTags2TagsPart *)&data[dev->data_bytes_per_chunk];yaffs_unpack_tags2tags_part(tags, pt2tp);}} else {if (tags) {memcpy(packed_tags_ptr, yaffs_dev_to_lc(dev)->spareBuffer, packed_tags_size);yaffs_unpack_tags2(tags, &pt, !dev->param.no_tags_ecc);}}if (localData)yaffs_release_temp_buffer(dev, data, __LINE__);if (tags && retval == -EBADMSG && tags->ecc_result == YAFFS_ECC_RESULT_NO_ERROR) {tags->ecc_result = YAFFS_ECC_RESULT_UNFIXED;dev->n_ecc_unfixed++;}if(tags && retval == -EUCLEAN && tags->ecc_result == YAFFS_ECC_RESULT_NO_ERROR) {tags->ecc_result = YAFFS_ECC_RESULT_FIXED;dev->n_ecc_fixed++;}if (retval == 0)return YAFFS_OK;else { T(YAFFS_TRACE_TRACING, (TSTR("nandmtd2_ReadChunkWithTagsFromNAND:retval=%d\n"), retval));return YAFFS_FAIL; }} 根据此函数的日志,发现确实有mtd read error!的打印,重新读一次能够正常。