diff options
author | Artem B. Bityuckiy <dedekind@infradead.org> | 2005-02-28 03:21:09 -0500 |
---|---|---|
committer | Thomas Gleixner <tglx@mtd.linutronix.de> | 2005-05-23 06:47:15 -0400 |
commit | 31fbdf7aa5aac8a2a34f180a25deb157297a10c9 (patch) | |
tree | 2189fa2b2f74789e259724719826f6508ae305da /fs/jffs2/build.c | |
parent | 67e345d17ff8c2085a54c293001ae548f7be7b21 (diff) |
[JFFS2] Fix NOR specific scan BUG
Fix fairly sad NOR-specific bug - during FS building ic->scan_dents
isn't zero, but jffs2_mark_node_obsolete() migt be called it tries to
finde the ic corresponding to ref - this requires ic->scan_dents = 0.
Signed-off-by: Artem B. Bityuckiy <dedekind@infradead.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'fs/jffs2/build.c')
-rw-r--r-- | fs/jffs2/build.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/fs/jffs2/build.c b/fs/jffs2/build.c index a01dd5fdbb95..3dd5394921c9 100644 --- a/fs/jffs2/build.c +++ b/fs/jffs2/build.c | |||
@@ -7,7 +7,7 @@ | |||
7 | * | 7 | * |
8 | * For licensing information, see the file 'LICENCE' in this directory. | 8 | * For licensing information, see the file 'LICENCE' in this directory. |
9 | * | 9 | * |
10 | * $Id: build.c,v 1.69 2004/12/16 20:22:18 dmarlin Exp $ | 10 | * $Id: build.c,v 1.70 2005/02/28 08:21:05 dedekind Exp $ |
11 | * | 11 | * |
12 | */ | 12 | */ |
13 | 13 | ||
@@ -97,14 +97,16 @@ static int jffs2_build_filesystem(struct jffs2_sb_info *c) | |||
97 | /* First, scan the medium and build all the inode caches with | 97 | /* First, scan the medium and build all the inode caches with |
98 | lists of physical nodes */ | 98 | lists of physical nodes */ |
99 | 99 | ||
100 | c->flags |= JFFS2_SB_FLAG_MOUNTING; | 100 | c->flags |= JFFS2_SB_FLAG_SCANNING; |
101 | ret = jffs2_scan_medium(c); | 101 | ret = jffs2_scan_medium(c); |
102 | c->flags &= ~JFFS2_SB_FLAG_SCANNING; | ||
102 | if (ret) | 103 | if (ret) |
103 | goto exit; | 104 | goto exit; |
104 | 105 | ||
105 | D1(printk(KERN_DEBUG "Scanned flash completely\n")); | 106 | D1(printk(KERN_DEBUG "Scanned flash completely\n")); |
106 | D2(jffs2_dump_block_lists(c)); | 107 | D2(jffs2_dump_block_lists(c)); |
107 | 108 | ||
109 | c->flags |= JFFS2_SB_FLAG_BUILDING; | ||
108 | /* Now scan the directory tree, increasing nlink according to every dirent found. */ | 110 | /* Now scan the directory tree, increasing nlink according to every dirent found. */ |
109 | for_each_inode(i, c, ic) { | 111 | for_each_inode(i, c, ic) { |
110 | D1(printk(KERN_DEBUG "Pass 1: ino #%u\n", ic->ino)); | 112 | D1(printk(KERN_DEBUG "Pass 1: ino #%u\n", ic->ino)); |
@@ -116,7 +118,6 @@ static int jffs2_build_filesystem(struct jffs2_sb_info *c) | |||
116 | cond_resched(); | 118 | cond_resched(); |
117 | } | 119 | } |
118 | } | 120 | } |
119 | c->flags &= ~JFFS2_SB_FLAG_MOUNTING; | ||
120 | 121 | ||
121 | D1(printk(KERN_DEBUG "Pass 1 complete\n")); | 122 | D1(printk(KERN_DEBUG "Pass 1 complete\n")); |
122 | 123 | ||
@@ -164,6 +165,8 @@ static int jffs2_build_filesystem(struct jffs2_sb_info *c) | |||
164 | ic->scan_dents = NULL; | 165 | ic->scan_dents = NULL; |
165 | cond_resched(); | 166 | cond_resched(); |
166 | } | 167 | } |
168 | c->flags &= ~JFFS2_SB_FLAG_BUILDING; | ||
169 | |||
167 | D1(printk(KERN_DEBUG "Pass 3 complete\n")); | 170 | D1(printk(KERN_DEBUG "Pass 3 complete\n")); |
168 | D2(jffs2_dump_block_lists(c)); | 171 | D2(jffs2_dump_block_lists(c)); |
169 | 172 | ||