author: Vivek Goyal <vgoyal@redhat.com> 2020-10-09 14:15:10 -0400
committer: Miklos Szeredi <mszeredi@redhat.com> 2020-11-11 17:22:33 +0100
commit: 8981bdfda7445af5d5a8c277c923bf91873a0c98
parent: 3179216135ec09825d7c7875580951a6e69dc5df
Commit Summary:
Diffstat:
1 file changed, 8 insertions, 1 deletion
diff --git a/fs/fuse/file.c b/fs/fuse/file.c
index 24b201c4d9a9..aa0a44f7028f 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -1262,17 +1262,24 @@ static ssize_t fuse_cache_write_iter(struct kiocb *iocb, struct iov_iter *from)
ssize_t written_buffered = 0;
struct inode *inode = mapping->host;
ssize_t err;
+ struct fuse_conn *fc = get_fuse_conn(inode);
loff_t endbyte = 0;
- if (get_fuse_conn(inode)->writeback_cache) {
+ if (fc->writeback_cache) {
/* Update size (EOF optimization) and mode (SUID clearing) */
err = fuse_update_attributes(mapping->host, file);
if (err)
return err;
+ if (fc->handle_killpriv_v2 &&
+ should_remove_suid(file_dentry(file))) {
+ goto writethrough;
+ }
+
return generic_file_write_iter(iocb, from);
}
+writethrough:
inode_lock(inode);
/* We can write back this queue in page reclaim */