From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jan Kara Subject: [PATCH] quota: Properly invalidate caches even for filesystems with blocksize < pagesize Date: Tue, 2 Mar 2010 18:40:47 +0100 Message-ID: <1267551647-12438-1-git-send-email-jack@suse.cz> Cc: hch@infradead.org, dmonakhov@openvz.org, Jan Kara To: linux-fsdevel@vger.kernel.org Return-path: Received: from cantor2.suse.de ([195.135.220.15]:45937 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752244Ab0CBRkj (ORCPT ); Tue, 2 Mar 2010 12:40:39 -0500 Sender: linux-fsdevel-owner@vger.kernel.org List-ID: 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. Signed-off-by: Jan Kara --- fs/quota/dquot.c | 12 +++++++----- 1 files changed, 7 insertions(+), 5 deletions(-) I'm sending this patch for review. I plan to merge this fix via my tree. Honza diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index 4d2041f..10d021d 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, } if (!(dqopt->flags & DQUOT_QUOTA_SYS_FILE)) { - /* As we bypass the pagecache we must now flush the inode so - * that we see all the changes from userspace... */ - write_inode_now(inode, 1); - /* And now flush the block cache so that kernel sees the - * changes */ + /* As we bypass the pagecache we must now flush all the + * dirty data and invalidate caches so that kernel sees + * changes from userspace. It is not enough to just flush + * the quota file since if blocksize < pagesize, invalidation + * of the cache could fail because of other unrelated dirty + * data */ + sync_filesystem(sb); invalidate_bdev(sb->s_bdev); } mutex_lock(&dqopt->dqonoff_mutex); -- 1.6.4.2