reiserfs: Fix synchronization of quota files in journal=data mode
PATCH 1/1 reiserfs: 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_end_sync() before calling vfs_quota_on() does it's job because transactions are committed to the journal and data marked as dirty in memory so write_inode_now() writes them to their final locations.
Signed-off-by Jan Kara <[email protected]>
--- fs/reiserfs/super.c | 30 +++++++++++++++++++++--------- 1 files changed, 21 insertions(+), 9 deletions(-)
fs/reiserfs/super.c +21 -9
@@ -2026,6 +2026,7 @@ static int reiserfs_quota_on(struct super_block *sb, int type, int format_id,int err;struct nameidata nd;struct inode *inode; +struct reiserfs_transaction_handle th;if (!(REISERFS_SB (sb)->s_mount_opt & (1 <<REISERFS_QUOTA )))return -EINVAL ;
@@ -2050,17 +2051,28 @@ static int reiserfs_quota_on(struct super_block *sb, int type, int format_id, }mark_inode_dirty (inode); } -/* Not journalling quota? No more tests needed... */ -if (!REISERFS_SB (sb)->s_qf_names[USRQUOTA ] && - !REISERFS_SB (sb)->s_qf_names[GRPQUOTA ]) { -path_put (&nd.path); -return vfs_quota_on (sb, type, format_id, path); - } -/* Quotafile not of fs root? */ -if (nd.path.dentry->d_parent->d_inode != sb->s_root->d_inode) -reiserfs_warning (sb, +/* Journaling quota? */ +if (REISERFS_SB (sb)->s_qf_names[type]) { +/* Quotafile not of fs root? */ +if (nd.path.dentry->d_parent->d_inode != sb->s_root->d_inode) +reiserfs_warning (sb,"reiserfs: Quota file not on filesystem root. " "Journalled quota will not work." ); + } + +/* +* When we journal data on quota file, we have to flush journal to see +* all updates to the file when we bypass pagecache... +*/ +if (reiserfs_file_data_log (inode)) { +/* Just start temporary transaction and finish it */ + err =journal_begin (&th, sb,1 ); +if (err) +return err; + err =journal_end_sync (&th, sb,1 ); +if (err) +return err; + }path_put (&nd.path);return vfs_quota_on (sb, type, format_id, path); }
Signature · 1 line
1.5.2.4