xfs: detach inode dquots at the end of inactivation
authorDarrick J. Wong <djwong@kernel.org>
Mon, 31 May 2021 18:31:57 +0000 (11:31 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Thu, 3 Jun 2021 22:56:02 +0000 (15:56 -0700)
Once we're done with inactivating an inode, we're finished updating
metadata for that inode.  This means that we can detach the dquots at
the end and not have to wait for reclaim to do it for us.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
fs/xfs/xfs_icache.c
fs/xfs/xfs_inode.c

index e2edbcf7a528e2662c9e402c43f31253ff75fc27..dfa0ec7d02b8085b2a9ee4e16da99198c9c57f73 100644 (file)
@@ -1093,7 +1093,7 @@ reclaim:
         * unlocked after the lookup before we go ahead and free it.
         */
        xfs_ilock(ip, XFS_ILOCK_EXCL);
-       xfs_qm_dqdetach(ip);
+       ASSERT(!ip->i_udquot && !ip->i_gdquot && !ip->i_pdquot);
        xfs_iunlock(ip, XFS_ILOCK_EXCL);
        ASSERT(xfs_inode_clean(ip));
 
index e4c2da4566f13f1748de5c8c5e54c683dd7be866..51972549e73c7aef0db3114cc65d1150dbcc7a71 100644 (file)
@@ -1716,7 +1716,7 @@ xfs_inactive(
         */
        if (VFS_I(ip)->i_mode == 0) {
                ASSERT(ip->i_df.if_broot_bytes == 0);
-               return;
+               goto out;
        }
 
        mp = ip->i_mount;
@@ -1724,11 +1724,11 @@ xfs_inactive(
 
        /* If this is a read-only mount, don't do this (would generate I/O) */
        if (mp->m_flags & XFS_MOUNT_RDONLY)
-               return;
+               goto out;
 
        /* Metadata inodes require explicit resource cleanup. */
        if (xfs_is_metadata_inode(ip))
-               return;
+               goto out;
 
        /* Try to clean out the cow blocks if there are any. */
        if (xfs_inode_has_cow_data(ip))
@@ -1747,7 +1747,7 @@ xfs_inactive(
                if (xfs_can_free_eofblocks(ip, true))
                        xfs_free_eofblocks(ip);
 
-               return;
+               goto out;
        }
 
        if (S_ISREG(VFS_I(ip)->i_mode) &&
@@ -1757,14 +1757,14 @@ xfs_inactive(
 
        error = xfs_qm_dqattach(ip);
        if (error)
-               return;
+               goto out;
 
        if (S_ISLNK(VFS_I(ip)->i_mode))
                error = xfs_inactive_symlink(ip);
        else if (truncate)
                error = xfs_inactive_truncate(ip);
        if (error)
-               return;
+               goto out;
 
        /*
         * If there are attributes associated with the file then blow them away
@@ -1774,7 +1774,7 @@ xfs_inactive(
        if (XFS_IFORK_Q(ip)) {
                error = xfs_attr_inactive(ip);
                if (error)
-                       return;
+                       goto out;
        }
 
        ASSERT(!ip->i_afp);
@@ -1783,12 +1783,12 @@ xfs_inactive(
        /*
         * Free the inode.
         */
-       error = xfs_inactive_ifree(ip);
-       if (error)
-               return;
+       xfs_inactive_ifree(ip);
 
+out:
        /*
-        * Release the dquots held by inode, if any.
+        * We're done making metadata updates for this inode, so we can release
+        * the attached dquots.
         */
        xfs_qm_dqdetach(ip);
 }