]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
quota: simplify remove_inode_dquot_ref()
authorNiu Yawei <yawei.niu@gmail.com>
Wed, 4 Jun 2014 04:21:30 +0000 (12:21 +0800)
committerJan Kara <jack@suse.cz>
Tue, 15 Jul 2014 20:40:21 +0000 (22:40 +0200)
Simplify the remove_inode_dquot_ref() to make it more obvious
that now we keep one reference for each dquot from inodes.

Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Niu Yawei <yawei.niu@intel.com>
Signed-off-by: Jan Kara <jack@suse.cz>
fs/quota/dquot.c

index 251771916069d9af8f1b6e507487affe4f3f5e6e..fb2d2e2a89e73544e05dbee329773f3f523fe379 100644 (file)
@@ -733,7 +733,6 @@ static struct shrinker dqcache_shrinker = {
 
 /*
  * Put reference to dquot
- * NOTE: If you change this function please check whether dqput_blocks() works right...
  */
 void dqput(struct dquot *dquot)
 {
@@ -962,47 +961,35 @@ static void add_dquot_ref(struct super_block *sb, int type)
 #endif
 }
 
-/*
- * Return 0 if dqput() won't block.
- * (note that 1 doesn't necessarily mean blocking)
- */
-static inline int dqput_blocks(struct dquot *dquot)
-{
-       if (atomic_read(&dquot->dq_count) <= 1)
-               return 1;
-       return 0;
-}
-
 /*
  * Remove references to dquots from inode and add dquot to list for freeing
  * if we have the last reference to dquot
  * We can't race with anybody because we hold dqptr_sem for writing...
  */
-static int remove_inode_dquot_ref(struct inode *inode, int type,
-                                 struct list_head *tofree_head)
+static void remove_inode_dquot_ref(struct inode *inode, int type,
+                                  struct list_head *tofree_head)
 {
        struct dquot *dquot = inode->i_dquot[type];
 
        inode->i_dquot[type] = NULL;
-       if (dquot) {
-               if (dqput_blocks(dquot)) {
-#ifdef CONFIG_QUOTA_DEBUG
-                       if (atomic_read(&dquot->dq_count) != 1)
-                               quota_error(inode->i_sb, "Adding dquot with "
-                                           "dq_count %d to dispose list",
-                                           atomic_read(&dquot->dq_count));
-#endif
-                       spin_lock(&dq_list_lock);
-                       /* As dquot must have currently users it can't be on
-                        * the free list... */
-                       list_add(&dquot->dq_free, tofree_head);
-                       spin_unlock(&dq_list_lock);
-                       return 1;
-               }
-               else
-                       dqput(dquot);   /* We have guaranteed we won't block */
+       if (!dquot)
+               return;
+
+       if (list_empty(&dquot->dq_free)) {
+               /*
+                * The inode still has reference to dquot so it can't be in the
+                * free list
+                */
+               spin_lock(&dq_list_lock);
+               list_add(&dquot->dq_free, tofree_head);
+               spin_unlock(&dq_list_lock);
+       } else {
+               /*
+                * Dquot is already in a list to put so we won't drop the last
+                * reference here.
+                */
+               dqput(dquot);
        }
-       return 0;
 }
 
 /*