ext3: Fix synchronization of quota files in journal=data mode
PATCH 1/1 ext3: Fix synchronization of quota files in journal=data mode
In journal=data mode, it is not enough to do write_inode_now as done in vfs_quota_on() to write all data to their final location (which is needed for quota_read to work correctly). Calling journal_flush() does its job.
Reported-by Nick <[email protected]>
Signed-off-by Jan Kara <[email protected]>
--- fs/ext3/super.c | 42 +++++++++++++++++++++++++++++------------- 1 files changed, 29 insertions(+), 13 deletions(-)
fs/ext3/super.c +29 -13
@@ -2756,23 +2756,39 @@ static int ext3_quota_on(struct super_block *sb, int type, int format_id,if (!test_opt (sb,QUOTA ))return -EINVAL ; -/* Not journalling quota? */ -if (!EXT3_SB (sb)->s_qf_names[USRQUOTA ] && - !EXT3_SB (sb)->s_qf_names[GRPQUOTA ]) -return vfs_quota_on (sb, type, format_id, path); + err =path_lookup (path,LOOKUP_FOLLOW , &nd);if (err)return err; -/* Quotafile not on the same filesystem? */ -if (nd.path.mnt->mnt_sb != sb) { -path_put (&nd.path); -return -EXDEV ; + +/* Journaling quota? */ +if (EXT3_SB (sb)->s_qf_names[type]) { +/* Quotafile not on the same filesystem? */ +if (nd.path.mnt->mnt_sb != sb) { +path_put (&nd.path); +return -EXDEV ; + } +/* Quotafile not of fs root? */ +if (nd.path.dentry->d_parent->d_inode != sb->s_root->d_inode) +printk (KERN_WARNING +"EXT3-fs: Quota file not on filesystem root. " +"Journaled quota will not work.\n" ); } -/* Quotafile not of fs root? */ -if (nd.path.dentry->d_parent->d_inode != sb->s_root->d_inode) -printk (KERN_WARNING -"EXT3-fs: Quota file not on filesystem root. " -"Journalled quota will not work.\n" ); + +/* +* When we journal data on quota file, we have to flush journal to see +* all updates to the file when we bypass pagecache... +*/ +if (ext3_should_journal_data (nd.path.dentry->d_inode)) { +/* +* We don't need to lock updates but journal_flush() could +* otherwise be livelocked... +*/ +journal_lock_updates (EXT3_SB (sb)->s_journal); +journal_flush (EXT3_SB (sb)->s_journal); +journal_unlock_updates (EXT3_SB (sb)->s_journal); + } +path_put (&nd.path);return vfs_quota_on (sb, type, format_id, path); }
Signature · 1 line
1.5.2.4