JFFS2_FS_WRITEBUFFER config option

Andrew Victor andrew at sanpeople.com
Thu Feb 3 09:08:25 EST 2005


hi,

As per discussions on IRC, this patch replaces the current
CONFIG_JFFS2_FS_NAND, CONFIG_JFFS2_FS_NOR_ECC and
CONFIG_JFFS2_FS_DATAFLASH with a single configuration option - 
CONFIG_JFFS2_FS_WRITEBUFFER.

This patch applies on top of the two previously posted DataFlash
patches.

The only functional change of this patch is that the slower div/mod
calculations for SECTOR_ADDR(), PAGE_DIV() and PAGE_MOD() are now always
used.


Regards,
  Andrew Victor


diff -urN -x CVS mtd/fs/Config.in mtd.new/fs/Config.in
--- mtd/fs/Config.in	Thu Jan 27 19:23:32 2005
+++ mtd.new/fs/Config.in	Thu Feb  3 14:56:12 2005
@@ -6,8 +6,7 @@
 dep_tristate 'Journalling Flash File System v2 (JFFS2) support' CONFIG_JFFS2_FS $CONFIG_MTD
 if [ "$CONFIG_JFFS2_FS" = "y" -o "$CONFIG_JFFS2_FS" = "m" ] ; then
    int 'JFFS2 debugging verbosity (0 = quiet, 2 = noisy)' CONFIG_JFFS2_FS_DEBUG 0
-   bool 'JFFS2 support for NAND chips' CONFIG_JFFS2_FS_NAND
-   bool 'JFFS2 support for DataFlash' CONFIG_JFFS2_FS_DATAFLASH
+   bool 'JFFS2 write-buffering support' CONFIG_JFFS2_FS_WRITEBUFFER
    bool 'JFFS2 ZLIB compression support (recommended)' CONFIG_JFFS2_ZLIB
    bool 'JFFS2 RTIME compression support (recommended)' CONFIG_JFFS2_RTIME
    bool 'JFFS2 RUBIN compression support' CONFIG_JFFS2_RUBIN
diff -urN -x CVS mtd/fs/Kconfig mtd.new/fs/Kconfig
--- mtd/fs/Kconfig	Tue Feb  1 09:35:12 2005
+++ mtd.new/fs/Kconfig	Thu Feb  3 15:07:51 2005
@@ -51,38 +51,18 @@
 	  If reporting bugs, please try to have available a full dump of the
 	  messages at debug level 1 while the misbehaviour was occurring.
 
-config JFFS2_FS_NAND
-	bool "JFFS2 support for NAND flash (EXPERIMENTAL)"
-	depends on JFFS2_FS && EXPERIMENTAL
-	default n
+config JFFS2_FS_WRITEBUFFER
+	bool "JFFS2 write-buffering support"
+	depends on JFFS2_FS
+	default y
 	help
-	  This enables the experimental support for NAND flash in JFFS2. NAND
-	  is a newer type of flash chip design than the traditional NOR flash,
-	  with higher density but a handful of characteristics which make it
-	  more interesting for the file system to use. Support for NAND flash
-	  is not yet complete and may corrupt data. For further information,
-	  including a link to the mailing list where details of the remaining
-	  work to be completed for NAND flash support can be found, see the 
-	  JFFS2 web site at <http://sources.redhat.com/jffs2>.
+	  This enables the write-buffering support in JFFS2.
 
-	  Say 'N' unless you have NAND flash and you are willing to test and
-	  develop JFFS2 support for it.
-
-config JFFS2_FS_NOR_ECC
-	bool "JFFS2 support for ECC'd NOR flash (EXPERIMENTAL)"
-	   depends on JFFS2_FS && EXPERIMENTAL
-	   default n
-	   help
-	     This enables the experimental support for NOR flash with transparent
-		 ECC for JFFS2.  This type of flash chip is not common, however it is
-		 available from STMicro.
-
-config JFFS2_FS_DATAFLASH
-	bool "JFFS2 support for DataFlash (EXPERIMENTAL)"
-	depends on JFFS2_FS && EXPERIMENTAL
-	default n
-	help
-	  This enables the experimental support for JFFS2 on DataFlash devices.
+	  This functionality is required to support JFFS2 on the following
+	  types of flash devices:
+	    - NAND flash
+	    - NOR flash with transparent ECC
+	    - DataFlash
 
 config JFFS2_COMPRESSION_OPTIONS
 	bool "Advanced compression options for JFFS2"
