From: Miklos Szeredi <[email protected]>

Allow the kernel read and write on "direct_io" files.  This is
necessary for nfs export and execute support.

The implementation is simple: if an access from the kernel is
detected, don't perform get_user_pages(), just use the kernel address
provided by the requester to copy from/to the userspace filesystem.

Signed-off-by: Miklos Szeredi <[email protected]>

https://jira.sw.ru/browse/PSBM-97905
(cherry picked from commit f4975c67dd9ad8eb47a4c77af0521a2b16ee0197)
Signed-off-by: Andrey Ryabinin <[email protected]>
---
 fs/fuse/file.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/fs/fuse/file.c b/fs/fuse/file.c
index 344f35562bbe..ec8a0b07a5d6 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -1702,6 +1702,18 @@ static int fuse_get_user_pages(struct fuse_req *req, 
struct iov_iter *ii,
                               size_t *nbytesp, int write)
 {
        size_t nbytes = 0;  /* # bytes already packed in req */
+       /* Special case for kernel I/O: can copy directly into the buffer */
+       if (segment_eq(get_fs(), KERNEL_DS)) {
+               unsigned long user_addr = fuse_get_user_addr(ii);
+               size_t frag_size = fuse_get_frag_size(ii, *nbytesp);
+
+               if (write)
+                       req->in.args[1].value = (void *) user_addr;
+               else
+                       req->out.args[0].value = (void *) user_addr;
+
+               return 0;
+       }
 
        while (nbytes < *nbytesp && req->num_pages < req->max_pages) {
                unsigned npages;
-- 
2.21.0

_______________________________________________
Devel mailing list
[email protected]
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to