Call dma_fence_put(fence) before returning an error if
dma_fence_to_sync_pt() fails.  Use an unwind ladder at the
end of the function to do the cleanup.

Fixes: 70e67aaec2f4 ("dma-buf/sw_sync: Add fence deadline support")
Signed-off-by: Dan Carpenter <dan.carpen...@linaro.org>
---
v2: style changes.

 drivers/dma-buf/sw_sync.c | 19 ++++++++++++++-----
 1 file changed, 14 insertions(+), 5 deletions(-)

diff --git a/drivers/dma-buf/sw_sync.c b/drivers/dma-buf/sw_sync.c
index f5905d67dedb..22a808995f10 100644
--- a/drivers/dma-buf/sw_sync.c
+++ b/drivers/dma-buf/sw_sync.c
@@ -438,15 +438,17 @@ static int sw_sync_ioctl_get_deadline(struct 
sync_timeline *obj, unsigned long a
                return -EINVAL;
 
        pt = dma_fence_to_sync_pt(fence);
-       if (!pt)
-               return -EINVAL;
+       if (!pt) {
+               ret = -EINVAL;
+               goto put_fence;
+       }
 
        spin_lock_irqsave(fence->lock, flags);
-       if (test_bit(SW_SYNC_HAS_DEADLINE_BIT, &fence->flags)) {
-               data.deadline_ns = ktime_to_ns(pt->deadline);
-       } else {
+       if (!test_bit(SW_SYNC_HAS_DEADLINE_BIT, &fence->flags)) {
                ret = -ENOENT;
+               goto unlock;
        }
+       data.deadline_ns = ktime_to_ns(pt->deadline);
        spin_unlock_irqrestore(fence->lock, flags);
 
        dma_fence_put(fence);
@@ -458,6 +460,13 @@ static int sw_sync_ioctl_get_deadline(struct sync_timeline 
*obj, unsigned long a
                return -EFAULT;
 
        return 0;
+
+unlock:
+       spin_unlock_irqrestore(fence->lock, flags);
+put_fence:
+       dma_fence_put(fence);
+
+       return ret;
 }
 
 static long sw_sync_ioctl(struct file *file, unsigned int cmd,
-- 
2.47.2

Reply via email to