diff -urN -x CVS mtd/fs/jffs2/Makefile.24 mtd.new/fs/jffs2/Makefile.24
--- mtd/fs/jffs2/Makefile.24	Thu Jan 27 19:24:55 2005
+++ mtd.new/fs/jffs2/Makefile.24	Thu Feb  3 15:02:21 2005
@@ -29,14 +29,13 @@
 
 LINUX_OBJS += super-v24.o crc32.o rbtree.o
 
-NAND_OBJS-$(CONFIG_JFFS2_FS_NAND) += wbuf.o
-NAND_OBJS-$(CONFIG_JFFS2_FS_DATAFLASH) += wbuf.o
+WBUF_OBJS-$(CONFIG_JFFS2_FS_WRITEBUFFER) += wbuf.o
 
 COMPR_OBJS-$(CONFIG_JFFS2_RUBIN)  += compr_rubin.o
 COMPR_OBJS-$(CONFIG_JFFS2_RTIME)  += compr_rtime.o
 COMPR_OBJS-$(CONFIG_JFFS2_ZLIB)   += compr_zlib.o
 
-obj-y := $(COMPR_OBJS-y) $(JFFS2_OBJS) $(LINUX_OBJS) $(NAND_OBJS-y)
+obj-y := $(COMPR_OBJS-y) $(JFFS2_OBJS) $(LINUX_OBJS) $(WBUF_OBJS-y)
 O_TARGET := jffs2.o
 
 include $(TOPDIR)/Rules.make
diff -urN -x CVS mtd/fs/jffs2/Makefile.common mtd.new/fs/jffs2/Makefile.common
--- mtd/fs/jffs2/Makefile.common	Mon Jan 31 14:33:12 2005
+++ mtd.new/fs/jffs2/Makefile.common	Thu Feb  3 15:09:22 2005
@@ -11,9 +11,7 @@
 jffs2-y	+= symlink.o build.o erase.o background.o fs.o writev.o
 jffs2-y	+= super.o
 
-jffs2-$(CONFIG_JFFS2_FS_NAND)	+= wbuf.o
-jffs2-$(CONFIG_JFFS2_FS_NOR_ECC) += wbuf.o
-jffs2-$(CONFIG_JFFS2_FS_DATAFLASH) += wbuf.o
+jffs2-$(CONFIG_JFFS2_FS_WRITEBUFFER)	+= wbuf.o
 jffs2-$(CONFIG_JFFS2_RUBIN)	+= compr_rubin.o
 jffs2-$(CONFIG_JFFS2_RTIME)	+= compr_rtime.o
 jffs2-$(CONFIG_JFFS2_ZLIB)	+= compr_zlib.o
diff -urN -x CVS mtd/fs/jffs2/defconfig mtd.new/fs/jffs2/defconfig
--- mtd/fs/jffs2/defconfig	Tue May 27 11:35:22 2003
+++ mtd.new/fs/jffs2/defconfig	Thu Feb  3 15:03:21 2005
@@ -2,7 +2,7 @@
 
 CONFIG_JFFS2_FS=m
 ifdef NONAND
-CONFIG_JFFS2_FS_NAND=n
+CONFIG_JFFS2_FS_WRITEBUFFER=n
 else
-CONFIG_JFFS2_FS_NAND=y
+CONFIG_JFFS2_FS_WRITEBUFFER=y
 endif
