From: Taotao Chen <chentao...@didiglobal.com>

shmem_pwrite() currently checks for short writes before negative error
codes, which can overwrite real errors (e.g., -EFBIG) with -EIO.
Reorder the checks to return negative errors first, then handle short
writes.

Signed-off-by: Taotao Chen <chentao...@didiglobal.com>
Reviewed-by: Andi Shyti <andi.sh...@linux.intel.com>
---
v2:
 - Drop Fixes tag
 - Add Reviewed-by from Andi
 - Add code comments (suggested by Rodrigo)

 drivers/gpu/drm/i915/gem/i915_gem_shmem.c | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c 
b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c
index b9dae15c1d16..26dda55a07ff 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c
@@ -441,11 +441,20 @@ shmem_pwrite(struct drm_i915_gem_object *obj,
        written = file->f_op->write_iter(&kiocb, &iter);
        BUG_ON(written == -EIOCBQUEUED);
 
-       if (written != size)
-               return -EIO;
-
+       /*
+        * First, check if write_iter returned a negative error.
+        * If the write failed, return the real error code immediately.
+        * This prevents it from being overwritten by the short write check 
below.
+        */
        if (written < 0)
                return written;
+       /*
+        * Check for a short write (written bytes != requested size).
+        * Even if some data was written, return -EIO to indicate that the
+        * write was not fully completed.
+        */
+       if (written != size)
+               return -EIO;
 
        return 0;
 }
-- 
2.34.1

Reply via email to