Fix infinite loop when parsing numeric trace flags written to /proc/yaffs.
[yaffs2.git] / yaffs_fs.c
index 15c27832ef4f233db22e3f97470610522bdacb8c..b83794f5d69e54c959d7bf54f1796c41d9734da4 100644 (file)
@@ -32,7 +32,7 @@
  */
 
 const char *yaffs_fs_c_version =
-    "$Id: yaffs_fs.c,v 1.60 2007-05-15 20:07:40 charles Exp $";
+    "$Id: yaffs_fs.c,v 1.62 2007-08-16 20:42:11 imcd Exp $";
 extern const char *yaffs_guts_c_version;
 
 #include <linux/version.h>
@@ -89,13 +89,23 @@ extern const char *yaffs_guts_c_version;
 #include "yportenv.h"
 #include "yaffs_guts.h"
 
-unsigned yaffs_traceMask = YAFFS_TRACE_BAD_BLOCKS
-                          /* | 0xFFFFFFFF */; 
-
 #include <linux/mtd/mtd.h>
 #include "yaffs_mtdif.h"
+#include "yaffs_mtdif1.h"
 #include "yaffs_mtdif2.h"
 
+unsigned int yaffs_traceMask = YAFFS_TRACE_BAD_BLOCKS;
+unsigned int yaffs_wr_attempts = YAFFS_WR_ATTEMPTS;
+
+/* Module Parameters */
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
+module_param(yaffs_traceMask,uint,0644);
+module_param(yaffs_wr_attempts,uint,0644);
+#else
+MODULE_PARM(yaffs_traceMask,"i");
+MODULE_PARM(yaffs_wr_attempts,"i");
+#endif
+
 /*#define T(x) printk x */
 
 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18))
@@ -1778,8 +1788,18 @@ static struct super_block *yaffs_internal_read_super(int yaffsVersion,
                dev->startBlock = 0;
                dev->endBlock = nBlocks - 1;
        } else {
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,17))
+               /* use the MTD interface in yaffs_mtdif1.c */
+               dev->writeChunkWithTagsToNAND =
+                       nandmtd1_WriteChunkWithTagsToNAND;
+               dev->readChunkWithTagsFromNAND =
+                       nandmtd1_ReadChunkWithTagsFromNAND;
+               dev->markNANDBlockBad = nandmtd1_MarkNANDBlockBad;
+               dev->queryNANDBlock = nandmtd1_QueryNANDBlock;
+#else
                dev->writeChunkToNAND = nandmtd_WriteChunkToNAND;
                dev->readChunkFromNAND = nandmtd_ReadChunkFromNAND;
+#endif
                dev->isYaffs2 = 0;
        }
        /* ... and common functions */
@@ -2108,6 +2128,7 @@ static int yaffs_proc_write(struct file *file, const char *buf,
                if (end > buf + pos) {
                        mask_name = "numeral";
                        len = end - (buf + pos);
+                       pos += len;
                        done = 0;
                } else {
                        for(x = buf + pos, i = 0; 
@@ -2117,8 +2138,6 @@ static int yaffs_proc_write(struct file *file, const char *buf,
                        substring[i] = '\0';
                        
                        for (i = 0; mask_flags[i].mask_name != NULL; i++) {
-                               //len = strlen(mask_flags[i].mask_name);
-                               //if (strncmp(buf + pos, mask_flags[i].mask_name, len) == 0) {
                                if(strcmp(substring,mask_flags[i].mask_name) == 0){
                                        mask_name = mask_flags[i].mask_name;
                                        mask_bitfield = mask_flags[i].mask_bitfield;
@@ -2129,7 +2148,6 @@ static int yaffs_proc_write(struct file *file, const char *buf,
                }
 
                if (mask_name != NULL) {
-                       // pos += len;
                        done = 0;
                        switch(add) {
                        case '-':