mirror of
https://github.com/team-infusion-developers/android_kernel_samsung_msm8976.git
synced 2024-11-07 04:09:21 +00:00
logfs: destroy the reserved inodes while unmounting
We were assuming that the evict_inode() would never be called on
reserved inodes. However, (after the commit 8e22c1a4e
logfs: get rid
of magical inodes) while unmounting the file system, in put_super, we
call iput() on all of the reserved inodes.
The following simple test used to cause a kernel panic on LogFS:
1. Mount a LogFS file system on /mnt
2. Create a file
$ touch /mnt/a
3. Try to unmount the FS
$ umount /mnt
The simple fix would be to drop the assumption and properly destroy
the reserved inodes.
Signed-off-by: Prasad Joshi <prasadjoshi.linux@gmail.com>
This commit is contained in:
parent
dd775ae254
commit
d2dcd9083f
3 changed files with 17 additions and 2 deletions
|
@ -156,10 +156,26 @@ static void __logfs_destroy_inode(struct inode *inode)
|
|||
call_rcu(&inode->i_rcu, logfs_i_callback);
|
||||
}
|
||||
|
||||
static void __logfs_destroy_meta_inode(struct inode *inode)
|
||||
{
|
||||
struct logfs_inode *li = logfs_inode(inode);
|
||||
BUG_ON(li->li_block);
|
||||
call_rcu(&inode->i_rcu, logfs_i_callback);
|
||||
}
|
||||
|
||||
static void logfs_destroy_inode(struct inode *inode)
|
||||
{
|
||||
struct logfs_inode *li = logfs_inode(inode);
|
||||
|
||||
if (inode->i_ino < LOGFS_RESERVED_INOS) {
|
||||
/*
|
||||
* The reserved inodes are never destroyed unless we are in
|
||||
* unmont path.
|
||||
*/
|
||||
__logfs_destroy_meta_inode(inode);
|
||||
return;
|
||||
}
|
||||
|
||||
BUG_ON(list_empty(&li->li_freeing_list));
|
||||
spin_lock(&logfs_inode_lock);
|
||||
li->li_refcount--;
|
||||
|
|
|
@ -2189,7 +2189,6 @@ void logfs_evict_inode(struct inode *inode)
|
|||
return;
|
||||
}
|
||||
|
||||
BUG_ON(inode->i_ino < LOGFS_RESERVED_INOS);
|
||||
page = inode_to_page(inode);
|
||||
BUG_ON(!page); /* FIXME: Use emergency page */
|
||||
logfs_put_write_page(page);
|
||||
|
|
|
@ -886,7 +886,7 @@ static struct logfs_area *alloc_area(struct super_block *sb)
|
|||
|
||||
static void map_invalidatepage(struct page *page, unsigned long l)
|
||||
{
|
||||
BUG();
|
||||
return;
|
||||
}
|
||||
|
||||
static int map_releasepage(struct page *page, gfp_t g)
|
||||
|
|
Loading…
Reference in a new issue