mtd/fs/jffs2 build.c,1.60,1.61
Artem Bityuckiy
dedekind at infradead.org
Thu Nov 18 06:17:44 EST 2004
Update of /home/cvs/mtd/fs/jffs2
In directory phoenix.infradead.org:/tmp/cvs-serv21573
Modified Files:
build.c
Log Message:
Bugfix: do not forget to free memory if the jffs2_scan_inode_node()
fails.
Index: build.c
===================================================================
RCS file: /home/cvs/mtd/fs/jffs2/build.c,v
retrieving revision 1.60
retrieving revision 1.61
diff -u -r1.60 -r1.61
--- build.c 17 Nov 2004 17:13:13 -0000 1.60
+++ build.c 18 Nov 2004 11:17:41 -0000 1.61
@@ -89,6 +89,7 @@
int ret;
int i;
struct jffs2_inode_cache *ic;
+ struct jffs2_full_dirent *fd;
struct jffs2_full_dirent *dead_fds = NULL;
/* First, scan the medium and build all the inode caches with
@@ -97,7 +98,7 @@
c->flags |= JFFS2_SB_FLAG_MOUNTING;
ret = jffs2_scan_medium(c);
if (ret)
- return ret;
+ goto exit;;
D1(printk(KERN_DEBUG "Scanned flash completely\n"));
D2(jffs2_dump_block_lists(c));
@@ -136,9 +137,7 @@
D1(printk(KERN_DEBUG "Pass 2a starting\n"));
while (dead_fds) {
- struct jffs2_inode_cache *ic;
- struct jffs2_full_dirent *fd = dead_fds;
-
+ fd = dead_fds;
dead_fds = fd->next;
ic = jffs2_get_ino_cache(c, fd->ino);
@@ -153,7 +152,6 @@
/* Finally, we can scan again and free the dirent structs */
for_each_inode(i, c, ic) {
- struct jffs2_full_dirent *fd;
D1(printk(KERN_DEBUG "Pass 3: ino #%u, ic %p, nodes %p\n", ic->ino, ic, ic->nodes));
while(ic->scan_dents) {
@@ -170,6 +168,19 @@
/* Rotate the lists by some number to ensure wear levelling */
jffs2_rotate_lists(c);
+ ret = 0;
+
+exit:
+ if (ret) {
+ for_each_inode(i, c, ic) {
+ while(ic->scan_dents) {
+ fd = ic->scan_dents;
+ ic->scan_dents = fd->next;
+ jffs2_free_full_dirent(fd);
+ }
+ }
+ }
+
return ret;
}
More information about the linux-mtd-cvs
mailing list