[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20250703024418.2809353-1-wozizhi@huaweicloud.com>
Date: Thu, 3 Jul 2025 10:44:18 +0800
From: Zizhi Wo <wozizhi@...weicloud.com>
To: netfs@...ts.linux.dev,
dhowells@...hat.com,
jlayton@...nel.org,
brauner@...nel.org
Cc: linux-fsdevel@...r.kernel.org,
linux-kernel@...r.kernel.org,
wozizhi@...wei.com,
libaokun1@...wei.com,
yangerkun@...wei.com,
houtao1@...wei.com,
yukuai3@...wei.com
Subject: [PATCH] cachefiles: Fix the incorrect return value in __cachefiles_write()
From: Zizhi Wo <wozizhi@...wei.com>
In __cachefiles_write(), if the return value of the write operation > 0, it
is set to 0. This makes it impossible to distinguish scenarios where a
partial write has occurred, and will affect the outer calling functions:
1) cachefiles_write_complete() will call "term_func" such as
netfs_write_subrequest_terminated(). When "ret" in __cachefiles_write()
is used as the "transferred_or_error" of this function, it can not
distinguish the amount of data written, makes the WARN meaningless.
2) cachefiles_ondemand_fd_write_iter() can only assume all writes were
successful by default when "ret" is 0, and unconditionally return the full
length specified by user space.
Fix it by modifying "ret" to reflect the actual number of bytes written.
Furthermore, returning a value greater than 0 from __cachefiles_write()
does not affect other call paths, such as cachefiles_issue_write() and
fscache_write().
Fixes: 047487c947e8 ("cachefiles: Implement the I/O routines")
Signed-off-by: Zizhi Wo <wozizhi@...wei.com>
---
fs/cachefiles/io.c | 2 --
fs/cachefiles/ondemand.c | 4 +---
2 files changed, 1 insertion(+), 5 deletions(-)
diff --git a/fs/cachefiles/io.c b/fs/cachefiles/io.c
index c08e4a66ac07..3e0576d9db1d 100644
--- a/fs/cachefiles/io.c
+++ b/fs/cachefiles/io.c
@@ -347,8 +347,6 @@ int __cachefiles_write(struct cachefiles_object *object,
default:
ki->was_async = false;
cachefiles_write_complete(&ki->iocb, ret);
- if (ret > 0)
- ret = 0;
break;
}
diff --git a/fs/cachefiles/ondemand.c b/fs/cachefiles/ondemand.c
index d9bc67176128..a7ed86fa98bb 100644
--- a/fs/cachefiles/ondemand.c
+++ b/fs/cachefiles/ondemand.c
@@ -83,10 +83,8 @@ static ssize_t cachefiles_ondemand_fd_write_iter(struct kiocb *kiocb,
trace_cachefiles_ondemand_fd_write(object, file_inode(file), pos, len);
ret = __cachefiles_write(object, file, pos, iter, NULL, NULL);
- if (!ret) {
- ret = len;
+ if (ret > 0)
kiocb->ki_pos += ret;
- }
out:
fput(file);
--
2.46.1
Powered by blists - more mailing lists