提交 e2bfb088 编写于 作者: T Theodore Ts'o

ext4: don't orphan or truncate the boot loader inode

The boot loader inode (inode #5) should never be visible in the
directory hierarchy, but it's possible if the file system is corrupted
that there will be a directory entry that points at inode #5.  In
order to avoid accidentally trashing it, when such a directory inode
is opened, the inode will be marked as a bad inode, so that it's not
possible to modify (or read) the inode from userspace.

Unfortunately, when we unlink this (invalid/illegal) directory entry,
we will put the bad inode on the ophan list, and then when try to
unlink the directory, we don't actually remove the bad inode from the
orphan list before freeing in-memory inode structure.  This means the
in-memory orphan list is corrupted, leading to a kernel oops.

In addition, avoid truncating a bad inode in ext4_destroy_inode(),
since truncating the boot loader inode is not a smart thing to do.
Reported-by: NSami Liedes <sami.liedes@iki.fi>
Reviewed-by: NJan Kara <jack@suse.cz>
Signed-off-by: NTheodore Ts'o <tytso@mit.edu>
Cc: stable@vger.kernel.org
上级 3e67cfad
...@@ -224,16 +224,15 @@ void ext4_evict_inode(struct inode *inode) ...@@ -224,16 +224,15 @@ void ext4_evict_inode(struct inode *inode)
goto no_delete; goto no_delete;
} }
if (!is_bad_inode(inode)) if (is_bad_inode(inode))
dquot_initialize(inode); goto no_delete;
dquot_initialize(inode);
if (ext4_should_order_data(inode)) if (ext4_should_order_data(inode))
ext4_begin_ordered_truncate(inode, 0); ext4_begin_ordered_truncate(inode, 0);
truncate_inode_pages_final(&inode->i_data); truncate_inode_pages_final(&inode->i_data);
WARN_ON(atomic_read(&EXT4_I(inode)->i_ioend_count)); WARN_ON(atomic_read(&EXT4_I(inode)->i_ioend_count));
if (is_bad_inode(inode))
goto no_delete;
/* /*
* Protect us against freezing - iput() caller didn't have to have any * Protect us against freezing - iput() caller didn't have to have any
......
...@@ -2544,7 +2544,7 @@ int ext4_orphan_add(handle_t *handle, struct inode *inode) ...@@ -2544,7 +2544,7 @@ int ext4_orphan_add(handle_t *handle, struct inode *inode)
int err = 0, rc; int err = 0, rc;
bool dirty = false; bool dirty = false;
if (!sbi->s_journal) if (!sbi->s_journal || is_bad_inode(inode))
return 0; return 0;
WARN_ON_ONCE(!(inode->i_state & (I_NEW | I_FREEING)) && WARN_ON_ONCE(!(inode->i_state & (I_NEW | I_FREEING)) &&
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册