Hi Curt, In journal mode, IMHO the case you described also happens. Could you shed light on journal mode case? Thanks, Yongqiang. On Tue, Jun 1, 2010 at 8:03 PM, Theodore Ts'o <tytso@xxxxxxx> wrote: > From: Curt Wohlgemuth <curtw@xxxxxxxxxx> > > commit 8b472d739b2ddd8ab7fb278874f696cd95b25a5e upstream (as of v2.6.34-rc6) > > In the no-journal case, ext4_write_inode() will fetch the bh and call > sync_dirty_buffer() on it. However, if the bh has already been > written and the bh reclaimed for some other purpose, AND if the inode > is the only one in the inode table block in use, then > ext4_get_inode_loc() will not read the inode table block from disk, > but as an optimization, fill the block with zero's assuming that its > caller will copy in the on-disk version of the inode. This is not > done by ext4_write_inode(), so the contents of the inode can simply > get lost. The fix is to use __ext4_get_inode_loc() with in_mem set to > 0, instead of ext4_get_inode_loc(). Long term the API needs to be > fixed so it's obvious why latter is not safe. > > Addresses-Google-Bug: #2526446 > > Signed-off-by: Curt Wohlgemuth <curtw@xxxxxxxxxx> > Signed-off-by: "Theodore Ts'o" <tytso@xxxxxxx> > --- > fs/ext4/inode.c | 2 +- > 1 files changed, 1 insertions(+), 1 deletions(-) > > diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c > index ff04c74..28152f8 100644 > --- a/fs/ext4/inode.c > +++ b/fs/ext4/inode.c > @@ -5204,7 +5204,7 @@ int ext4_write_inode(struct inode *inode, int wait) > } else { > struct ext4_iloc iloc; > > - err = ext4_get_inode_loc(inode, &iloc); > + err = __ext4_get_inode_loc(inode, &iloc, 0); > if (err) > return err; > if (wait) > -- > 1.6.6.1.1.g974db.dirty > > -- > 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 -- Best Wishes Yongqiang Yang -- 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