Skip to content

Commit

Permalink
fs/super.c: fix lru_list leak for real
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Al Viro committed Oct 1, 2013
1 parent 13f3583 commit c2d22ec
Showing 1 changed file with 2 additions and 2 deletions.
4 changes: 2 additions & 2 deletions fs/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit c2d22ec

Please sign in to comment.