xfs: fix error gotos in xfs_setattr_nonsize
authorEric Sandeen <sandeen@redhat.com>
Fri, 28 Aug 2015 04:51:10 +0000 (14:51 +1000)
committerDave Chinner <david@fromorbit.com>
Fri, 28 Aug 2015 04:51:10 +0000 (14:51 +1000)
As the code stands today, if xfs_trans_reserve() fails, we
goto out_dqrele, which does not free the allocated transaction.

Fix up the goto targets to undo everything properly.

Addresses-Coverity-Id: 145571
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
fs/xfs/xfs_iops.c

index 766b23f86ce9f7b9423ba0d8a7f690d27f2a5d1b..8294132e6a3cdda41704a76a871ddd15d3bb271d 100644 (file)
@@ -609,7 +609,7 @@ xfs_setattr_nonsize(
        tp = xfs_trans_alloc(mp, XFS_TRANS_SETATTR_NOT_SIZE);
        error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ichange, 0, 0);
        if (error)
-               goto out_dqrele;
+               goto out_trans_cancel;
 
        xfs_ilock(ip, XFS_ILOCK_EXCL);
 
@@ -640,7 +640,7 @@ xfs_setattr_nonsize(
                                                NULL, capable(CAP_FOWNER) ?
                                                XFS_QMOPT_FORCE_RES : 0);
                        if (error)      /* out of quota */
-                               goto out_trans_cancel;
+                               goto out_unlock;
                }
        }
 
@@ -729,10 +729,10 @@ xfs_setattr_nonsize(
 
        return 0;
 
+out_unlock:
+       xfs_iunlock(ip, XFS_ILOCK_EXCL);
 out_trans_cancel:
        xfs_trans_cancel(tp);
-       xfs_iunlock(ip, XFS_ILOCK_EXCL);
-out_dqrele:
        xfs_qm_dqrele(udqp);
        xfs_qm_dqrele(gdqp);
        return error;