In case direct I/O encounters an error midway, it returns the error. Instead it should be returning the number of bytes transferred so far. Test case (with ENOSPC): 1. Create an almost full filesystem 2. Create a file, say /mnt/lastfile, until the filesystem is full. 3. Direct write() with count > sizeof /mnt/lastfile. Result: write() returns -ENOSPC. However, file content has data written in step 3. Signed-off-by: Goldwyn Rodrigues <rgoldwyn@xxxxxxxx> diff --git a/fs/direct-io.c b/fs/direct-io.c index 5fa2211e49ae..0fc1789498ae 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c @@ -255,8 +255,6 @@ static ssize_t dio_complete(struct dio *dio, ssize_t ret, bool is_async) ret = dio->page_errors; if (ret == 0) ret = dio->io_error; - if (ret == 0) - ret = transferred; if (dio->end_io) { int err; @@ -284,7 +282,7 @@ static ssize_t dio_complete(struct dio *dio, ssize_t ret, bool is_async) } kmem_cache_free(dio_cache, dio); - return ret; + return transferred ? transferred : ret; } static void dio_aio_complete_work(struct work_struct *work)