(2011/11/15 17:07), Yongqiang Yang wrote: > delalloc blocks should be allocated before changing journal mode, > otherwise they can not be allocated and even more truncate on > delalloc blocks could triggre BUG by flushing delalloc buffers. > > Signed-off-by: Yongqiang Yang <xiaoqiangnk@xxxxxxxxx> > --- > fs/ext4/inode.c | 11 +++++++++++ > 1 files changed, 11 insertions(+), 0 deletions(-) > > diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c > index de05e86..384f8a7 100644 > --- a/fs/ext4/inode.c > +++ b/fs/ext4/inode.c > @@ -4676,6 +4676,17 @@ int ext4_change_inode_journal_flag(struct inode *inode, int val) > return 0; > if (is_journal_aborted(journal)) > return -EROFS; > + /* We have to allocate physical blocks for delalloc blocks > + * before flushing journal. otherwise delalloc blocks can not > + * be allocated any more. even more truncate on delalloc blocks > + * could trigger BUG by flushing delalloc blocks in journal. > + * There is no delalloc block in non-journal data mode. > + */ > + if (val && test_opt(inode->i_sb, DELALLOC)) { > + err = ext4_alloc_da_blocks(inode); > + if (err < 0) > + return err; > + } > > jbd2_journal_lock_updates(journal); > jbd2_journal_flush(journal); Though I tested your patch by my reproducer that caused a panic which you pointed out, a panic did not happen. ------------------------------------------------------------------------------- #!/bin/sh echo "a" > /tmp/a # file under an ext4 filesystem chattr +j /tmp/a echo "a" >> /tmp/a chattr -j /tmp/a ------------------------------------------------------------------------------- So, this patch looks good to me. Tested-by: Toshiyuki Okajima <toshi.okajima@xxxxxxxxxxxxxx> -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html