ext4: fix null handler of ioctls in no journal mode
The EXT4_IOC_GROUP_ADD and EXT4_IOC_GROUP_EXTEND ioctls should not flush the journal in no_journal mode. Otherwise, running resize2fs on a mounted no_journal partition triggers the following error messages: BUG: unable to handle kernel NULL pointer dereference at 00000014 IP: [<c039d282>] _spin_lock+0x8/0x19 *pde = 00000000 Oops: 0002 [#1] SMP Signed-off-by: Peng Tao <bergwolf@gmail.com> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
This commit is contained in:
@@ -192,7 +192,7 @@ setversion_out:
|
|||||||
case EXT4_IOC_GROUP_EXTEND: {
|
case EXT4_IOC_GROUP_EXTEND: {
|
||||||
ext4_fsblk_t n_blocks_count;
|
ext4_fsblk_t n_blocks_count;
|
||||||
struct super_block *sb = inode->i_sb;
|
struct super_block *sb = inode->i_sb;
|
||||||
int err, err2;
|
int err, err2=0;
|
||||||
|
|
||||||
if (!capable(CAP_SYS_RESOURCE))
|
if (!capable(CAP_SYS_RESOURCE))
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
@@ -205,9 +205,11 @@ setversion_out:
|
|||||||
return err;
|
return err;
|
||||||
|
|
||||||
err = ext4_group_extend(sb, EXT4_SB(sb)->s_es, n_blocks_count);
|
err = ext4_group_extend(sb, EXT4_SB(sb)->s_es, n_blocks_count);
|
||||||
jbd2_journal_lock_updates(EXT4_SB(sb)->s_journal);
|
if (EXT4_SB(sb)->s_journal) {
|
||||||
err2 = jbd2_journal_flush(EXT4_SB(sb)->s_journal);
|
jbd2_journal_lock_updates(EXT4_SB(sb)->s_journal);
|
||||||
jbd2_journal_unlock_updates(EXT4_SB(sb)->s_journal);
|
err2 = jbd2_journal_flush(EXT4_SB(sb)->s_journal);
|
||||||
|
jbd2_journal_unlock_updates(EXT4_SB(sb)->s_journal);
|
||||||
|
}
|
||||||
if (err == 0)
|
if (err == 0)
|
||||||
err = err2;
|
err = err2;
|
||||||
mnt_drop_write(filp->f_path.mnt);
|
mnt_drop_write(filp->f_path.mnt);
|
||||||
@@ -252,7 +254,7 @@ setversion_out:
|
|||||||
case EXT4_IOC_GROUP_ADD: {
|
case EXT4_IOC_GROUP_ADD: {
|
||||||
struct ext4_new_group_data input;
|
struct ext4_new_group_data input;
|
||||||
struct super_block *sb = inode->i_sb;
|
struct super_block *sb = inode->i_sb;
|
||||||
int err, err2;
|
int err, err2=0;
|
||||||
|
|
||||||
if (!capable(CAP_SYS_RESOURCE))
|
if (!capable(CAP_SYS_RESOURCE))
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
@@ -266,9 +268,11 @@ setversion_out:
|
|||||||
return err;
|
return err;
|
||||||
|
|
||||||
err = ext4_group_add(sb, &input);
|
err = ext4_group_add(sb, &input);
|
||||||
jbd2_journal_lock_updates(EXT4_SB(sb)->s_journal);
|
if (EXT4_SB(sb)->s_journal) {
|
||||||
err2 = jbd2_journal_flush(EXT4_SB(sb)->s_journal);
|
jbd2_journal_lock_updates(EXT4_SB(sb)->s_journal);
|
||||||
jbd2_journal_unlock_updates(EXT4_SB(sb)->s_journal);
|
err2 = jbd2_journal_flush(EXT4_SB(sb)->s_journal);
|
||||||
|
jbd2_journal_unlock_updates(EXT4_SB(sb)->s_journal);
|
||||||
|
}
|
||||||
if (err == 0)
|
if (err == 0)
|
||||||
err = err2;
|
err = err2;
|
||||||
mnt_drop_write(filp->f_path.mnt);
|
mnt_drop_write(filp->f_path.mnt);
|
||||||
|
Reference in New Issue
Block a user