Browse Source

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>
Jan Kara 8 years ago
parent
commit
834057bf84
2 changed files with 9 additions and 0 deletions
  1. 6 0
      fs/quota/dquot.c
  2. 3 0
      include/linux/quota.h

+ 6 - 0
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))
 	if (!test_bit(DQ_ACTIVE_B, &dquot->dq_flags))
 		return 0;
 		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 quota is dirty already, we don't have to acquire dq_list_lock */
 	if (test_bit(DQ_MOD_B, &dquot->dq_flags))
 	if (test_bit(DQ_MOD_B, &dquot->dq_flags))
 		return 1;
 		return 1;
@@ -385,6 +388,9 @@ static inline void dqput_all(struct dquot **dquot)
 
 
 static inline int clear_dquot_dirty(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);
 	spin_lock(&dq_list_lock);
 	if (!test_and_clear_bit(DQ_MOD_B, &dquot->dq_flags)) {
 	if (!test_and_clear_bit(DQ_MOD_B, &dquot->dq_flags)) {
 		spin_unlock(&dq_list_lock);
 		spin_unlock(&dq_list_lock);

+ 3 - 0
include/linux/quota.h

@@ -490,6 +490,9 @@ enum {
 						 */
 						 */
 #define DQUOT_NEGATIVE_USAGE	(1 << (DQUOT_STATE_LAST + 1))
 #define DQUOT_NEGATIVE_USAGE	(1 << (DQUOT_STATE_LAST + 1))
 					       /* Allow negative quota usage */
 					       /* 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)
 static inline unsigned int dquot_state_flag(unsigned int flags, int type)
 {
 {
 	return flags << type;
 	return flags << type;