From 6f4f62655f1a7cf3634aa9e1de0acaaad7a6f195 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Fri, 25 Jul 2008 01:46:16 -0700 Subject: [PATCH] --- yaml --- r: 105839 b: refs/heads/master c: 9cfe7b9010aa66da5f3b2bc33d9e30a4d53bd274 h: refs/heads/master i: 105837: ab6f66ee04bb55aa3f9a43fb7ea0564a097ee492 105835: 72bb261779ea1bc0275709153b3e9e7678a64a92 105831: 6909ae411378368419efc6b6da4a49a5191aec15 105823: 5b14f455f0bbe6a24bcaf1b12bafc8ef6a622b54 v: v3 --- [refs] | 2 +- trunk/fs/ext3/super.c | 35 +++++++++++++++++++++++++++-------- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/[refs] b/[refs] index a6d8a9144e0d..9029f6d8ab02 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 50c33a84db4aa5082e3af8d873b22344ae2ebea8 +refs/heads/master: 9cfe7b9010aa66da5f3b2bc33d9e30a4d53bd274 diff --git a/trunk/fs/ext3/super.c b/trunk/fs/ext3/super.c index 2845425077e8..50796e90d070 100644 --- a/trunk/fs/ext3/super.c +++ b/trunk/fs/ext3/super.c @@ -2759,23 +2759,42 @@ static int ext3_quota_on(struct super_block *sb, int type, int format_id, if (!test_opt(sb, QUOTA)) return -EINVAL; - /* Not journalling quota or remount? */ - if ((!EXT3_SB(sb)->s_qf_names[USRQUOTA] && - !EXT3_SB(sb)->s_qf_names[GRPQUOTA]) || remount) + /* When remounting, no checks are needed and in fact, path is NULL */ + if (remount) return vfs_quota_on(sb, type, format_id, path, remount); + 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; } - /* Quotafile not in 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"); + /* Journaling quota? */ + if (EXT3_SB(sb)->s_qf_names[type]) { + /* 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"); + } + + /* + * 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, remount); }