diff -urN -x CVS mtd/fs/jffs2/ecos/cdl/jffs2.cdl mtd.new/fs/jffs2/ecos/cdl/jffs2.cdl
--- mtd/fs/jffs2/ecos/cdl/jffs2.cdl	Wed Jan 26 16:08:00 2005
+++ mtd.new/fs/jffs2/ecos/cdl/jffs2.cdl	Thu Feb  3 15:08:30 2005
@@ -132,7 +132,7 @@
     cdl_option CYGOPT_FS_JFFS2_NAND {
 	display         "Support for NAND flash"
 	flavor          bool
-	define          CONFIG_JFFS2_FS_NAND
+	define          CONFIG_JFFS2_FS_WRITEBUFFER
 	compile         wbuf.c
         requires        0
         description     "
diff -urN -x CVS mtd/fs/jffs2/ecos/src/os-ecos.h mtd.new/fs/jffs2/ecos/src/os-ecos.h
--- mtd/fs/jffs2/ecos/src/os-ecos.h	Wed Jan 26 16:08:01 2005
+++ mtd.new/fs/jffs2/ecos/src/os-ecos.h	Thu Feb  3 15:08:55 2005
@@ -196,7 +196,7 @@
 static inline void jffs2_erase_pending_trigger(struct jffs2_sb_info *c)
 { }
 
-#ifndef CONFIG_JFFS2_FS_NAND
+#ifndef CONFIG_JFFS2_FS_WRITEBUFFER
 #define jffs2_can_mark_obsolete(c) (1)
 #define jffs2_cleanmarker_oob(c) (0)
 #define jffs2_write_nand_cleanmarker(c,jeb) (-EIO)
diff -urN -x CVS mtd/fs/jffs2/fs.c mtd.new/fs/jffs2/fs.c
--- mtd/fs/jffs2/fs.c	Fri Jan 28 12:16:15 2005
+++ mtd.new/fs/jffs2/fs.c	Thu Feb  3 15:03:53 2005
@@ -449,13 +449,11 @@
 
 	c = JFFS2_SB_INFO(sb);
 
-#ifndef CONFIG_JFFS2_FS_NAND
+#ifndef CONFIG_JFFS2_FS_WRITEBUFFER
 	if (c->mtd->type == MTD_NANDFLASH) {
 		printk(KERN_ERR "jffs2: Cannot operate on NAND flash unless jffs2 NAND support is compiled in.\n");
 		return -EINVAL;
 	}
-#endif
-#ifndef CONFIG_JFFS2_FS_DATAFLASH
 	if (c->mtd->type == MTD_DATAFLASH) {
 		printk(KERN_ERR "jffs2: Cannot operate on DataFlash unless jffs2 DataFlash support is compiled in.\n");
 		return -EINVAL;
diff -urN -x CVS mtd/fs/jffs2/nodelist.h mtd.new/fs/jffs2/nodelist.h
--- mtd/fs/jffs2/nodelist.h	Wed Jan 26 16:07:57 2005
+++ mtd.new/fs/jffs2/nodelist.h	Thu Feb  3 15:07:38 2005
@@ -463,7 +463,7 @@
 void jffs2_erase_block(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb);
 void jffs2_erase_pending_blocks(struct jffs2_sb_info *c, int count);
 
-#ifdef CONFIG_JFFS2_FS_NAND
+#ifdef CONFIG_JFFS2_FS_WRITEBUFFER
 /* wbuf.c */
 int jffs2_flush_wbuf_gc(struct jffs2_sb_info *c, uint32_t ino);
 int jffs2_flush_wbuf_pad(struct jffs2_sb_info *c);
diff -urN -x CVS mtd/fs/jffs2/os-linux.h mtd.new/fs/jffs2/os-linux.h
--- mtd/fs/jffs2/os-linux.h	Wed Feb  2 18:48:25 2005
+++ mtd.new/fs/jffs2/os-linux.h	Thu Feb  3 15:23:28 2005
@@ -97,16 +97,12 @@
 #endif
 }
 
-#ifdef CONFIG_JFFS2_FS_DATAFLASH
-#define SECTOR_ADDR(x) ( ((unsigned long)(x) / (unsigned long)(c->sector_size)) * c->sector_size )
-#else
-#define SECTOR_ADDR(x) ( ((unsigned long)(x) & ~(c->sector_size-1)) )
-#endif
 
 #define jffs2_is_readonly(c) (OFNI_BS_2SFFJ(c)->s_flags & MS_RDONLY)
 #define jffs2_is_writebuffered(c) (c->wbuf != NULL)
 
-#if (!defined CONFIG_JFFS2_FS_NAND && !defined CONFIG_JFFS2_FS_NOR_ECC && !defined CONFIG_JFFS2_FS_DATAFLASH)
+#ifndef CONFIG_JFFS2_FS_WRITEBUFFER
+#define SECTOR_ADDR(x) ( ((unsigned long)(x) & ~(c->sector_size-1)) )
 #define jffs2_can_mark_obsolete(c) (1)
 #define jffs2_cleanmarker_oob(c) (0)
 #define jffs2_write_nand_cleanmarker(c,jeb) (-EIO)
@@ -129,6 +125,7 @@
 
 #else /* NAND and/or ECC'd NOR support present */
 
+#define SECTOR_ADDR(x) ( ((unsigned long)(x) / (unsigned long)(c->sector_size)) * c->sector_size )
 #define jffs2_can_mark_obsolete(c) ((c->mtd->type == MTD_NORFLASH && !(c->mtd->flags & MTD_ECC)) || c->mtd->type == MTD_RAM)
 #define jffs2_cleanmarker_oob(c) (c->mtd->type == MTD_NANDFLASH)
 
@@ -150,25 +147,16 @@
 int jffs2_flush_wbuf_pad(struct jffs2_sb_info *c);
 int jffs2_nand_flash_setup(struct jffs2_sb_info *c);
 void jffs2_nand_flash_cleanup(struct jffs2_sb_info *c);
-#ifdef CONFIG_JFFS2_FS_NOR_ECC
+
 #define jffs2_nor_ecc(c) (c->mtd->type == MTD_NORFLASH && (c->mtd->flags & MTD_ECC))
 int jffs2_nor_ecc_flash_setup(struct jffs2_sb_info *c);
 void jffs2_nor_ecc_flash_cleanup(struct jffs2_sb_info *c);
-#else
-#define jffs2_nor_ecc(c) (0)
-#define jffs2_nor_ecc_flash_setup(c) (0)
-#define jffs2_nor_ecc_flash_cleanup(c) do {} while (0)
-#endif /* NOR ECC */
-#ifdef CONFIG_JFFS2_FS_DATAFLASH
+
 #define jffs2_dataflash(c) (c->mtd->type == MTD_DATAFLASH)
 int jffs2_dataflash_setup(struct jffs2_sb_info *c);
 void jffs2_dataflash_cleanup(struct jffs2_sb_info *c);
-#else
-#define jffs2_dataflash(c) (0)
-#define jffs2_dataflash_setup(c) (0)
-#define jffs2_dataflash_cleanup(c) do {} while (0)
-#endif /* DATAFLASH */
-#endif /* NAND */
+
+#endif /* WRITEBUFFER */
 
 /* erase.c */
 static inline void jffs2_erase_pending_trigger(struct jffs2_sb_info *c)
diff -urN -x CVS mtd/fs/jffs2/scan.c mtd.new/fs/jffs2/scan.c
--- mtd/fs/jffs2/scan.c	Fri Jan 28 11:36:06 2005
+++ mtd.new/fs/jffs2/scan.c	Thu Feb  3 15:14:48 2005
@@ -68,7 +68,7 @@
 static inline int min_free(struct jffs2_sb_info *c)
 {
 	uint32_t min = 2 * sizeof(struct jffs2_raw_inode);
-#if defined CONFIG_JFFS2_FS_NAND || defined CONFIG_JFFS2_FS_NOR_ECC || defined CONFIG_JFFS2_FS_DATAFLASH
+#ifdef CONFIG_JFFS2_FS_WRITEBUFFER
 	if (!jffs2_can_mark_obsolete(c) && min < c->wbuf_pagesize)
 		return c->wbuf_pagesize;
 #endif
@@ -228,7 +228,7 @@
 		c->dirty_size -= c->nextblock->dirty_size;
 		c->nextblock->dirty_size = 0;
 	}
-#if defined CONFIG_JFFS2_FS_NAND || defined CONFIG_JFFS2_FS_NOR_ECC || defined CONFIG_JFFS2_FS_DATAFLASH
+#ifdef CONFIG_JFFS2_FS_WRITEBUFFER
 	if (!jffs2_can_mark_obsolete(c) && c->nextblock && (c->nextblock->free_size & (c->wbuf_pagesize-1))) {
 		/* If we're going to start writing into a block which already 
 		   contains data, and the end of the data isn't page-aligned,
@@ -294,7 +294,7 @@
 	uint32_t hdr_crc, buf_ofs, buf_len;
 	int err;
 	int noise = 0;
-#ifdef CONFIG_JFFS2_FS_NAND
+#ifdef CONFIG_JFFS2_FS_WRITEBUFFER
 	int cleanmarkerfound = 0;
 #endif
 
@@ -303,7 +303,7 @@
 
 	D1(printk(KERN_DEBUG "jffs2_scan_eraseblock(): Scanning block at 0x%x\n", ofs));
 
-#ifdef CONFIG_JFFS2_FS_NAND
+#ifdef CONFIG_JFFS2_FS_WRITEBUFFER
 	if (jffs2_cleanmarker_oob(c)) {
 		int ret = jffs2_check_nand_cleanmarker(c, jeb);
 		D2(printk(KERN_NOTICE "jffs_check_nand_cleanmarker returned %d\n",ret));
@@ -338,7 +338,7 @@
 		ofs += 4;
 
 	if (ofs == EMPTY_SCAN_SIZE(c->sector_size)) {
-#ifdef CONFIG_JFFS2_FS_NAND
+#ifdef CONFIG_JFFS2_FS_WRITEBUFFER
 		if (jffs2_cleanmarker_oob(c)) {
 			/* scan oob, take care of cleanmarker */
 			int ret = jffs2_check_oob_empty(c, jeb, cleanmarkerfound);
diff -urN -x CVS mtd/fs/jffs2/super-v24.c mtd.new/fs/jffs2/super-v24.c
--- mtd/fs/jffs2/super-v24.c	Wed Jan 26 16:07:58 2005
+++ mtd.new/fs/jffs2/super-v24.c	Thu Feb  3 15:06:27 2005
@@ -110,7 +110,7 @@
 	int ret;
 
 	printk(KERN_INFO "JFFS2 version 2.2."
-#ifdef CONFIG_JFFS2_FS_NAND
+#ifdef CONFIG_JFFS2_FS_WRITEBUFFER
 	       " (NAND)"
 #endif
 	       " (C) 2001-2003 Red Hat, Inc.\n");
diff -urN -x CVS mtd/fs/jffs2/super.c mtd.new/fs/jffs2/super.c
--- mtd/fs/jffs2/super.c	Wed Jan 26 16:07:58 2005
+++ mtd.new/fs/jffs2/super.c	Thu Feb  3 15:05:58 2005
@@ -309,7 +309,7 @@
 	int ret;
 
 	printk(KERN_INFO "JFFS2 version 2.2."
-#ifdef CONFIG_JFFS2_FS_NAND
+#ifdef CONFIG_JFFS2_FS_WRITEBUFFER
 	       " (NAND)"
 #endif
 	       " (C) 2001-2003 Red Hat, Inc.\n");
diff -urN -x CVS mtd/fs/jffs2/wbuf.c mtd.new/fs/jffs2/wbuf.c
--- mtd/fs/jffs2/wbuf.c	Tue Feb  1 09:38:41 2005
+++ mtd.new/fs/jffs2/wbuf.c	Thu Feb  3 15:22:17 2005
@@ -598,7 +598,7 @@
 	return ret;
 }
 
-#ifdef CONFIG_JFFS2_FS_DATAFLASH
+#ifdef CONFIG_JFFS2_FS_WRITEBUFFER
 #define PAGE_DIV(x) ( ((unsigned long)(x) / (unsigned long)(c->wbuf_pagesize)) * (unsigned long)(c->wbuf_pagesize) )
 #define PAGE_MOD(x) ( (unsigned long)(x) % (unsigned long)(c->wbuf_pagesize) )
 #else
@@ -1189,7 +1189,6 @@
 	kfree(c->wbuf);
 }
 
