fs/super.c: fix lru_list leak for real
Freeing ->s_{inode,dentry}_lru in deactivate_locked_super() is wrong; the right place is destroy_super(). As it is, we leak them if sget() decides that new superblock it has allocated (and never shown to anybody) isn't needed and should be freed. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
13f3583892
commit
c2d22ecd3c
1 changed files with 2 additions and 2 deletions
|
@ -264,6 +264,8 @@ static struct super_block *alloc_super(struct file_system_type *type, int flags)
|
|||
*/
|
||||
static inline void destroy_super(struct super_block *s)
|
||||
{
|
||||
list_lru_destroy(&s->s_dentry_lru);
|
||||
list_lru_destroy(&s->s_inode_lru);
|
||||
#ifdef CONFIG_SMP
|
||||
free_percpu(s->s_files);
|
||||
#endif
|
||||
|
@ -323,8 +325,6 @@ void deactivate_locked_super(struct super_block *s)
|
|||
|
||||
/* caches are now gone, we can safely kill the shrinker now */
|
||||
unregister_shrinker(&s->s_shrink);
|
||||
list_lru_destroy(&s->s_dentry_lru);
|
||||
list_lru_destroy(&s->s_inode_lru);
|
||||
|
||||
put_filesystem(fs);
|
||||
put_super(s);
|
||||
|
|
Loading…
Reference in a new issue