]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
xfs: don't treat all radix_tree_insert errors as -EEXIST
authorChristoph Hellwig <hch@lst.de>
Mon, 10 Nov 2025 13:22:55 +0000 (14:22 +0100)
committerCarlos Maiolino <cem@kernel.org>
Tue, 11 Nov 2025 10:45:57 +0000 (11:45 +0100)
Return other errors to the caller instead.  Note that there really
shouldn't be any other errors because the entry is preallocated, but
if there were, we'd better return them instead of retrying forever.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
fs/xfs/xfs_dquot.c

index 0bd8022e47b4ff6fd705a6c1e86343e163b114de..79e14ee1d7a07a705c5195da94b41f15e45196eb 100644 (file)
@@ -860,7 +860,6 @@ xfs_qm_dqget_cache_insert(
        mutex_lock(&qi->qi_tree_lock);
        error = radix_tree_insert(tree, id, dqp);
        if (unlikely(error)) {
-               /* Duplicate found!  Caller must try again. */
                trace_xfs_dqget_dup(dqp);
                goto out_unlock;
        }
@@ -935,13 +934,16 @@ restart:
 
        error = xfs_qm_dqget_cache_insert(mp, qi, tree, id, dqp);
        if (error) {
-               /*
-                * Duplicate found. Just throw away the new dquot and start
-                * over.
-                */
                xfs_qm_dqdestroy(dqp);
-               XFS_STATS_INC(mp, xs_qm_dquot_dups);
-               goto restart;
+               if (error == -EEXIST) {
+                       /*
+                        * Duplicate found. Just throw away the new dquot and
+                        * start over.
+                        */
+                       XFS_STATS_INC(mp, xs_qm_dquot_dups);
+                       goto restart;
+               }
+               return error;
        }
 
        trace_xfs_dqget_miss(dqp);
@@ -1060,13 +1062,16 @@ restart:
 
        error = xfs_qm_dqget_cache_insert(mp, qi, tree, id, dqp);
        if (error) {
-               /*
-                * Duplicate found. Just throw away the new dquot and start
-                * over.
-                */
                xfs_qm_dqdestroy(dqp);
-               XFS_STATS_INC(mp, xs_qm_dquot_dups);
-               goto restart;
+               if (error == -EEXIST) {
+                       /*
+                        * Duplicate found. Just throw away the new dquot and
+                        * start over.
+                        */
+                       XFS_STATS_INC(mp, xs_qm_dquot_dups);
+                       goto restart;
+               }
+               return error;
        }
 
 dqret: