diff options
author | Jan Kara <jack@suse.cz> | 2010-10-11 15:22:21 +0200 |
---|---|---|
committer | Jan Kara <jack@suse.cz> | 2010-10-28 01:30:03 +0200 |
commit | 86f3cbec4a193c04d0a31c13132c5956731af6ff (patch) | |
tree | 6bc3f57914b07672b73320dc9604a40b8e3ffea5 /fs/quota/dquot.c | |
parent | quota: fix dquot_disable vs dquot_transfer race v2 (diff) | |
download | linux-86f3cbec4a193c04d0a31c13132c5956731af6ff.tar.xz linux-86f3cbec4a193c04d0a31c13132c5956731af6ff.zip |
quota: Fix issuing of warnings from dquot_transfer
__dquot_transfer accidentally called flush_warnings for a wrong set of
dquots which could result in quota warnings being issued with a wrong
identification. Also when operation fails because of EDQUOT, there's no
need check for issuing information message about user getting below limits
(no transfer has actually happened).
Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs/quota/dquot.c')
-rw-r--r-- | fs/quota/dquot.c | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index ed14beea8fe3..1bc38f56fa7c 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c @@ -1805,20 +1805,19 @@ int __dquot_transfer(struct inode *inode, struct dquot **transfer_to) mark_all_dquot_dirty(transfer_from); mark_all_dquot_dirty(transfer_to); + flush_warnings(transfer_to, warntype_to); + flush_warnings(transfer_from, warntype_from_inodes); + flush_warnings(transfer_from, warntype_from_space); /* Pass back references to put */ for (cnt = 0; cnt < MAXQUOTAS; cnt++) if (is_valid[cnt]) transfer_to[cnt] = transfer_from[cnt]; - -warn: - flush_warnings(transfer_to, warntype_to); - flush_warnings(transfer_from, warntype_from_inodes); - flush_warnings(transfer_from, warntype_from_space); - return ret; + return 0; over_quota: spin_unlock(&dq_data_lock); up_write(&sb_dqopt(inode->i_sb)->dqptr_sem); - goto warn; + flush_warnings(transfer_to, warntype_to); + return ret; } EXPORT_SYMBOL(__dquot_transfer); |