drm/i915: Fix incorrect error handling in shmem_pwrite()

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 <chentaotao@didiglobal.com>
Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com>
Signed-off-by: Andi Shyti <andi.shyti@linux.intel.com>
Link: https://lore.kernel.org/r/20250822030651.28099-2-chentaotao@didiglobal.com
This commit is contained in:
Taotao Chen 2025-08-22 03:07:04 +00:00 committed by Andi Shyti
parent e296a2266c
commit 6fa6c7a50e

View File

@ -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;
}