aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2010-02-22 15:07:17 -0500
committerJan Kara <jack@suse.cz>2010-03-04 18:20:27 -0500
commitab94c39b6fa076d4f6d2903dcc54cda35d938776 (patch)
treed90042ad0c903e6f9034017906dfddd4dca49d62
parent8ddd69d6df4758bf0cab981481af24cc84419567 (diff)
quota: Properly invalidate caches even for filesystems with blocksize < pagesize
Sometimes invalidate_bdev() can fail to invalidate a part of block device cache because of dirty data. If the filesystem has blocksize smaller than page size, this can happen even for pages containing quota files and thus kernel would operate on stale data. Fix the issue by syncing the filesystem before invalidating the cache. Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Jan Kara <jack@suse.cz>
-rw-r--r--fs/quota/dquot.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c
index 4d2041fddefc..10d021dd37c1 100644
--- a/fs/quota/dquot.c
+++ b/fs/quota/dquot.c
@@ -2033,11 +2033,13 @@ static int vfs_load_quota_inode(struct inode *inode, int type, int format_id,
2033 } 2033 }
2034 2034
2035 if (!(dqopt->flags & DQUOT_QUOTA_SYS_FILE)) { 2035 if (!(dqopt->flags & DQUOT_QUOTA_SYS_FILE)) {
2036 /* As we bypass the pagecache we must now flush the inode so 2036 /* As we bypass the pagecache we must now flush all the
2037 * that we see all the changes from userspace... */ 2037 * dirty data and invalidate caches so that kernel sees
2038 write_inode_now(inode, 1); 2038 * changes from userspace. It is not enough to just flush
2039 /* And now flush the block cache so that kernel sees the 2039 * the quota file since if blocksize < pagesize, invalidation
2040 * changes */ 2040 * of the cache could fail because of other unrelated dirty
2041 * data */
2042 sync_filesystem(sb);
2041 invalidate_bdev(sb->s_bdev); 2043 invalidate_bdev(sb->s_bdev);
2042 } 2044 }
2043 mutex_lock(&dqopt->dqonoff_mutex); 2045 mutex_lock(&dqopt->dqonoff_mutex);