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 | ||
