diff options
author | Jan Kara <jack@suse.cz> | 2017-08-03 11:18:23 +0200 |
---|---|---|
committer | Jan Kara <jack@suse.cz> | 2017-08-17 22:00:45 +0200 |
commit | 834057bf846691552a8906f7ed3f67546e5f897c (patch) | |
tree | 2cabc0f1d1d7325e7efb61db7a6b32c7e9cc6941 | |
parent | 503330f3820fab13aa2a7b1f9e7633686acc7c79 (diff) | |
download | linux-stable-834057bf846691552a8906f7ed3f67546e5f897c.tar.gz linux-stable-834057bf846691552a8906f7ed3f67546e5f897c.tar.bz2 linux-stable-834057bf846691552a8906f7ed3f67546e5f897c.zip |
quota: Allow disabling tracking of dirty dquots in a list
Filesystems that are journalling quotas generally don't need tracking of
dirty dquots in a list since forcing a transaction commit flushes all
quotas anyway. Allow filesystem to say it doesn't want dquots to be
tracked as it reduces contention on the dq_list_lock.
Signed-off-by: Jan Kara <jack@suse.cz>
-rw-r--r-- | fs/quota/dquot.c | 6 | ||||
-rw-r--r-- | include/linux/quota.h | 3 |
2 files changed, 9 insertions, 0 deletions
diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index 361a2a6f13e1..b867578e62c0 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c @@ -344,6 +344,9 @@ int dquot_mark_dquot_dirty(struct dquot *dquot) if (!test_bit(DQ_ACTIVE_B, &dquot->dq_flags)) return 0; + if (sb_dqopt(dquot->dq_sb)->flags & DQUOT_NOLIST_DIRTY) + return test_and_set_bit(DQ_MOD_B, &dquot->dq_flags); + /* If quota is dirty already, we don't have to acquire dq_list_lock */ if (test_bit(DQ_MOD_B, &dquot->dq_flags)) return 1; @@ -385,6 +388,9 @@ static inline void dqput_all(struct dquot **dquot) static inline int clear_dquot_dirty(struct dquot *dquot) { + if (sb_dqopt(dquot->dq_sb)->flags & DQUOT_NOLIST_DIRTY) + return test_and_clear_bit(DQ_MOD_B, &dquot->dq_flags); + spin_lock(&dq_list_lock); if (!test_and_clear_bit(DQ_MOD_B, &dquot->dq_flags)) { spin_unlock(&dq_list_lock); diff --git a/include/linux/quota.h b/include/linux/quota.h index ad6809f099ac..eccc1cb6274e 100644 --- a/include/linux/quota.h +++ b/include/linux/quota.h @@ -490,6 +490,9 @@ enum { */ #define DQUOT_NEGATIVE_USAGE (1 << (DQUOT_STATE_LAST + 1)) /* Allow negative quota usage */ +/* Do not track dirty dquots in a list */ +#define DQUOT_NOLIST_DIRTY (1 << (DQUOT_STATE_LAST + 2)) + static inline unsigned int dquot_state_flag(unsigned int flags, int type) { return flags << type; |