From: Charles Manning Date: Wed, 26 Jun 2013 06:21:44 +0000 (+1200) Subject: Add automatic detection for inband tags and bad block marking supression X-Git-Tag: aleph1-release~51 X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=commitdiff_plain;h=ab9a00dce3929c4c8cc1f01db34b23ba64a850ce Add automatic detection for inband tags and bad block marking supression Inband tags is now selected automatically if there is insufficient space in oob for the tags. Also add a development feature that supresses bad block marking during development. Signed-off-by: Charles Manning --- diff --git a/Kconfig_multi b/Kconfig_multi index 658feea..408570f 100644 --- a/Kconfig_multi +++ b/Kconfig_multi @@ -152,6 +152,16 @@ config YAFFS_DISABLE_BACKGROUND If unsure, say N. +config YAFFS_DISABLE_BAD_BLOCK_MARKING + bool "Disable yaffs2 bad block marking" + depends on YAFFS_FS + default n + help + Useful during early flash bring up to prevent problems causing + lots of bad block marking. + + If unsure, say N. + config YAFFS_XATTR bool "Enable yaffs2 xattr support" depends on YAFFS_FS diff --git a/yaffs_guts.h b/yaffs_guts.h index 79cec33..2225fb2 100644 --- a/yaffs_guts.h +++ b/yaffs_guts.h @@ -592,6 +592,7 @@ struct yaffs_param { int always_check_erased; /* Force chunk erased check always on */ int disable_summary; + int disable_bad_block_marking; }; diff --git a/yaffs_nand.c b/yaffs_nand.c index 9afd5ec..0d8499b 100644 --- a/yaffs_nand.c +++ b/yaffs_nand.c @@ -80,6 +80,10 @@ int yaffs_mark_bad(struct yaffs_dev *dev, int block_no) { block_no -= dev->block_offset; dev->n_bad_markings++; + + if (dev->param.disable_bad_block_marking) + return YAFFS_OK; + return dev->tagger.mark_bad_fn(dev, block_no); } diff --git a/yaffs_vfs_multi.c b/yaffs_vfs_multi.c index 92d2f5f..b067436 100644 --- a/yaffs_vfs_multi.c +++ b/yaffs_vfs_multi.c @@ -176,6 +176,7 @@ static uint32_t YCALCBLOCKS(uint64_t partition_size, uint32_t block_size) #include "yaffs_linux.h" #include "yaffs_mtdif.h" +#include "yaffs_packedtags2.h" unsigned int yaffs_trace_mask = YAFFS_TRACE_BAD_BLOCKS | YAFFS_TRACE_ALWAYS; unsigned int yaffs_wr_attempts = YAFFS_WR_ATTEMPTS; @@ -2743,7 +2744,10 @@ static struct super_block *yaffs_internal_read_super(int yaffs_version, param->n_reserved_blocks = 5; param->n_caches = (options.no_cache) ? 0 : 10; - param->inband_tags = options.inband_tags; + + if (mtd->oobavail < sizeof(struct yaffs_packed_tags2) || + options.inband_tags) + param->inband_tags = 1; param->enable_xattr = 1; if (options.lazy_loading_overridden) @@ -2758,6 +2762,10 @@ static struct super_block *yaffs_internal_read_super(int yaffs_version, param->refresh_period = 500; param->disable_summary = options.disable_summary; + +#ifdef CONFIG_YAFFS_DISABLE_BAD_BLOCK_MARKING + param->disable_bad_block_marking = 1; +#endif if (options.empty_lost_and_found_overridden) param->empty_lost_n_found = options.empty_lost_and_found; @@ -3001,6 +3009,8 @@ static char *yaffs_dump_dev_part0(char *buf, struct yaffs_dev *dev) param->empty_lost_n_found); buf += sprintf(buf, "disable_lazy_load.... %d\n", param->disable_lazy_load); + buf += sprintf(buf, "disable_bad_block_mrk %d\n", + param->disable_bad_block_marking); buf += sprintf(buf, "refresh_period....... %d\n", param->refresh_period); buf += sprintf(buf, "n_caches............. %d\n", param->n_caches);