123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- Subject: yaffs: add support for tags-9bytes mount option
- Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
- ---
- --- a/fs/yaffs2/yaffs_vfs.c
- +++ b/fs/yaffs2/yaffs_vfs.c
- @@ -2644,6 +2644,7 @@ static const struct super_operations yaf
-
- struct yaffs_options {
- int inband_tags;
- + int tags_9bytes;
- int skip_checkpoint_read;
- int skip_checkpoint_write;
- int no_cache;
- @@ -2683,6 +2684,8 @@ static int yaffs_parse_options(struct ya
-
- if (!strcmp(cur_opt, "inband-tags")) {
- options->inband_tags = 1;
- + } else if (!strcmp(cur_opt, "tags-9bytes")) {
- + options->tags_9bytes = 1;
- } else if (!strcmp(cur_opt, "tags-ecc-off")) {
- options->tags_ecc_on = 0;
- options->tags_ecc_overridden = 1;
- @@ -2756,7 +2759,6 @@ static struct super_block *yaffs_interna
- struct yaffs_param *param;
-
- int read_only = 0;
- - int inband_tags = 0;
-
- struct yaffs_options options;
-
- @@ -2796,6 +2798,9 @@ static struct super_block *yaffs_interna
-
- memset(&options, 0, sizeof(options));
-
- + if (IS_ENABLED(CONFIG_YAFFS_9BYTE_TAGS))
- + options.tags_9bytes = 1;
- +
- if (yaffs_parse_options(&options, data_str)) {
- /* Option parsing failed */
- return NULL;
- @@ -2829,17 +2834,22 @@ static struct super_block *yaffs_interna
- }
-
- /* Added NCB 26/5/2006 for completeness */
- - if (yaffs_version == 2 && !options.inband_tags
- - && WRITE_SIZE(mtd) == 512) {
- + if (yaffs_version == 2 &&
- + (!options.inband_tags || options.tags_9bytes) &&
- + WRITE_SIZE(mtd) == 512) {
- yaffs_trace(YAFFS_TRACE_ALWAYS, "auto selecting yaffs1");
- yaffs_version = 1;
- }
-
- - if (mtd->oobavail < sizeof(struct yaffs_packed_tags2) ||
- - options.inband_tags)
- - inband_tags = 1;
- + if (yaffs_version == 2 &&
- + mtd->oobavail < sizeof(struct yaffs_packed_tags2)) {
- + yaffs_trace(YAFFS_TRACE_ALWAYS, "auto selecting inband tags");
- + options.inband_tags = 1;
- + }
-
- - if(yaffs_verify_mtd(mtd, yaffs_version, inband_tags) < 0)
- + err = yaffs_verify_mtd(mtd, yaffs_version, options.inband_tags,
- + options.tags_9bytes);
- + if (err < 0)
- return NULL;
-
- /* OK, so if we got here, we have an MTD that's NAND and looks
- @@ -2896,7 +2906,8 @@ static struct super_block *yaffs_interna
-
- param->n_reserved_blocks = 5;
- param->n_caches = (options.no_cache) ? 0 : 10;
- - param->inband_tags = inband_tags;
- + param->inband_tags = options.inband_tags;
- + param->tags_9bytes = options.tags_9bytes;
-
- param->enable_xattr = 1;
- if (options.lazy_loading_overridden)
- --- a/fs/yaffs2/yaffs_mtdif.c
- +++ b/fs/yaffs2/yaffs_mtdif.c
- @@ -278,7 +278,8 @@ struct mtd_info * yaffs_get_mtd_device(d
- return mtd;
- }
-
- -int yaffs_verify_mtd(struct mtd_info *mtd, int yaffs_version, int inband_tags)
- +int yaffs_verify_mtd(struct mtd_info *mtd, int yaffs_version, int inband_tags,
- + int tags_9bytes)
- {
- if (yaffs_version == 2) {
- if ((WRITE_SIZE(mtd) < YAFFS_MIN_YAFFS2_CHUNK_SIZE ||
- @@ -297,6 +298,12 @@ int yaffs_verify_mtd(struct mtd_info *mt
- );
- return -1;
- }
- +
- + if (tags_9bytes && mtd->oobavail < 9) {
- + yaffs_trace(YAFFS_TRACE_ALWAYS,
- + "MTD device does not support 9-byte tags");
- + return -1;
- + }
- }
-
- return 0;
- --- a/fs/yaffs2/yaffs_mtdif.h
- +++ b/fs/yaffs2/yaffs_mtdif.h
- @@ -21,5 +21,6 @@
- void yaffs_mtd_drv_install(struct yaffs_dev *dev);
- struct mtd_info * yaffs_get_mtd_device(dev_t sdev);
- void yaffs_put_mtd_device(struct mtd_info *mtd);
- -int yaffs_verify_mtd(struct mtd_info *mtd, int yaffs_version, int inband_tags);
- +int yaffs_verify_mtd(struct mtd_info *mtd, int yaffs_version, int inband_tags,
- + int tags_9bytes);
- #endif
|