diff options
author | KaiGai Kohei <kaigai@ak.jp.nec.com> | 2006-06-23 20:15:36 -0400 |
---|---|---|
committer | David Woodhouse <dwmw2@infradead.org> | 2006-06-27 11:18:30 -0400 |
commit | 355ed4e141203fd7266ef9d90d57be0c61bd1aa4 (patch) | |
tree | 24abb6d9ee1ae95e41d7db13f90200adf734eb4e | |
parent | 8a13695cbe4e8311b363f9bd25162904b984ca74 (diff) |
[JFFS2][XATTR] Fix memory leak with jffs2_xattr_ref
If xattr_ref is associated with an orphan inode_cache
on filesystem mounting, those xattr_refs are not
released even if this inode_cache is released.
This patch enables to call jffs2_xattr_delete_inode()
for such a irregular inode_cachde too.
Signed-off-by: KaiGai Kohei <kaigai@ak.jp.nec.com>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
-rw-r--r-- | fs/jffs2/fs.c | 2 | ||||
-rw-r--r-- | fs/jffs2/gc.c | 1 | ||||
-rw-r--r-- | fs/jffs2/nodelist.c | 3 | ||||
-rw-r--r-- | fs/jffs2/readinode.c | 1 |
4 files changed, 5 insertions, 2 deletions
diff --git a/fs/jffs2/fs.c b/fs/jffs2/fs.c index 2900ec3ec3af..97caa77d60cf 100644 --- a/fs/jffs2/fs.c +++ b/fs/jffs2/fs.c | |||
@@ -227,8 +227,6 @@ void jffs2_clear_inode (struct inode *inode) | |||
227 | struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); | 227 | struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); |
228 | 228 | ||
229 | D1(printk(KERN_DEBUG "jffs2_clear_inode(): ino #%lu mode %o\n", inode->i_ino, inode->i_mode)); | 229 | D1(printk(KERN_DEBUG "jffs2_clear_inode(): ino #%lu mode %o\n", inode->i_ino, inode->i_mode)); |
230 | |||
231 | jffs2_xattr_delete_inode(c, f->inocache); | ||
232 | jffs2_do_clear_inode(c, f); | 230 | jffs2_do_clear_inode(c, f); |
233 | } | 231 | } |
234 | 232 | ||
diff --git a/fs/jffs2/gc.c b/fs/jffs2/gc.c index f59b147661c9..daff3341ff92 100644 --- a/fs/jffs2/gc.c +++ b/fs/jffs2/gc.c | |||
@@ -165,6 +165,7 @@ int jffs2_garbage_collect_pass(struct jffs2_sb_info *c) | |||
165 | D1(printk(KERN_DEBUG "Skipping check of ino #%d with nlink zero\n", | 165 | D1(printk(KERN_DEBUG "Skipping check of ino #%d with nlink zero\n", |
166 | ic->ino)); | 166 | ic->ino)); |
167 | spin_unlock(&c->inocache_lock); | 167 | spin_unlock(&c->inocache_lock); |
168 | jffs2_xattr_delete_inode(c, ic); | ||
168 | continue; | 169 | continue; |
169 | } | 170 | } |
170 | switch(ic->state) { | 171 | switch(ic->state) { |
diff --git a/fs/jffs2/nodelist.c b/fs/jffs2/nodelist.c index 927dfe42ba76..7675b33396c7 100644 --- a/fs/jffs2/nodelist.c +++ b/fs/jffs2/nodelist.c | |||
@@ -906,6 +906,9 @@ void jffs2_del_ino_cache(struct jffs2_sb_info *c, struct jffs2_inode_cache *old) | |||
906 | { | 906 | { |
907 | struct jffs2_inode_cache **prev; | 907 | struct jffs2_inode_cache **prev; |
908 | 908 | ||
909 | #ifdef CONFIG_JFFS2_FS_XATTR | ||
910 | BUG_ON(old->xref); | ||
911 | #endif | ||
909 | dbg_inocache("del %p (ino #%u)\n", old, old->ino); | 912 | dbg_inocache("del %p (ino #%u)\n", old, old->ino); |
910 | spin_lock(&c->inocache_lock); | 913 | spin_lock(&c->inocache_lock); |
911 | 914 | ||
diff --git a/fs/jffs2/readinode.c b/fs/jffs2/readinode.c index 5fec012b02ed..cc1899268c43 100644 --- a/fs/jffs2/readinode.c +++ b/fs/jffs2/readinode.c | |||
@@ -968,6 +968,7 @@ void jffs2_do_clear_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f) | |||
968 | struct jffs2_full_dirent *fd, *fds; | 968 | struct jffs2_full_dirent *fd, *fds; |
969 | int deleted; | 969 | int deleted; |
970 | 970 | ||
971 | jffs2_xattr_delete_inode(c, f->inocache); | ||
971 | down(&f->sem); | 972 | down(&f->sem); |
972 | deleted = f->inocache && !f->inocache->nlink; | 973 | deleted = f->inocache && !f->inocache->nlink; |
973 | 974 | ||