quota: optimize mark_dirty logic
[safe/jmp/linux-2.6] / fs / quota / dquot.c
index 788b580..05c590e 100644 (file)
@@ -317,14 +317,23 @@ static inline int mark_dquot_dirty(struct dquot *dquot)
        return dquot->dq_sb->dq_op->mark_dirty(dquot);
 }
 
+/* Mark dquot dirty in atomic manner, and return it's old dirty flag state */
 int dquot_mark_dquot_dirty(struct dquot *dquot)
 {
+       int ret = 1;
+
+       /* 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;
+
        spin_lock(&dq_list_lock);
-       if (!test_and_set_bit(DQ_MOD_B, &dquot->dq_flags))
+       if (!test_and_set_bit(DQ_MOD_B, &dquot->dq_flags)) {
                list_add(&dquot->dq_dirty, &sb_dqopt(dquot->dq_sb)->
                                info[dquot->dq_type].dqi_dirty_list);
+               ret = 0;
+       }
        spin_unlock(&dq_list_lock);
-       return 0;
+       return ret;
 }
 EXPORT_SYMBOL(dquot_mark_dquot_dirty);