-#ifdef CONFIG_JFFS2_FS_DATAFLASH
 int jffs2_dataflash_setup(struct jffs2_sb_info *c) {
 	c->cleanmarker_size = 0;		/* No cleanmarkers needed */
 	
@@ -1210,9 +1209,7 @@
 void jffs2_dataflash_cleanup(struct jffs2_sb_info *c) {
 	kfree(c->wbuf);
 }
-#endif
 
-#ifdef CONFIG_JFFS2_FS_NOR_ECC
 int jffs2_nor_ecc_flash_setup(struct jffs2_sb_info *c) {
 	/* Cleanmarker is actually larger on the flashes */
 	c->cleanmarker_size = 16;
@@ -1232,4 +1229,3 @@
 void jffs2_nor_ecc_flash_cleanup(struct jffs2_sb_info *c) {
 	kfree(c->wbuf);
 }
-#endif
diff -urN -x CVS mtd/include/linux/config.h mtd.new/include/linux/config.h
--- mtd/include/linux/config.h	Sat Jul 10 23:14:18 2004
+++ mtd.new/include/linux/config.h	Thu Feb  3 15:25:31 2005
@@ -35,7 +35,7 @@
 #endif /* MTD_OUT_OF_TREE */
 
 #ifndef NONAND
-#define CONFIG_JFFS2_FS_NAND 1
+#define CONFIG_JFFS2_FS_WRITEBUFFER 1
 #endif
 
 #endif /* __MTD_CONFIG_H__ */
diff -urN -x CVS mtd/include/linux/jffs2_fs_sb.h mtd.new/include/linux/jffs2_fs_sb.h
--- mtd/include/linux/jffs2_fs_sb.h	Fri Jan 28 11:31:51 2005
+++ mtd.new/include/linux/jffs2_fs_sb.h	Thu Feb  3 15:24:34 2005
@@ -94,7 +94,7 @@
 	   to an obsoleted node. I don't like this. Alternatives welcomed. */
 	struct semaphore erase_free_sem;
 
-#if defined CONFIG_JFFS2_FS_NAND || defined CONFIG_JFFS2_FS_NOR_ECC || defined CONFIG_JFFS2_FS_DATAFLASH
+#ifdef CONFIG_JFFS2_FS_WRITEBUFFER
 	/* Write-behind buffer for NAND flash */
 	unsigned char *wbuf;
 	uint32_t wbuf_ofs;
diff -urN -x CVS mtd/patches/Configure.help mtd.new/patches/Configure.help
--- mtd/patches/Configure.help	Tue Aug 19 11:24:36 2003
+++ mtd.new/patches/Configure.help	Thu Feb  3 15:27:22 2005
@@ -829,8 +829,13 @@
   If reporting bugs, please try to have available a full dump of the
   messages at debug level 1 while the misbehaviour was occurring.
 
-CONFIG_JFFS2_FS_NAND
-  Enables JFFS2 support for NAND FLASH.
+CONFIG_JFFS2_FS_WRITEBUFFER
+  This enables the write-buffering support in JFFS2.
+  This functionality is required to support JFFS2 on the following
+  types of flash devices:
+    - NAND flash
+    - NOR flash with transparent ECC
+    - DataFlash
 
 Flash chip mapping on the Flaga Digital Module
 CONFIG_MTD_CFI_FLAGADM







More information about the linux-mtd mailing list