blob: 358a014350581fc7940287d8ef45b28882a09381 [file] [log] [blame]
Miklos Szeredi334f4852005-09-09 13:10:27 -07001/*
2 FUSE: Filesystem in Userspace
Miklos Szeredi1729a162008-11-26 12:03:54 +01003 Copyright (C) 2001-2008 Miklos Szeredi <miklos@szeredi.hu>
Miklos Szeredi334f4852005-09-09 13:10:27 -07004
5 This program can be distributed under the terms of the GNU GPL.
6 See the file COPYING.
7*/
8
9#include "fuse_i.h"
10
11#include <linux/init.h>
12#include <linux/module.h>
13#include <linux/poll.h>
Ingo Molnar174cd4b2017-02-02 19:15:33 +010014#include <linux/sched/signal.h>
Miklos Szeredi334f4852005-09-09 13:10:27 -070015#include <linux/uio.h>
16#include <linux/miscdevice.h>
17#include <linux/pagemap.h>
18#include <linux/file.h>
19#include <linux/slab.h>
Miklos Szeredidd3bb142010-05-25 15:06:06 +020020#include <linux/pipe_fs_i.h>
Miklos Szeredice534fb2010-05-25 15:06:07 +020021#include <linux/swap.h>
22#include <linux/splice.h>
Seth Forshee0b6e9ea2014-07-02 16:29:19 -050023#include <linux/sched.h>
Miklos Szeredi334f4852005-09-09 13:10:27 -070024
25MODULE_ALIAS_MISCDEV(FUSE_MINOR);
Kay Sievers578454f2010-05-20 18:07:20 +020026MODULE_ALIAS("devname:fuse");
Miklos Szeredi334f4852005-09-09 13:10:27 -070027
Kirill Tkhaic59fd852018-09-11 13:11:56 +030028/* Ordinary requests have even IDs, while interrupts IDs are odd */
29#define FUSE_INT_REQ_BIT (1ULL << 0)
30#define FUSE_REQ_ID_STEP (1ULL << 1)
31
Christoph Lametere18b8902006-12-06 20:33:20 -080032static struct kmem_cache *fuse_req_cachep;
Miklos Szeredi334f4852005-09-09 13:10:27 -070033
Miklos Szeredicc080e92015-07-01 16:26:08 +020034static struct fuse_dev *fuse_get_dev(struct file *file)
Miklos Szeredi334f4852005-09-09 13:10:27 -070035{
Miklos Szeredi0720b312006-04-10 22:54:55 -070036 /*
37 * Lockless access is OK, because file->private data is set
38 * once during mount and is valid until the file is released.
39 */
Mark Rutland6aa7de02017-10-23 14:07:29 -070040 return READ_ONCE(file->private_data);
Miklos Szeredi334f4852005-09-09 13:10:27 -070041}
42
Miklos Szeredi72133942019-09-10 15:04:11 +020043static void fuse_request_init(struct fuse_req *req)
Miklos Szeredi334f4852005-09-09 13:10:27 -070044{
Miklos Szeredi334f4852005-09-09 13:10:27 -070045 INIT_LIST_HEAD(&req->list);
Miklos Szeredia4d27e72006-06-25 05:48:54 -070046 INIT_LIST_HEAD(&req->intr_entry);
Miklos Szeredi334f4852005-09-09 13:10:27 -070047 init_waitqueue_head(&req->waitq);
Elena Reshetovaec99f6d2017-03-03 11:04:04 +020048 refcount_set(&req->count, 1);
Miklos Szeredi33e14b42015-07-01 16:26:01 +020049 __set_bit(FR_PENDING, &req->flags);
Miklos Szeredi334f4852005-09-09 13:10:27 -070050}
51
Miklos Szeredi72133942019-09-10 15:04:11 +020052static struct fuse_req *fuse_request_alloc(gfp_t flags)
Miklos Szeredi334f4852005-09-09 13:10:27 -070053{
Miklos Szeredi8a7aa282018-10-01 10:07:05 +020054 struct fuse_req *req = kmem_cache_zalloc(fuse_req_cachep, flags);
Miklos Szeredi72133942019-09-10 15:04:11 +020055 if (req)
56 fuse_request_init(req);
Maxim Patlasov4250c062012-10-26 19:48:07 +040057
Miklos Szeredi334f4852005-09-09 13:10:27 -070058 return req;
59}
Maxim Patlasov4250c062012-10-26 19:48:07 +040060
Miklos Szeredi66abc352019-09-10 15:04:11 +020061static void fuse_request_free(struct fuse_req *req)
Miklos Szeredie52a8252018-10-01 10:07:06 +020062{
Miklos Szeredi334f4852005-09-09 13:10:27 -070063 kmem_cache_free(fuse_req_cachep, req);
64}
65
Miklos Szeredi66abc352019-09-10 15:04:11 +020066static void __fuse_get_request(struct fuse_req *req)
Miklos Szeredi334f4852005-09-09 13:10:27 -070067{
Elena Reshetovaec99f6d2017-03-03 11:04:04 +020068 refcount_inc(&req->count);
Miklos Szeredi334f4852005-09-09 13:10:27 -070069}
70
71/* Must be called with > 1 refcount */
72static void __fuse_put_request(struct fuse_req *req)
73{
Elena Reshetovaec99f6d2017-03-03 11:04:04 +020074 refcount_dec(&req->count);
Miklos Szeredi334f4852005-09-09 13:10:27 -070075}
76
Miklos Szeredi9759bd512015-01-06 10:45:35 +010077void fuse_set_initialized(struct fuse_conn *fc)
78{
79 /* Make sure stores before this are seen on another CPU */
80 smp_wmb();
81 fc->initialized = 1;
82}
83
Maxim Patlasov0aada882013-03-21 18:02:28 +040084static bool fuse_block_alloc(struct fuse_conn *fc, bool for_background)
85{
86 return !fc->initialized || (for_background && fc->blocked);
87}
88
Miklos Szeredib8f95e52018-07-26 16:13:11 +020089static void fuse_drop_waiting(struct fuse_conn *fc)
90{
Miklos Szeredi2d84a2d2018-11-09 15:52:16 +010091 /*
92 * lockess check of fc->connected is okay, because atomic_dec_and_test()
93 * provides a memory barrier mached with the one in fuse_wait_aborted()
94 * to ensure no wake-up is missed.
95 */
96 if (atomic_dec_and_test(&fc->num_waiting) &&
97 !READ_ONCE(fc->connected)) {
Miklos Szeredib8f95e52018-07-26 16:13:11 +020098 /* wake up aborters */
99 wake_up_all(&fc->blocked_waitq);
100 }
101}
102
Miklos Szeredi66abc352019-09-10 15:04:11 +0200103static void fuse_put_request(struct fuse_conn *fc, struct fuse_req *req);
104
Miklos Szeredi72133942019-09-10 15:04:11 +0200105static struct fuse_req *fuse_get_req(struct fuse_conn *fc, bool for_background)
Miklos Szeredi334f4852005-09-09 13:10:27 -0700106{
Miklos Szeredi08a53cd2006-04-10 22:54:59 -0700107 struct fuse_req *req;
Miklos Szeredi08a53cd2006-04-10 22:54:59 -0700108 int err;
Miklos Szeredi9bc5ddd2006-04-11 21:16:09 +0200109 atomic_inc(&fc->num_waiting);
Maxim Patlasov0aada882013-03-21 18:02:28 +0400110
111 if (fuse_block_alloc(fc, for_background)) {
Maxim Patlasov0aada882013-03-21 18:02:28 +0400112 err = -EINTR;
Al Viro7d3a07f2016-07-19 03:08:27 -0400113 if (wait_event_killable_exclusive(fc->blocked_waitq,
114 !fuse_block_alloc(fc, for_background)))
Maxim Patlasov0aada882013-03-21 18:02:28 +0400115 goto out;
116 }
Miklos Szeredi9759bd512015-01-06 10:45:35 +0100117 /* Matches smp_wmb() in fuse_set_initialized() */
118 smp_rmb();
Miklos Szeredi08a53cd2006-04-10 22:54:59 -0700119
Miklos Szeredi51eb01e2006-06-25 05:48:50 -0700120 err = -ENOTCONN;
121 if (!fc->connected)
122 goto out;
123
Miklos Szeredide155222015-07-01 16:25:57 +0200124 err = -ECONNREFUSED;
125 if (fc->conn_error)
126 goto out;
127
Miklos Szeredi72133942019-09-10 15:04:11 +0200128 req = fuse_request_alloc(GFP_KERNEL);
Miklos Szeredi9bc5ddd2006-04-11 21:16:09 +0200129 err = -ENOMEM;
Maxim Patlasov722d2be2013-03-21 18:02:36 +0400130 if (!req) {
131 if (for_background)
132 wake_up(&fc->blocked_waitq);
Miklos Szeredi9bc5ddd2006-04-11 21:16:09 +0200133 goto out;
Maxim Patlasov722d2be2013-03-21 18:02:36 +0400134 }
Miklos Szeredi334f4852005-09-09 13:10:27 -0700135
Eric W. Biederman8cb08322018-02-21 11:18:07 -0600136 req->in.h.uid = from_kuid(fc->user_ns, current_fsuid());
137 req->in.h.gid = from_kgid(fc->user_ns, current_fsgid());
Eric W. Biedermanc9582eb2018-02-21 10:52:06 -0600138 req->in.h.pid = pid_nr_ns(task_pid(current), fc->pid_ns);
139
Miklos Szeredi825d6d32015-07-01 16:25:58 +0200140 __set_bit(FR_WAITING, &req->flags);
141 if (for_background)
142 __set_bit(FR_BACKGROUND, &req->flags);
143
Eric W. Biedermanc9582eb2018-02-21 10:52:06 -0600144 if (unlikely(req->in.h.uid == ((uid_t)-1) ||
145 req->in.h.gid == ((gid_t)-1))) {
146 fuse_put_request(fc, req);
147 return ERR_PTR(-EOVERFLOW);
148 }
Miklos Szeredi334f4852005-09-09 13:10:27 -0700149 return req;
Miklos Szeredi9bc5ddd2006-04-11 21:16:09 +0200150
151 out:
Miklos Szeredib8f95e52018-07-26 16:13:11 +0200152 fuse_drop_waiting(fc);
Miklos Szeredi9bc5ddd2006-04-11 21:16:09 +0200153 return ERR_PTR(err);
Miklos Szeredi334f4852005-09-09 13:10:27 -0700154}
Maxim Patlasov8b41e672013-03-21 18:02:04 +0400155
Miklos Szeredi66abc352019-09-10 15:04:11 +0200156static void fuse_put_request(struct fuse_conn *fc, struct fuse_req *req)
Miklos Szeredi334f4852005-09-09 13:10:27 -0700157{
Elena Reshetovaec99f6d2017-03-03 11:04:04 +0200158 if (refcount_dec_and_test(&req->count)) {
Miklos Szeredi825d6d32015-07-01 16:25:58 +0200159 if (test_bit(FR_BACKGROUND, &req->flags)) {
Maxim Patlasov722d2be2013-03-21 18:02:36 +0400160 /*
161 * We get here in the unlikely case that a background
162 * request was allocated but not sent
163 */
Kirill Tkhaiae2dffa2018-08-27 18:29:46 +0300164 spin_lock(&fc->bg_lock);
Maxim Patlasov722d2be2013-03-21 18:02:36 +0400165 if (!fc->blocked)
166 wake_up(&fc->blocked_waitq);
Kirill Tkhaiae2dffa2018-08-27 18:29:46 +0300167 spin_unlock(&fc->bg_lock);
Maxim Patlasov722d2be2013-03-21 18:02:36 +0400168 }
169
Miklos Szeredi825d6d32015-07-01 16:25:58 +0200170 if (test_bit(FR_WAITING, &req->flags)) {
171 __clear_bit(FR_WAITING, &req->flags);
Miklos Szeredib8f95e52018-07-26 16:13:11 +0200172 fuse_drop_waiting(fc);
Miklos Szeredi73e0e732015-07-01 16:25:56 +0200173 }
Miklos Szeredi33649c92006-06-25 05:48:52 -0700174
Miklos Szeredi40ac7ab2019-09-10 15:04:08 +0200175 fuse_request_free(req);
Miklos Szeredi7128ec22006-02-04 23:27:40 -0800176 }
177}
Tejun Heo08cbf542009-04-14 10:54:53 +0900178EXPORT_SYMBOL_GPL(fuse_put_request);
Miklos Szeredi7128ec22006-02-04 23:27:40 -0800179
Stefan Hajnoczi14d46d72018-06-21 09:34:25 +0100180unsigned int fuse_len_args(unsigned int numargs, struct fuse_arg *args)
Miklos Szeredid12def12008-02-06 01:38:39 -0800181{
182 unsigned nbytes = 0;
183 unsigned i;
184
185 for (i = 0; i < numargs; i++)
186 nbytes += args[i].size;
187
188 return nbytes;
189}
Stefan Hajnoczi14d46d72018-06-21 09:34:25 +0100190EXPORT_SYMBOL_GPL(fuse_len_args);
Miklos Szeredid12def12008-02-06 01:38:39 -0800191
Stefan Hajnoczi79d96ef2018-06-22 13:48:30 +0100192u64 fuse_get_unique(struct fuse_iqueue *fiq)
Miklos Szeredid12def12008-02-06 01:38:39 -0800193{
Kirill Tkhaic59fd852018-09-11 13:11:56 +0300194 fiq->reqctr += FUSE_REQ_ID_STEP;
195 return fiq->reqctr;
Miklos Szeredid12def12008-02-06 01:38:39 -0800196}
Stefan Hajnoczi79d96ef2018-06-22 13:48:30 +0100197EXPORT_SYMBOL_GPL(fuse_get_unique);
Miklos Szeredid12def12008-02-06 01:38:39 -0800198
Kirill Tkhaibe2ff422018-09-11 13:12:14 +0300199static unsigned int fuse_req_hash(u64 unique)
200{
201 return hash_long(unique & ~FUSE_INT_REQ_BIT, FUSE_PQ_HASH_BITS);
202}
203
Stefan Hajnocziae3aad72018-06-18 15:53:19 +0100204/**
205 * A new request is available, wake fiq->waitq
206 */
207static void fuse_dev_wake_and_unlock(struct fuse_iqueue *fiq)
208__releases(fiq->lock)
209{
210 wake_up(&fiq->waitq);
211 kill_fasync(&fiq->fasync, SIGIO, POLL_IN);
212 spin_unlock(&fiq->lock);
213}
214
215const struct fuse_iqueue_ops fuse_dev_fiq_ops = {
216 .wake_forget_and_unlock = fuse_dev_wake_and_unlock,
217 .wake_interrupt_and_unlock = fuse_dev_wake_and_unlock,
218 .wake_pending_and_unlock = fuse_dev_wake_and_unlock,
219};
220EXPORT_SYMBOL_GPL(fuse_dev_fiq_ops);
221
222static void queue_request_and_unlock(struct fuse_iqueue *fiq,
223 struct fuse_req *req)
224__releases(fiq->lock)
Miklos Szeredid12def12008-02-06 01:38:39 -0800225{
Miklos Szeredid12def12008-02-06 01:38:39 -0800226 req->in.h.len = sizeof(struct fuse_in_header) +
Stefan Hajnoczi14d46d72018-06-21 09:34:25 +0100227 fuse_len_args(req->args->in_numargs,
228 (struct fuse_arg *) req->args->in_args);
Miklos Szeredif88996a2015-07-01 16:26:01 +0200229 list_add_tail(&req->list, &fiq->pending);
Stefan Hajnocziae3aad72018-06-18 15:53:19 +0100230 fiq->ops->wake_pending_and_unlock(fiq);
Miklos Szeredid12def12008-02-06 01:38:39 -0800231}
232
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100233void fuse_queue_forget(struct fuse_conn *fc, struct fuse_forget_link *forget,
234 u64 nodeid, u64 nlookup)
235{
Miklos Szeredif88996a2015-07-01 16:26:01 +0200236 struct fuse_iqueue *fiq = &fc->iq;
237
Miklos Szeredi02c048b2010-12-07 20:16:56 +0100238 forget->forget_one.nodeid = nodeid;
239 forget->forget_one.nlookup = nlookup;
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100240
Eric Biggers76e43c82019-09-08 20:15:18 -0700241 spin_lock(&fiq->lock);
Miklos Szeredie16714d2015-07-01 16:26:01 +0200242 if (fiq->connected) {
Miklos Szeredif88996a2015-07-01 16:26:01 +0200243 fiq->forget_list_tail->next = forget;
244 fiq->forget_list_tail = forget;
Stefan Hajnocziae3aad72018-06-18 15:53:19 +0100245 fiq->ops->wake_forget_and_unlock(fiq);
Miklos Szeredi5dfcc872011-09-12 09:38:03 +0200246 } else {
247 kfree(forget);
Stefan Hajnocziae3aad72018-06-18 15:53:19 +0100248 spin_unlock(&fiq->lock);
Miklos Szeredi5dfcc872011-09-12 09:38:03 +0200249 }
Miklos Szeredi07e77dc2010-12-07 20:16:56 +0100250}
251
Miklos Szeredid12def12008-02-06 01:38:39 -0800252static void flush_bg_queue(struct fuse_conn *fc)
253{
Kirill Tkhaie2871792018-07-31 13:25:25 +0300254 struct fuse_iqueue *fiq = &fc->iq;
255
Csaba Henk7a6d3c82009-07-01 17:28:41 -0700256 while (fc->active_background < fc->max_background &&
Miklos Szeredid12def12008-02-06 01:38:39 -0800257 !list_empty(&fc->bg_queue)) {
258 struct fuse_req *req;
259
Kirill Tkhaie2871792018-07-31 13:25:25 +0300260 req = list_first_entry(&fc->bg_queue, struct fuse_req, list);
Miklos Szeredid12def12008-02-06 01:38:39 -0800261 list_del(&req->list);
262 fc->active_background++;
Eric Biggers76e43c82019-09-08 20:15:18 -0700263 spin_lock(&fiq->lock);
Miklos Szeredif88996a2015-07-01 16:26:01 +0200264 req->in.h.unique = fuse_get_unique(fiq);
Stefan Hajnocziae3aad72018-06-18 15:53:19 +0100265 queue_request_and_unlock(fiq, req);
Miklos Szeredid12def12008-02-06 01:38:39 -0800266 }
267}
268
Miklos Szeredi6dbbcb12006-04-26 10:49:06 +0200269/*
Miklos Szeredi334f4852005-09-09 13:10:27 -0700270 * This function is called when a request is finished. Either a reply
Miklos Szeredif9a28422006-06-25 05:48:53 -0700271 * has arrived or it was aborted (and not yet sent) or some error
Miklos Szeredif43b1552006-01-16 22:14:26 -0800272 * occurred during communication with userspace, or the device file
Miklos Szeredi51eb01e2006-06-25 05:48:50 -0700273 * was closed. The requester thread is woken up (if still waiting),
274 * the 'end' callback is called if given, else the reference to the
275 * request is released
Miklos Szeredi334f4852005-09-09 13:10:27 -0700276 */
Stefan Hajnoczi04ec5af2018-06-21 09:33:40 +0100277void fuse_request_end(struct fuse_conn *fc, struct fuse_req *req)
Miklos Szeredi334f4852005-09-09 13:10:27 -0700278{
Miklos Szeredi4ce60812015-07-01 16:26:02 +0200279 struct fuse_iqueue *fiq = &fc->iq;
Miklos Szeredid4993772019-09-10 15:04:11 +0200280 bool async = req->args->end;
Miklos Szeredi365ae712015-07-01 16:26:06 +0200281
Miklos Szerediefe28002015-07-01 16:26:07 +0200282 if (test_and_set_bit(FR_FINISHED, &req->flags))
Miklos Szeredib8f95e52018-07-26 16:13:11 +0200283 goto put_request;
Kirill Tkhai217316a2018-11-08 12:05:25 +0300284 /*
285 * test_and_set_bit() implies smp_mb() between bit
286 * changing and below intr_entry check. Pairs with
287 * smp_mb() from queue_interrupt().
288 */
289 if (!list_empty(&req->intr_entry)) {
Eric Biggers76e43c82019-09-08 20:15:18 -0700290 spin_lock(&fiq->lock);
Kirill Tkhai217316a2018-11-08 12:05:25 +0300291 list_del_init(&req->intr_entry);
Eric Biggers76e43c82019-09-08 20:15:18 -0700292 spin_unlock(&fiq->lock);
Kirill Tkhai217316a2018-11-08 12:05:25 +0300293 }
Miklos Szeredi33e14b42015-07-01 16:26:01 +0200294 WARN_ON(test_bit(FR_PENDING, &req->flags));
295 WARN_ON(test_bit(FR_SENT, &req->flags));
Miklos Szeredi825d6d32015-07-01 16:25:58 +0200296 if (test_bit(FR_BACKGROUND, &req->flags)) {
Kirill Tkhaiae2dffa2018-08-27 18:29:46 +0300297 spin_lock(&fc->bg_lock);
Miklos Szeredi825d6d32015-07-01 16:25:58 +0200298 clear_bit(FR_BACKGROUND, &req->flags);
Miklos Szeredi908a5722018-09-28 16:43:22 +0200299 if (fc->num_background == fc->max_background) {
Miklos Szeredi51eb01e2006-06-25 05:48:50 -0700300 fc->blocked = 0;
Maxim Patlasov722d2be2013-03-21 18:02:36 +0400301 wake_up(&fc->blocked_waitq);
Miklos Szeredi908a5722018-09-28 16:43:22 +0200302 } else if (!fc->blocked) {
303 /*
304 * Wake up next waiter, if any. It's okay to use
305 * waitqueue_active(), as we've already synced up
306 * fc->blocked with waiters with the wake_up() call
307 * above.
308 */
309 if (waitqueue_active(&fc->blocked_waitq))
310 wake_up(&fc->blocked_waitq);
311 }
Maxim Patlasov722d2be2013-03-21 18:02:36 +0400312
Tejun Heo8a301eb2018-02-02 09:54:14 -0800313 if (fc->num_background == fc->congestion_threshold && fc->sb) {
Jan Kara5f7f7542017-04-12 12:24:40 +0200314 clear_bdi_congested(fc->sb->s_bdi, BLK_RW_SYNC);
315 clear_bdi_congested(fc->sb->s_bdi, BLK_RW_ASYNC);
Miklos Szeredif92b99b2007-10-16 23:30:59 -0700316 }
Miklos Szeredi51eb01e2006-06-25 05:48:50 -0700317 fc->num_background--;
Miklos Szeredid12def12008-02-06 01:38:39 -0800318 fc->active_background--;
319 flush_bg_queue(fc);
Kirill Tkhaiae2dffa2018-08-27 18:29:46 +0300320 spin_unlock(&fc->bg_lock);
Kirill Tkhai5e0fed72018-11-08 12:05:31 +0300321 } else {
322 /* Wake up waiter sleeping in request_wait_answer() */
323 wake_up(&req->waitq);
Miklos Szeredi334f4852005-09-09 13:10:27 -0700324 }
Kirill Tkhai5e0fed72018-11-08 12:05:31 +0300325
Miklos Szeredid4993772019-09-10 15:04:11 +0200326 if (async)
327 req->args->end(fc, req->args, req->out.h.error);
Miklos Szeredib8f95e52018-07-26 16:13:11 +0200328put_request:
Tejun Heoe9bb09d2008-11-26 12:03:54 +0100329 fuse_put_request(fc, req);
Miklos Szeredi334f4852005-09-09 13:10:27 -0700330}
Stefan Hajnoczi04ec5af2018-06-21 09:33:40 +0100331EXPORT_SYMBOL_GPL(fuse_request_end);
Miklos Szeredi334f4852005-09-09 13:10:27 -0700332
Kirill Tkhaib7829112018-11-08 12:05:42 +0300333static int queue_interrupt(struct fuse_iqueue *fiq, struct fuse_req *req)
Miklos Szeredia4d27e72006-06-25 05:48:54 -0700334{
Eric Biggers76e43c82019-09-08 20:15:18 -0700335 spin_lock(&fiq->lock);
Kirill Tkhaib7829112018-11-08 12:05:42 +0300336 /* Check for we've sent request to interrupt this req */
337 if (unlikely(!test_bit(FR_INTERRUPTED, &req->flags))) {
Eric Biggers76e43c82019-09-08 20:15:18 -0700338 spin_unlock(&fiq->lock);
Kirill Tkhaib7829112018-11-08 12:05:42 +0300339 return -EINVAL;
340 }
341
Miklos Szeredi8f7bb362015-07-01 16:26:03 +0200342 if (list_empty(&req->intr_entry)) {
343 list_add_tail(&req->intr_entry, &fiq->interrupts);
Kirill Tkhai217316a2018-11-08 12:05:25 +0300344 /*
345 * Pairs with smp_mb() implied by test_and_set_bit()
346 * from request_end().
347 */
348 smp_mb();
349 if (test_bit(FR_FINISHED, &req->flags)) {
350 list_del_init(&req->intr_entry);
Eric Biggers76e43c82019-09-08 20:15:18 -0700351 spin_unlock(&fiq->lock);
Kirill Tkhaib7829112018-11-08 12:05:42 +0300352 return 0;
Kirill Tkhai217316a2018-11-08 12:05:25 +0300353 }
Stefan Hajnocziae3aad72018-06-18 15:53:19 +0100354 fiq->ops->wake_interrupt_and_unlock(fiq);
355 } else {
356 spin_unlock(&fiq->lock);
Miklos Szeredi8f7bb362015-07-01 16:26:03 +0200357 }
Kirill Tkhaib7829112018-11-08 12:05:42 +0300358 return 0;
Miklos Szeredia4d27e72006-06-25 05:48:54 -0700359}
360
Miklos Szeredi7c352bd2005-09-09 13:10:39 -0700361static void request_wait_answer(struct fuse_conn *fc, struct fuse_req *req)
Miklos Szeredi334f4852005-09-09 13:10:27 -0700362{
Miklos Szeredi4ce60812015-07-01 16:26:02 +0200363 struct fuse_iqueue *fiq = &fc->iq;
Miklos Szeredic4775262015-07-01 16:26:00 +0200364 int err;
365
Miklos Szeredia4d27e72006-06-25 05:48:54 -0700366 if (!fc->no_interrupt) {
367 /* Any signal may interrupt this */
Miklos Szeredic4775262015-07-01 16:26:00 +0200368 err = wait_event_interruptible(req->waitq,
Miklos Szeredi33e14b42015-07-01 16:26:01 +0200369 test_bit(FR_FINISHED, &req->flags));
Miklos Szeredic4775262015-07-01 16:26:00 +0200370 if (!err)
Miklos Szeredia4d27e72006-06-25 05:48:54 -0700371 return;
372
Miklos Szeredi825d6d32015-07-01 16:25:58 +0200373 set_bit(FR_INTERRUPTED, &req->flags);
Miklos Szeredi8f7bb362015-07-01 16:26:03 +0200374 /* matches barrier in fuse_dev_do_read() */
375 smp_mb__after_atomic();
Miklos Szeredi33e14b42015-07-01 16:26:01 +0200376 if (test_bit(FR_SENT, &req->flags))
Miklos Szeredi4ce60812015-07-01 16:26:02 +0200377 queue_interrupt(fiq, req);
Miklos Szeredia4d27e72006-06-25 05:48:54 -0700378 }
379
Miklos Szeredi825d6d32015-07-01 16:25:58 +0200380 if (!test_bit(FR_FORCE, &req->flags)) {
Miklos Szeredia4d27e72006-06-25 05:48:54 -0700381 /* Only fatal signals may interrupt this */
Al Viro7d3a07f2016-07-19 03:08:27 -0400382 err = wait_event_killable(req->waitq,
Miklos Szeredi33e14b42015-07-01 16:26:01 +0200383 test_bit(FR_FINISHED, &req->flags));
Miklos Szeredic4775262015-07-01 16:26:00 +0200384 if (!err)
Miklos Szeredia131de02007-10-16 23:31:04 -0700385 return;
386
Eric Biggers76e43c82019-09-08 20:15:18 -0700387 spin_lock(&fiq->lock);
Miklos Szeredia131de02007-10-16 23:31:04 -0700388 /* Request is not yet in userspace, bail out */
Miklos Szeredi33e14b42015-07-01 16:26:01 +0200389 if (test_bit(FR_PENDING, &req->flags)) {
Miklos Szeredia131de02007-10-16 23:31:04 -0700390 list_del(&req->list);
Eric Biggers76e43c82019-09-08 20:15:18 -0700391 spin_unlock(&fiq->lock);
Miklos Szeredia131de02007-10-16 23:31:04 -0700392 __fuse_put_request(req);
393 req->out.h.error = -EINTR;
394 return;
395 }
Eric Biggers76e43c82019-09-08 20:15:18 -0700396 spin_unlock(&fiq->lock);
Miklos Szeredi51eb01e2006-06-25 05:48:50 -0700397 }
Miklos Szeredi334f4852005-09-09 13:10:27 -0700398
Miklos Szeredia131de02007-10-16 23:31:04 -0700399 /*
400 * Either request is already in userspace, or it was forced.
401 * Wait it out.
402 */
Miklos Szeredi33e14b42015-07-01 16:26:01 +0200403 wait_event(req->waitq, test_bit(FR_FINISHED, &req->flags));
Miklos Szeredi334f4852005-09-09 13:10:27 -0700404}
405
Eric Wong6a4e9222013-02-04 13:04:44 +0000406static void __fuse_request_send(struct fuse_conn *fc, struct fuse_req *req)
Miklos Szeredi334f4852005-09-09 13:10:27 -0700407{
Miklos Szeredie16714d2015-07-01 16:26:01 +0200408 struct fuse_iqueue *fiq = &fc->iq;
409
Miklos Szeredi825d6d32015-07-01 16:25:58 +0200410 BUG_ON(test_bit(FR_BACKGROUND, &req->flags));
Eric Biggers76e43c82019-09-08 20:15:18 -0700411 spin_lock(&fiq->lock);
Miklos Szeredie16714d2015-07-01 16:26:01 +0200412 if (!fiq->connected) {
Eric Biggers76e43c82019-09-08 20:15:18 -0700413 spin_unlock(&fiq->lock);
Miklos Szeredi334f4852005-09-09 13:10:27 -0700414 req->out.h.error = -ENOTCONN;
Miklos Szeredic4775262015-07-01 16:26:00 +0200415 } else {
Miklos Szeredif88996a2015-07-01 16:26:01 +0200416 req->in.h.unique = fuse_get_unique(fiq);
Miklos Szeredi334f4852005-09-09 13:10:27 -0700417 /* acquire extra reference, since request is still needed
Stefan Hajnoczi04ec5af2018-06-21 09:33:40 +0100418 after fuse_request_end() */
Miklos Szeredi334f4852005-09-09 13:10:27 -0700419 __fuse_get_request(req);
Stefan Hajnocziae3aad72018-06-18 15:53:19 +0100420 queue_request_and_unlock(fiq, req);
Miklos Szeredi334f4852005-09-09 13:10:27 -0700421
Miklos Szeredi7c352bd2005-09-09 13:10:39 -0700422 request_wait_answer(fc, req);
Stefan Hajnoczi04ec5af2018-06-21 09:33:40 +0100423 /* Pairs with smp_wmb() in fuse_request_end() */
Miklos Szeredic4775262015-07-01 16:26:00 +0200424 smp_rmb();
Miklos Szeredi334f4852005-09-09 13:10:27 -0700425 }
Miklos Szeredi334f4852005-09-09 13:10:27 -0700426}
Eric Wong6a4e9222013-02-04 13:04:44 +0000427
Miklos Szeredi21f62172015-01-06 10:45:35 +0100428static void fuse_adjust_compat(struct fuse_conn *fc, struct fuse_args *args)
429{
Miklos Szeredid5b48542019-09-10 15:04:08 +0200430 if (fc->minor < 4 && args->opcode == FUSE_STATFS)
431 args->out_args[0].size = FUSE_COMPAT_STATFS_SIZE;
Miklos Szeredi21f62172015-01-06 10:45:35 +0100432
433 if (fc->minor < 9) {
Miklos Szeredid5b48542019-09-10 15:04:08 +0200434 switch (args->opcode) {
Miklos Szeredi21f62172015-01-06 10:45:35 +0100435 case FUSE_LOOKUP:
436 case FUSE_CREATE:
437 case FUSE_MKNOD:
438 case FUSE_MKDIR:
439 case FUSE_SYMLINK:
440 case FUSE_LINK:
Miklos Szeredid5b48542019-09-10 15:04:08 +0200441 args->out_args[0].size = FUSE_COMPAT_ENTRY_OUT_SIZE;
Miklos Szeredi21f62172015-01-06 10:45:35 +0100442 break;
443 case FUSE_GETATTR:
444 case FUSE_SETATTR:
Miklos Szeredid5b48542019-09-10 15:04:08 +0200445 args->out_args[0].size = FUSE_COMPAT_ATTR_OUT_SIZE;
Miklos Szeredi21f62172015-01-06 10:45:35 +0100446 break;
447 }
448 }
449 if (fc->minor < 12) {
Miklos Szeredid5b48542019-09-10 15:04:08 +0200450 switch (args->opcode) {
Miklos Szeredi21f62172015-01-06 10:45:35 +0100451 case FUSE_CREATE:
Miklos Szeredid5b48542019-09-10 15:04:08 +0200452 args->in_args[0].size = sizeof(struct fuse_open_in);
Miklos Szeredi21f62172015-01-06 10:45:35 +0100453 break;
454 case FUSE_MKNOD:
Miklos Szeredid5b48542019-09-10 15:04:08 +0200455 args->in_args[0].size = FUSE_COMPAT_MKNOD_IN_SIZE;
Miklos Szeredi21f62172015-01-06 10:45:35 +0100456 break;
457 }
458 }
459}
460
Miklos Szeredie4137542019-09-10 15:04:08 +0200461static void fuse_force_creds(struct fuse_conn *fc, struct fuse_req *req)
462{
463 req->in.h.uid = from_kuid_munged(fc->user_ns, current_fsuid());
464 req->in.h.gid = from_kgid_munged(fc->user_ns, current_fsgid());
465 req->in.h.pid = pid_nr_ns(task_pid(current), fc->pid_ns);
466}
467
Miklos Szeredi68583162019-09-10 15:04:09 +0200468void fuse_args_to_req(struct fuse_req *req, struct fuse_args *args)
469{
Miklos Szeredi68583162019-09-10 15:04:09 +0200470 req->in.h.opcode = args->opcode;
471 req->in.h.nodeid = args->nodeid;
Miklos Szeredid4993772019-09-10 15:04:11 +0200472 req->args = args;
Miklos Szeredi68583162019-09-10 15:04:09 +0200473}
474
Miklos Szeredi70781872014-12-12 09:49:05 +0100475ssize_t fuse_simple_request(struct fuse_conn *fc, struct fuse_args *args)
476{
477 struct fuse_req *req;
478 ssize_t ret;
479
Miklos Szeredic500eba2019-09-10 15:04:08 +0200480 if (args->force) {
Miklos Szeredie4137542019-09-10 15:04:08 +0200481 atomic_inc(&fc->num_waiting);
Miklos Szeredi72133942019-09-10 15:04:11 +0200482 req = fuse_request_alloc(GFP_KERNEL | __GFP_NOFAIL);
Miklos Szeredie4137542019-09-10 15:04:08 +0200483
484 if (!args->nocreds)
485 fuse_force_creds(fc, req);
486
487 __set_bit(FR_WAITING, &req->flags);
Miklos Szeredic500eba2019-09-10 15:04:08 +0200488 __set_bit(FR_FORCE, &req->flags);
489 } else {
Miklos Szeredie4137542019-09-10 15:04:08 +0200490 WARN_ON(args->nocreds);
Miklos Szeredi72133942019-09-10 15:04:11 +0200491 req = fuse_get_req(fc, false);
Miklos Szeredic500eba2019-09-10 15:04:08 +0200492 if (IS_ERR(req))
493 return PTR_ERR(req);
494 }
Miklos Szeredi70781872014-12-12 09:49:05 +0100495
Miklos Szeredi21f62172015-01-06 10:45:35 +0100496 /* Needs to be done after fuse_get_req() so that fc->minor is valid */
497 fuse_adjust_compat(fc, args);
Miklos Szeredi68583162019-09-10 15:04:09 +0200498 fuse_args_to_req(req, args);
Miklos Szeredi21f62172015-01-06 10:45:35 +0100499
Miklos Szeredi454a7612019-09-10 15:04:08 +0200500 if (!args->noreply)
501 __set_bit(FR_ISREPLY, &req->flags);
502 __fuse_request_send(fc, req);
Miklos Szeredi70781872014-12-12 09:49:05 +0100503 ret = req->out.h.error;
Miklos Szeredid5b48542019-09-10 15:04:08 +0200504 if (!ret && args->out_argvar) {
Miklos Szeredi093f38a2019-09-10 15:04:09 +0200505 BUG_ON(args->out_numargs == 0);
Miklos Szeredid4993772019-09-10 15:04:11 +0200506 ret = args->out_args[args->out_numargs - 1].size;
Miklos Szeredi70781872014-12-12 09:49:05 +0100507 }
508 fuse_put_request(fc, req);
509
510 return ret;
511}
512
Miklos Szeredi66abc352019-09-10 15:04:11 +0200513static bool fuse_request_queue_background(struct fuse_conn *fc,
514 struct fuse_req *req)
Miklos Szeredid12def12008-02-06 01:38:39 -0800515{
Kirill Tkhai63825b42018-08-27 18:29:56 +0300516 bool queued = false;
517
518 WARN_ON(!test_bit(FR_BACKGROUND, &req->flags));
Miklos Szeredi825d6d32015-07-01 16:25:58 +0200519 if (!test_bit(FR_WAITING, &req->flags)) {
520 __set_bit(FR_WAITING, &req->flags);
Miklos Szeredi5437f242015-07-01 16:25:56 +0200521 atomic_inc(&fc->num_waiting);
522 }
Miklos Szeredi825d6d32015-07-01 16:25:58 +0200523 __set_bit(FR_ISREPLY, &req->flags);
Kirill Tkhaiae2dffa2018-08-27 18:29:46 +0300524 spin_lock(&fc->bg_lock);
Kirill Tkhai63825b42018-08-27 18:29:56 +0300525 if (likely(fc->connected)) {
526 fc->num_background++;
527 if (fc->num_background == fc->max_background)
528 fc->blocked = 1;
529 if (fc->num_background == fc->congestion_threshold && fc->sb) {
530 set_bdi_congested(fc->sb->s_bdi, BLK_RW_SYNC);
531 set_bdi_congested(fc->sb->s_bdi, BLK_RW_ASYNC);
532 }
533 list_add_tail(&req->list, &fc->bg_queue);
534 flush_bg_queue(fc);
535 queued = true;
Miklos Szeredid12def12008-02-06 01:38:39 -0800536 }
Kirill Tkhaiae2dffa2018-08-27 18:29:46 +0300537 spin_unlock(&fc->bg_lock);
Kirill Tkhai63825b42018-08-27 18:29:56 +0300538
539 return queued;
Miklos Szeredid12def12008-02-06 01:38:39 -0800540}
541
Miklos Szeredi12597282019-09-10 15:04:10 +0200542int fuse_simple_background(struct fuse_conn *fc, struct fuse_args *args,
543 gfp_t gfp_flags)
544{
545 struct fuse_req *req;
546
547 if (args->force) {
548 WARN_ON(!args->nocreds);
Miklos Szeredi72133942019-09-10 15:04:11 +0200549 req = fuse_request_alloc(gfp_flags);
Miklos Szeredi12597282019-09-10 15:04:10 +0200550 if (!req)
551 return -ENOMEM;
552 __set_bit(FR_BACKGROUND, &req->flags);
553 } else {
554 WARN_ON(args->nocreds);
Miklos Szeredi72133942019-09-10 15:04:11 +0200555 req = fuse_get_req(fc, true);
Miklos Szeredi12597282019-09-10 15:04:10 +0200556 if (IS_ERR(req))
557 return PTR_ERR(req);
558 }
559
560 fuse_args_to_req(req, args);
561
Miklos Szeredi12597282019-09-10 15:04:10 +0200562 if (!fuse_request_queue_background(fc, req)) {
563 fuse_put_request(fc, req);
564 return -ENOTCONN;
565 }
566
567 return 0;
568}
569EXPORT_SYMBOL_GPL(fuse_simple_background);
570
Miklos Szeredi75b399d2019-09-10 15:04:11 +0200571static int fuse_simple_notify_reply(struct fuse_conn *fc,
572 struct fuse_args *args, u64 unique)
Miklos Szeredi2d45ba32010-07-12 14:41:40 +0200573{
Miklos Szeredi75b399d2019-09-10 15:04:11 +0200574 struct fuse_req *req;
Miklos Szeredif88996a2015-07-01 16:26:01 +0200575 struct fuse_iqueue *fiq = &fc->iq;
Miklos Szeredi75b399d2019-09-10 15:04:11 +0200576 int err = 0;
577
Miklos Szeredi72133942019-09-10 15:04:11 +0200578 req = fuse_get_req(fc, false);
Miklos Szeredi75b399d2019-09-10 15:04:11 +0200579 if (IS_ERR(req))
580 return PTR_ERR(req);
Miklos Szeredi2d45ba32010-07-12 14:41:40 +0200581
Miklos Szeredi825d6d32015-07-01 16:25:58 +0200582 __clear_bit(FR_ISREPLY, &req->flags);
Miklos Szeredi2d45ba32010-07-12 14:41:40 +0200583 req->in.h.unique = unique;
Miklos Szeredi75b399d2019-09-10 15:04:11 +0200584
585 fuse_args_to_req(req, args);
Miklos Szeredi75b399d2019-09-10 15:04:11 +0200586
Eric Biggers76e43c82019-09-08 20:15:18 -0700587 spin_lock(&fiq->lock);
Miklos Szeredie16714d2015-07-01 16:26:01 +0200588 if (fiq->connected) {
Stefan Hajnocziae3aad72018-06-18 15:53:19 +0100589 queue_request_and_unlock(fiq, req);
Miklos Szeredi75b399d2019-09-10 15:04:11 +0200590 } else {
591 err = -ENODEV;
592 spin_unlock(&fiq->lock);
593 fuse_put_request(fc, req);
Miklos Szeredi2d45ba32010-07-12 14:41:40 +0200594 }
Miklos Szeredi2d45ba32010-07-12 14:41:40 +0200595
596 return err;
597}
598
Miklos Szeredi3be5a522008-04-30 00:54:41 -0700599/*
Miklos Szeredi334f4852005-09-09 13:10:27 -0700600 * Lock the request. Up to the next unlock_request() there mustn't be
601 * anything that could cause a page-fault. If the request was already
Miklos Szeredif9a28422006-06-25 05:48:53 -0700602 * aborted bail out.
Miklos Szeredi334f4852005-09-09 13:10:27 -0700603 */
Miklos Szeredidc008092015-07-01 16:25:58 +0200604static int lock_request(struct fuse_req *req)
Miklos Szeredi334f4852005-09-09 13:10:27 -0700605{
606 int err = 0;
607 if (req) {
Miklos Szeredidc008092015-07-01 16:25:58 +0200608 spin_lock(&req->waitq.lock);
Miklos Szeredi825d6d32015-07-01 16:25:58 +0200609 if (test_bit(FR_ABORTED, &req->flags))
Miklos Szeredi334f4852005-09-09 13:10:27 -0700610 err = -ENOENT;
611 else
Miklos Szeredi825d6d32015-07-01 16:25:58 +0200612 set_bit(FR_LOCKED, &req->flags);
Miklos Szeredidc008092015-07-01 16:25:58 +0200613 spin_unlock(&req->waitq.lock);
Miklos Szeredi334f4852005-09-09 13:10:27 -0700614 }
615 return err;
616}
617
618/*
Miklos Szeredi0d8e84b2015-07-01 16:25:58 +0200619 * Unlock request. If it was aborted while locked, caller is responsible
620 * for unlocking and ending the request.
Miklos Szeredi334f4852005-09-09 13:10:27 -0700621 */
Miklos Szeredidc008092015-07-01 16:25:58 +0200622static int unlock_request(struct fuse_req *req)
Miklos Szeredi334f4852005-09-09 13:10:27 -0700623{
Miklos Szeredi0d8e84b2015-07-01 16:25:58 +0200624 int err = 0;
Miklos Szeredi334f4852005-09-09 13:10:27 -0700625 if (req) {
Miklos Szeredidc008092015-07-01 16:25:58 +0200626 spin_lock(&req->waitq.lock);
Miklos Szeredi825d6d32015-07-01 16:25:58 +0200627 if (test_bit(FR_ABORTED, &req->flags))
Miklos Szeredi0d8e84b2015-07-01 16:25:58 +0200628 err = -ENOENT;
629 else
Miklos Szeredi825d6d32015-07-01 16:25:58 +0200630 clear_bit(FR_LOCKED, &req->flags);
Miklos Szeredidc008092015-07-01 16:25:58 +0200631 spin_unlock(&req->waitq.lock);
Miklos Szeredi334f4852005-09-09 13:10:27 -0700632 }
Miklos Szeredi0d8e84b2015-07-01 16:25:58 +0200633 return err;
Miklos Szeredi334f4852005-09-09 13:10:27 -0700634}
635
636struct fuse_copy_state {
637 int write;
638 struct fuse_req *req;
Al Viro6c09e942015-04-03 22:06:08 -0400639 struct iov_iter *iter;
Miklos Szeredidd3bb142010-05-25 15:06:06 +0200640 struct pipe_buffer *pipebufs;
641 struct pipe_buffer *currbuf;
642 struct pipe_inode_info *pipe;
Miklos Szeredi334f4852005-09-09 13:10:27 -0700643 unsigned long nr_segs;
Miklos Szeredi334f4852005-09-09 13:10:27 -0700644 struct page *pg;
Miklos Szeredi334f4852005-09-09 13:10:27 -0700645 unsigned len;
Miklos Szeredic55a01d2014-07-07 15:28:51 +0200646 unsigned offset;
Miklos Szeredice534fb2010-05-25 15:06:07 +0200647 unsigned move_pages:1;
Miklos Szeredi334f4852005-09-09 13:10:27 -0700648};
649
Miklos Szeredidc008092015-07-01 16:25:58 +0200650static void fuse_copy_init(struct fuse_copy_state *cs, int write,
Al Viro6c09e942015-04-03 22:06:08 -0400651 struct iov_iter *iter)
Miklos Szeredi334f4852005-09-09 13:10:27 -0700652{
653 memset(cs, 0, sizeof(*cs));
654 cs->write = write;
Al Viro6c09e942015-04-03 22:06:08 -0400655 cs->iter = iter;
Miklos Szeredi334f4852005-09-09 13:10:27 -0700656}
657
658/* Unmap and put previous page of userspace buffer */
Miklos Szeredi8bfc0162006-01-16 22:14:28 -0800659static void fuse_copy_finish(struct fuse_copy_state *cs)
Miklos Szeredi334f4852005-09-09 13:10:27 -0700660{
Miklos Szeredidd3bb142010-05-25 15:06:06 +0200661 if (cs->currbuf) {
662 struct pipe_buffer *buf = cs->currbuf;
663
Miklos Szeredic55a01d2014-07-07 15:28:51 +0200664 if (cs->write)
Miklos Szeredic3021622010-05-25 15:06:07 +0200665 buf->len = PAGE_SIZE - cs->len;
Miklos Szeredidd3bb142010-05-25 15:06:06 +0200666 cs->currbuf = NULL;
Miklos Szeredic55a01d2014-07-07 15:28:51 +0200667 } else if (cs->pg) {
Miklos Szeredi334f4852005-09-09 13:10:27 -0700668 if (cs->write) {
669 flush_dcache_page(cs->pg);
670 set_page_dirty_lock(cs->pg);
671 }
672 put_page(cs->pg);
Miklos Szeredi334f4852005-09-09 13:10:27 -0700673 }
Miklos Szeredic55a01d2014-07-07 15:28:51 +0200674 cs->pg = NULL;
Miklos Szeredi334f4852005-09-09 13:10:27 -0700675}
676
677/*
678 * Get another pagefull of userspace buffer, and map it to kernel
679 * address space, and lock request
680 */
681static int fuse_copy_fill(struct fuse_copy_state *cs)
682{
Miklos Szeredic55a01d2014-07-07 15:28:51 +0200683 struct page *page;
Miklos Szeredi334f4852005-09-09 13:10:27 -0700684 int err;
685
Miklos Szeredidc008092015-07-01 16:25:58 +0200686 err = unlock_request(cs->req);
Miklos Szeredi0d8e84b2015-07-01 16:25:58 +0200687 if (err)
688 return err;
689
Miklos Szeredi334f4852005-09-09 13:10:27 -0700690 fuse_copy_finish(cs);
Miklos Szeredidd3bb142010-05-25 15:06:06 +0200691 if (cs->pipebufs) {
692 struct pipe_buffer *buf = cs->pipebufs;
693
Miklos Szeredic3021622010-05-25 15:06:07 +0200694 if (!cs->write) {
Miklos Szeredifba597d2016-09-27 10:45:12 +0200695 err = pipe_buf_confirm(cs->pipe, buf);
Miklos Szeredic3021622010-05-25 15:06:07 +0200696 if (err)
697 return err;
Miklos Szeredidd3bb142010-05-25 15:06:06 +0200698
Miklos Szeredic3021622010-05-25 15:06:07 +0200699 BUG_ON(!cs->nr_segs);
700 cs->currbuf = buf;
Miklos Szeredic55a01d2014-07-07 15:28:51 +0200701 cs->pg = buf->page;
702 cs->offset = buf->offset;
Miklos Szeredic3021622010-05-25 15:06:07 +0200703 cs->len = buf->len;
Miklos Szeredic3021622010-05-25 15:06:07 +0200704 cs->pipebufs++;
705 cs->nr_segs--;
706 } else {
Miklos Szeredic3021622010-05-25 15:06:07 +0200707 if (cs->nr_segs == cs->pipe->buffers)
708 return -EIO;
709
710 page = alloc_page(GFP_HIGHUSER);
711 if (!page)
712 return -ENOMEM;
713
714 buf->page = page;
715 buf->offset = 0;
716 buf->len = 0;
717
718 cs->currbuf = buf;
Miklos Szeredic55a01d2014-07-07 15:28:51 +0200719 cs->pg = page;
720 cs->offset = 0;
Miklos Szeredic3021622010-05-25 15:06:07 +0200721 cs->len = PAGE_SIZE;
722 cs->pipebufs++;
723 cs->nr_segs++;
724 }
Miklos Szeredidd3bb142010-05-25 15:06:06 +0200725 } else {
Al Viro6c09e942015-04-03 22:06:08 -0400726 size_t off;
727 err = iov_iter_get_pages(cs->iter, &page, PAGE_SIZE, 1, &off);
Miklos Szeredidd3bb142010-05-25 15:06:06 +0200728 if (err < 0)
729 return err;
Al Viro6c09e942015-04-03 22:06:08 -0400730 BUG_ON(!err);
731 cs->len = err;
732 cs->offset = off;
Miklos Szeredic55a01d2014-07-07 15:28:51 +0200733 cs->pg = page;
Al Viro6c09e942015-04-03 22:06:08 -0400734 iov_iter_advance(cs->iter, err);
Miklos Szeredi334f4852005-09-09 13:10:27 -0700735 }
Miklos Szeredi334f4852005-09-09 13:10:27 -0700736
Miklos Szeredidc008092015-07-01 16:25:58 +0200737 return lock_request(cs->req);
Miklos Szeredi334f4852005-09-09 13:10:27 -0700738}
739
740/* Do as much copy to/from userspace buffer as we can */
Miklos Szeredi8bfc0162006-01-16 22:14:28 -0800741static int fuse_copy_do(struct fuse_copy_state *cs, void **val, unsigned *size)
Miklos Szeredi334f4852005-09-09 13:10:27 -0700742{
743 unsigned ncpy = min(*size, cs->len);
744 if (val) {
Miklos Szeredic55a01d2014-07-07 15:28:51 +0200745 void *pgaddr = kmap_atomic(cs->pg);
746 void *buf = pgaddr + cs->offset;
747
Miklos Szeredi334f4852005-09-09 13:10:27 -0700748 if (cs->write)
Miklos Szeredic55a01d2014-07-07 15:28:51 +0200749 memcpy(buf, *val, ncpy);
Miklos Szeredi334f4852005-09-09 13:10:27 -0700750 else
Miklos Szeredic55a01d2014-07-07 15:28:51 +0200751 memcpy(*val, buf, ncpy);
752
753 kunmap_atomic(pgaddr);
Miklos Szeredi334f4852005-09-09 13:10:27 -0700754 *val += ncpy;
755 }
756 *size -= ncpy;
757 cs->len -= ncpy;
Miklos Szeredic55a01d2014-07-07 15:28:51 +0200758 cs->offset += ncpy;
Miklos Szeredi334f4852005-09-09 13:10:27 -0700759 return ncpy;
760}
761
Miklos Szeredice534fb2010-05-25 15:06:07 +0200762static int fuse_check_page(struct page *page)
763{
764 if (page_mapcount(page) ||
765 page->mapping != NULL ||
766 page_count(page) != 1 ||
767 (page->flags & PAGE_FLAGS_CHECK_AT_PREP &
768 ~(1 << PG_locked |
769 1 << PG_referenced |
770 1 << PG_uptodate |
771 1 << PG_lru |
772 1 << PG_active |
773 1 << PG_reclaim))) {
Kirill Smelkovf2294482019-03-27 09:15:17 +0000774 pr_warn("trying to steal weird page\n");
775 pr_warn(" page=%p index=%li flags=%08lx, count=%i, mapcount=%i, mapping=%p\n", page, page->index, page->flags, page_count(page), page_mapcount(page), page->mapping);
Miklos Szeredice534fb2010-05-25 15:06:07 +0200776 return 1;
777 }
778 return 0;
779}
780
781static int fuse_try_move_page(struct fuse_copy_state *cs, struct page **pagep)
782{
783 int err;
784 struct page *oldpage = *pagep;
785 struct page *newpage;
786 struct pipe_buffer *buf = cs->pipebufs;
Miklos Szeredice534fb2010-05-25 15:06:07 +0200787
Miklos Szeredidc008092015-07-01 16:25:58 +0200788 err = unlock_request(cs->req);
Miklos Szeredi0d8e84b2015-07-01 16:25:58 +0200789 if (err)
790 return err;
791
Miklos Szeredice534fb2010-05-25 15:06:07 +0200792 fuse_copy_finish(cs);
793
Miklos Szeredifba597d2016-09-27 10:45:12 +0200794 err = pipe_buf_confirm(cs->pipe, buf);
Miklos Szeredice534fb2010-05-25 15:06:07 +0200795 if (err)
796 return err;
797
798 BUG_ON(!cs->nr_segs);
799 cs->currbuf = buf;
800 cs->len = buf->len;
801 cs->pipebufs++;
802 cs->nr_segs--;
803
804 if (cs->len != PAGE_SIZE)
805 goto out_fallback;
806
Miklos Szeredica76f5b2016-09-27 10:45:12 +0200807 if (pipe_buf_steal(cs->pipe, buf) != 0)
Miklos Szeredice534fb2010-05-25 15:06:07 +0200808 goto out_fallback;
809
810 newpage = buf->page;
811
Miklos Szerediaa991b32015-02-26 11:45:47 +0100812 if (!PageUptodate(newpage))
813 SetPageUptodate(newpage);
Miklos Szeredice534fb2010-05-25 15:06:07 +0200814
815 ClearPageMappedToDisk(newpage);
816
817 if (fuse_check_page(newpage) != 0)
818 goto out_fallback_unlock;
819
Miklos Szeredice534fb2010-05-25 15:06:07 +0200820 /*
821 * This is a new and locked page, it shouldn't be mapped or
822 * have any special flags on it
823 */
824 if (WARN_ON(page_mapped(oldpage)))
825 goto out_fallback_unlock;
826 if (WARN_ON(page_has_private(oldpage)))
827 goto out_fallback_unlock;
828 if (WARN_ON(PageDirty(oldpage) || PageWriteback(oldpage)))
829 goto out_fallback_unlock;
830 if (WARN_ON(PageMlocked(oldpage)))
831 goto out_fallback_unlock;
832
Miklos Szeredief6a3c62011-03-22 16:30:52 -0700833 err = replace_page_cache_page(oldpage, newpage, GFP_KERNEL);
Miklos Szeredice534fb2010-05-25 15:06:07 +0200834 if (err) {
Miklos Szeredief6a3c62011-03-22 16:30:52 -0700835 unlock_page(newpage);
836 return err;
Miklos Szeredice534fb2010-05-25 15:06:07 +0200837 }
Miklos Szeredief6a3c62011-03-22 16:30:52 -0700838
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +0300839 get_page(newpage);
Miklos Szeredice534fb2010-05-25 15:06:07 +0200840
841 if (!(buf->flags & PIPE_BUF_FLAG_LRU))
842 lru_cache_add_file(newpage);
843
844 err = 0;
Miklos Szeredidc008092015-07-01 16:25:58 +0200845 spin_lock(&cs->req->waitq.lock);
Miklos Szeredi825d6d32015-07-01 16:25:58 +0200846 if (test_bit(FR_ABORTED, &cs->req->flags))
Miklos Szeredice534fb2010-05-25 15:06:07 +0200847 err = -ENOENT;
848 else
849 *pagep = newpage;
Miklos Szeredidc008092015-07-01 16:25:58 +0200850 spin_unlock(&cs->req->waitq.lock);
Miklos Szeredice534fb2010-05-25 15:06:07 +0200851
852 if (err) {
853 unlock_page(newpage);
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +0300854 put_page(newpage);
Miklos Szeredice534fb2010-05-25 15:06:07 +0200855 return err;
856 }
857
858 unlock_page(oldpage);
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +0300859 put_page(oldpage);
Miklos Szeredice534fb2010-05-25 15:06:07 +0200860 cs->len = 0;
861
862 return 0;
863
864out_fallback_unlock:
865 unlock_page(newpage);
866out_fallback:
Miklos Szeredic55a01d2014-07-07 15:28:51 +0200867 cs->pg = buf->page;
868 cs->offset = buf->offset;
Miklos Szeredice534fb2010-05-25 15:06:07 +0200869
Miklos Szeredidc008092015-07-01 16:25:58 +0200870 err = lock_request(cs->req);
Miklos Szeredice534fb2010-05-25 15:06:07 +0200871 if (err)
872 return err;
873
874 return 1;
875}
876
Miklos Szeredic3021622010-05-25 15:06:07 +0200877static int fuse_ref_page(struct fuse_copy_state *cs, struct page *page,
878 unsigned offset, unsigned count)
879{
880 struct pipe_buffer *buf;
Miklos Szeredi0d8e84b2015-07-01 16:25:58 +0200881 int err;
Miklos Szeredic3021622010-05-25 15:06:07 +0200882
883 if (cs->nr_segs == cs->pipe->buffers)
884 return -EIO;
885
Miklos Szeredidc008092015-07-01 16:25:58 +0200886 err = unlock_request(cs->req);
Miklos Szeredi0d8e84b2015-07-01 16:25:58 +0200887 if (err)
888 return err;
889
Miklos Szeredic3021622010-05-25 15:06:07 +0200890 fuse_copy_finish(cs);
891
892 buf = cs->pipebufs;
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +0300893 get_page(page);
Miklos Szeredic3021622010-05-25 15:06:07 +0200894 buf->page = page;
895 buf->offset = offset;
896 buf->len = count;
897
898 cs->pipebufs++;
899 cs->nr_segs++;
900 cs->len = 0;
901
902 return 0;
903}
904
Miklos Szeredi334f4852005-09-09 13:10:27 -0700905/*
906 * Copy a page in the request to/from the userspace buffer. Must be
907 * done atomically
908 */
Miklos Szeredice534fb2010-05-25 15:06:07 +0200909static int fuse_copy_page(struct fuse_copy_state *cs, struct page **pagep,
Miklos Szeredi8bfc0162006-01-16 22:14:28 -0800910 unsigned offset, unsigned count, int zeroing)
Miklos Szeredi334f4852005-09-09 13:10:27 -0700911{
Miklos Szeredice534fb2010-05-25 15:06:07 +0200912 int err;
913 struct page *page = *pagep;
914
Miklos Szeredib6777c42010-10-26 14:22:27 -0700915 if (page && zeroing && count < PAGE_SIZE)
916 clear_highpage(page);
917
Miklos Szeredi334f4852005-09-09 13:10:27 -0700918 while (count) {
Miklos Szeredic3021622010-05-25 15:06:07 +0200919 if (cs->write && cs->pipebufs && page) {
920 return fuse_ref_page(cs, page, offset, count);
921 } else if (!cs->len) {
Miklos Szeredice534fb2010-05-25 15:06:07 +0200922 if (cs->move_pages && page &&
923 offset == 0 && count == PAGE_SIZE) {
924 err = fuse_try_move_page(cs, pagep);
925 if (err <= 0)
926 return err;
927 } else {
928 err = fuse_copy_fill(cs);
929 if (err)
930 return err;
931 }
Miklos Szeredi1729a162008-11-26 12:03:54 +0100932 }
Miklos Szeredi334f4852005-09-09 13:10:27 -0700933 if (page) {
Cong Wang2408f6e2011-11-25 23:14:30 +0800934 void *mapaddr = kmap_atomic(page);
Miklos Szeredi334f4852005-09-09 13:10:27 -0700935 void *buf = mapaddr + offset;
936 offset += fuse_copy_do(cs, &buf, &count);
Cong Wang2408f6e2011-11-25 23:14:30 +0800937 kunmap_atomic(mapaddr);
Miklos Szeredi334f4852005-09-09 13:10:27 -0700938 } else
939 offset += fuse_copy_do(cs, NULL, &count);
940 }
941 if (page && !cs->write)
942 flush_dcache_page(page);
943 return 0;
944}
945
946/* Copy pages in the request to/from userspace buffer */
947static int fuse_copy_pages(struct fuse_copy_state *cs, unsigned nbytes,
948 int zeroing)
949{
950 unsigned i;
951 struct fuse_req *req = cs->req;
Miklos Szeredi05ea48c2019-09-10 15:04:11 +0200952 struct fuse_args_pages *ap = container_of(req->args, typeof(*ap), args);
Miklos Szeredi334f4852005-09-09 13:10:27 -0700953
Miklos Szeredi05ea48c2019-09-10 15:04:11 +0200954
955 for (i = 0; i < ap->num_pages && (nbytes || zeroing); i++) {
Miklos Szeredice534fb2010-05-25 15:06:07 +0200956 int err;
Miklos Szeredi05ea48c2019-09-10 15:04:11 +0200957 unsigned int offset = ap->descs[i].offset;
958 unsigned int count = min(nbytes, ap->descs[i].length);
Miklos Szeredice534fb2010-05-25 15:06:07 +0200959
Miklos Szeredi05ea48c2019-09-10 15:04:11 +0200960 err = fuse_copy_page(cs, &ap->pages[i], offset, count, zeroing);
Miklos Szeredi334f4852005-09-09 13:10:27 -0700961 if (err)
962 return err;
963
964 nbytes -= count;
Miklos Szeredi334f4852005-09-09 13:10:27 -0700965 }
966 return 0;
967}
968
969/* Copy a single argument in the request to/from userspace buffer */
970static int fuse_copy_one(struct fuse_copy_state *cs, void *val, unsigned size)
971{
972 while (size) {
Miklos Szeredi1729a162008-11-26 12:03:54 +0100973 if (!cs->len) {
974 int err = fuse_copy_fill(cs);
975 if (err)
976 return err;
977 }
Miklos Szeredi334f4852005-09-09 13:10:27 -0700978 fuse_copy_do(cs, &val, &size);
979 }
980 return 0;
981}
982
983/* Copy request arguments to/from userspace buffer */
984static int fuse_copy_args(struct fuse_copy_state *cs, unsigned numargs,
985 unsigned argpages, struct fuse_arg *args,
986 int zeroing)
987{
988 int err = 0;
989 unsigned i;
990
991 for (i = 0; !err && i < numargs; i++) {
992 struct fuse_arg *arg = &args[i];
993 if (i == numargs - 1 && argpages)
994 err = fuse_copy_pages(cs, arg->size, zeroing);
995 else
996 err = fuse_copy_one(cs, arg->value, arg->size);
997 }
998 return err;
999}
1000
Miklos Szeredif88996a2015-07-01 16:26:01 +02001001static int forget_pending(struct fuse_iqueue *fiq)
Miklos Szeredi07e77dc2010-12-07 20:16:56 +01001002{
Miklos Szeredif88996a2015-07-01 16:26:01 +02001003 return fiq->forget_list_head.next != NULL;
Miklos Szeredi07e77dc2010-12-07 20:16:56 +01001004}
1005
Miklos Szeredif88996a2015-07-01 16:26:01 +02001006static int request_pending(struct fuse_iqueue *fiq)
Miklos Szeredia4d27e72006-06-25 05:48:54 -07001007{
Miklos Szeredif88996a2015-07-01 16:26:01 +02001008 return !list_empty(&fiq->pending) || !list_empty(&fiq->interrupts) ||
1009 forget_pending(fiq);
Miklos Szeredia4d27e72006-06-25 05:48:54 -07001010}
1011
Miklos Szeredi334f4852005-09-09 13:10:27 -07001012/*
Miklos Szeredia4d27e72006-06-25 05:48:54 -07001013 * Transfer an interrupt request to userspace
1014 *
1015 * Unlike other requests this is assembled on demand, without a need
1016 * to allocate a separate fuse_req structure.
1017 *
Eric Biggers76e43c82019-09-08 20:15:18 -07001018 * Called with fiq->lock held, releases it
Miklos Szeredia4d27e72006-06-25 05:48:54 -07001019 */
Miklos Szeredifd22d622015-07-01 16:26:03 +02001020static int fuse_read_interrupt(struct fuse_iqueue *fiq,
1021 struct fuse_copy_state *cs,
Miklos Szeredic3021622010-05-25 15:06:07 +02001022 size_t nbytes, struct fuse_req *req)
Eric Biggers76e43c82019-09-08 20:15:18 -07001023__releases(fiq->lock)
Miklos Szeredia4d27e72006-06-25 05:48:54 -07001024{
Miklos Szeredia4d27e72006-06-25 05:48:54 -07001025 struct fuse_in_header ih;
1026 struct fuse_interrupt_in arg;
1027 unsigned reqsize = sizeof(ih) + sizeof(arg);
1028 int err;
1029
1030 list_del_init(&req->intr_entry);
Miklos Szeredia4d27e72006-06-25 05:48:54 -07001031 memset(&ih, 0, sizeof(ih));
1032 memset(&arg, 0, sizeof(arg));
1033 ih.len = reqsize;
1034 ih.opcode = FUSE_INTERRUPT;
Kirill Tkhai3a5358d2018-09-11 13:12:05 +03001035 ih.unique = (req->in.h.unique | FUSE_INT_REQ_BIT);
Miklos Szeredia4d27e72006-06-25 05:48:54 -07001036 arg.unique = req->in.h.unique;
1037
Eric Biggers76e43c82019-09-08 20:15:18 -07001038 spin_unlock(&fiq->lock);
Miklos Szeredic3021622010-05-25 15:06:07 +02001039 if (nbytes < reqsize)
Miklos Szeredia4d27e72006-06-25 05:48:54 -07001040 return -EINVAL;
1041
Miklos Szeredic3021622010-05-25 15:06:07 +02001042 err = fuse_copy_one(cs, &ih, sizeof(ih));
Miklos Szeredia4d27e72006-06-25 05:48:54 -07001043 if (!err)
Miklos Szeredic3021622010-05-25 15:06:07 +02001044 err = fuse_copy_one(cs, &arg, sizeof(arg));
1045 fuse_copy_finish(cs);
Miklos Szeredia4d27e72006-06-25 05:48:54 -07001046
1047 return err ? err : reqsize;
1048}
1049
Vivek Goyal4388c5a2019-06-05 15:50:43 -04001050struct fuse_forget_link *fuse_dequeue_forget(struct fuse_iqueue *fiq,
1051 unsigned int max,
1052 unsigned int *countp)
Miklos Szeredi07e77dc2010-12-07 20:16:56 +01001053{
Miklos Szeredif88996a2015-07-01 16:26:01 +02001054 struct fuse_forget_link *head = fiq->forget_list_head.next;
Miklos Szeredi02c048b2010-12-07 20:16:56 +01001055 struct fuse_forget_link **newhead = &head;
1056 unsigned count;
Miklos Szeredi07e77dc2010-12-07 20:16:56 +01001057
Miklos Szeredi02c048b2010-12-07 20:16:56 +01001058 for (count = 0; *newhead != NULL && count < max; count++)
1059 newhead = &(*newhead)->next;
1060
Miklos Szeredif88996a2015-07-01 16:26:01 +02001061 fiq->forget_list_head.next = *newhead;
Miklos Szeredi02c048b2010-12-07 20:16:56 +01001062 *newhead = NULL;
Miklos Szeredif88996a2015-07-01 16:26:01 +02001063 if (fiq->forget_list_head.next == NULL)
1064 fiq->forget_list_tail = &fiq->forget_list_head;
Miklos Szeredi07e77dc2010-12-07 20:16:56 +01001065
Miklos Szeredi02c048b2010-12-07 20:16:56 +01001066 if (countp != NULL)
1067 *countp = count;
1068
1069 return head;
Miklos Szeredi07e77dc2010-12-07 20:16:56 +01001070}
Vivek Goyal4388c5a2019-06-05 15:50:43 -04001071EXPORT_SYMBOL(fuse_dequeue_forget);
Miklos Szeredi07e77dc2010-12-07 20:16:56 +01001072
Miklos Szeredifd22d622015-07-01 16:26:03 +02001073static int fuse_read_single_forget(struct fuse_iqueue *fiq,
Miklos Szeredi07e77dc2010-12-07 20:16:56 +01001074 struct fuse_copy_state *cs,
1075 size_t nbytes)
Eric Biggers76e43c82019-09-08 20:15:18 -07001076__releases(fiq->lock)
Miklos Szeredi07e77dc2010-12-07 20:16:56 +01001077{
1078 int err;
Vivek Goyal4388c5a2019-06-05 15:50:43 -04001079 struct fuse_forget_link *forget = fuse_dequeue_forget(fiq, 1, NULL);
Miklos Szeredi07e77dc2010-12-07 20:16:56 +01001080 struct fuse_forget_in arg = {
Miklos Szeredi02c048b2010-12-07 20:16:56 +01001081 .nlookup = forget->forget_one.nlookup,
Miklos Szeredi07e77dc2010-12-07 20:16:56 +01001082 };
1083 struct fuse_in_header ih = {
1084 .opcode = FUSE_FORGET,
Miklos Szeredi02c048b2010-12-07 20:16:56 +01001085 .nodeid = forget->forget_one.nodeid,
Miklos Szeredif88996a2015-07-01 16:26:01 +02001086 .unique = fuse_get_unique(fiq),
Miklos Szeredi07e77dc2010-12-07 20:16:56 +01001087 .len = sizeof(ih) + sizeof(arg),
1088 };
1089
Eric Biggers76e43c82019-09-08 20:15:18 -07001090 spin_unlock(&fiq->lock);
Miklos Szeredi07e77dc2010-12-07 20:16:56 +01001091 kfree(forget);
1092 if (nbytes < ih.len)
1093 return -EINVAL;
1094
1095 err = fuse_copy_one(cs, &ih, sizeof(ih));
1096 if (!err)
1097 err = fuse_copy_one(cs, &arg, sizeof(arg));
1098 fuse_copy_finish(cs);
1099
1100 if (err)
1101 return err;
1102
1103 return ih.len;
1104}
1105
Miklos Szeredifd22d622015-07-01 16:26:03 +02001106static int fuse_read_batch_forget(struct fuse_iqueue *fiq,
Miklos Szeredi02c048b2010-12-07 20:16:56 +01001107 struct fuse_copy_state *cs, size_t nbytes)
Eric Biggers76e43c82019-09-08 20:15:18 -07001108__releases(fiq->lock)
Miklos Szeredi02c048b2010-12-07 20:16:56 +01001109{
1110 int err;
1111 unsigned max_forgets;
1112 unsigned count;
1113 struct fuse_forget_link *head;
1114 struct fuse_batch_forget_in arg = { .count = 0 };
1115 struct fuse_in_header ih = {
1116 .opcode = FUSE_BATCH_FORGET,
Miklos Szeredif88996a2015-07-01 16:26:01 +02001117 .unique = fuse_get_unique(fiq),
Miklos Szeredi02c048b2010-12-07 20:16:56 +01001118 .len = sizeof(ih) + sizeof(arg),
1119 };
1120
1121 if (nbytes < ih.len) {
Eric Biggers76e43c82019-09-08 20:15:18 -07001122 spin_unlock(&fiq->lock);
Miklos Szeredi02c048b2010-12-07 20:16:56 +01001123 return -EINVAL;
1124 }
1125
1126 max_forgets = (nbytes - ih.len) / sizeof(struct fuse_forget_one);
Vivek Goyal4388c5a2019-06-05 15:50:43 -04001127 head = fuse_dequeue_forget(fiq, max_forgets, &count);
Eric Biggers76e43c82019-09-08 20:15:18 -07001128 spin_unlock(&fiq->lock);
Miklos Szeredi02c048b2010-12-07 20:16:56 +01001129
1130 arg.count = count;
1131 ih.len += count * sizeof(struct fuse_forget_one);
1132 err = fuse_copy_one(cs, &ih, sizeof(ih));
1133 if (!err)
1134 err = fuse_copy_one(cs, &arg, sizeof(arg));
1135
1136 while (head) {
1137 struct fuse_forget_link *forget = head;
1138
1139 if (!err) {
1140 err = fuse_copy_one(cs, &forget->forget_one,
1141 sizeof(forget->forget_one));
1142 }
1143 head = forget->next;
1144 kfree(forget);
1145 }
1146
1147 fuse_copy_finish(cs);
1148
1149 if (err)
1150 return err;
1151
1152 return ih.len;
1153}
1154
Miklos Szeredifd22d622015-07-01 16:26:03 +02001155static int fuse_read_forget(struct fuse_conn *fc, struct fuse_iqueue *fiq,
1156 struct fuse_copy_state *cs,
Miklos Szeredi02c048b2010-12-07 20:16:56 +01001157 size_t nbytes)
Eric Biggers76e43c82019-09-08 20:15:18 -07001158__releases(fiq->lock)
Miklos Szeredi02c048b2010-12-07 20:16:56 +01001159{
Miklos Szeredif88996a2015-07-01 16:26:01 +02001160 if (fc->minor < 16 || fiq->forget_list_head.next->next == NULL)
Miklos Szeredifd22d622015-07-01 16:26:03 +02001161 return fuse_read_single_forget(fiq, cs, nbytes);
Miklos Szeredi02c048b2010-12-07 20:16:56 +01001162 else
Miklos Szeredifd22d622015-07-01 16:26:03 +02001163 return fuse_read_batch_forget(fiq, cs, nbytes);
Miklos Szeredi02c048b2010-12-07 20:16:56 +01001164}
1165
Miklos Szeredia4d27e72006-06-25 05:48:54 -07001166/*
Miklos Szeredi334f4852005-09-09 13:10:27 -07001167 * Read a single request into the userspace filesystem's buffer. This
1168 * function waits until a request is available, then removes it from
1169 * the pending list and copies request data to userspace buffer. If
Miklos Szeredif9a28422006-06-25 05:48:53 -07001170 * no reply is needed (FORGET) or request has been aborted or there
1171 * was an error during the copying then it's finished by calling
Stefan Hajnoczi04ec5af2018-06-21 09:33:40 +01001172 * fuse_request_end(). Otherwise add it to the processing list, and set
Miklos Szeredi334f4852005-09-09 13:10:27 -07001173 * the 'sent' flag.
1174 */
Miklos Szeredic36960462015-07-01 16:26:09 +02001175static ssize_t fuse_dev_do_read(struct fuse_dev *fud, struct file *file,
Miklos Szeredic3021622010-05-25 15:06:07 +02001176 struct fuse_copy_state *cs, size_t nbytes)
Miklos Szeredi334f4852005-09-09 13:10:27 -07001177{
Miklos Szeredi82cbdcd2015-07-01 16:26:05 +02001178 ssize_t err;
Miklos Szeredic36960462015-07-01 16:26:09 +02001179 struct fuse_conn *fc = fud->fc;
Miklos Szeredif88996a2015-07-01 16:26:01 +02001180 struct fuse_iqueue *fiq = &fc->iq;
Miklos Szeredic36960462015-07-01 16:26:09 +02001181 struct fuse_pqueue *fpq = &fud->pq;
Miklos Szeredi334f4852005-09-09 13:10:27 -07001182 struct fuse_req *req;
Miklos Szeredid4993772019-09-10 15:04:11 +02001183 struct fuse_args *args;
Miklos Szeredi334f4852005-09-09 13:10:27 -07001184 unsigned reqsize;
Kirill Tkhaibe2ff422018-09-11 13:12:14 +03001185 unsigned int hash;
Miklos Szeredi334f4852005-09-09 13:10:27 -07001186
Kirill Smelkov1fb027d2019-07-08 17:03:31 +00001187 /*
1188 * Require sane minimum read buffer - that has capacity for fixed part
1189 * of any request header + negotiated max_write room for data.
1190 *
1191 * Historically libfuse reserves 4K for fixed header room, but e.g.
1192 * GlusterFS reserves only 80 bytes
1193 *
1194 * = `sizeof(fuse_in_header) + sizeof(fuse_write_in)`
1195 *
1196 * which is the absolute minimum any sane filesystem should be using
1197 * for header room.
1198 */
1199 if (nbytes < max_t(size_t, FUSE_MIN_READ_BUFFER,
1200 sizeof(struct fuse_in_header) +
1201 sizeof(struct fuse_write_in) +
1202 fc->max_write))
1203 return -EINVAL;
1204
Miklos Szeredi1d3d7522006-01-06 00:19:40 -08001205 restart:
Eric Biggers76e43c82019-09-08 20:15:18 -07001206 for (;;) {
1207 spin_lock(&fiq->lock);
1208 if (!fiq->connected || request_pending(fiq))
1209 break;
1210 spin_unlock(&fiq->lock);
Jeff Dikee5ac1d12006-04-10 22:54:53 -07001211
Eric Biggers76e43c82019-09-08 20:15:18 -07001212 if (file->f_flags & O_NONBLOCK)
1213 return -EAGAIN;
1214 err = wait_event_interruptible_exclusive(fiq->waitq,
Miklos Szeredi52509212015-07-01 16:26:03 +02001215 !fiq->connected || request_pending(fiq));
Eric Biggers76e43c82019-09-08 20:15:18 -07001216 if (err)
1217 return err;
1218 }
Miklos Szeredi52509212015-07-01 16:26:03 +02001219
Szymon Lukasz3b7008b2017-11-09 21:23:35 +01001220 if (!fiq->connected) {
Miklos Szeredieb98e3bd2019-01-24 10:40:16 +01001221 err = fc->aborted ? -ECONNABORTED : -ENODEV;
Miklos Szeredi334f4852005-09-09 13:10:27 -07001222 goto err_unlock;
Szymon Lukasz3b7008b2017-11-09 21:23:35 +01001223 }
Miklos Szeredi334f4852005-09-09 13:10:27 -07001224
Miklos Szeredif88996a2015-07-01 16:26:01 +02001225 if (!list_empty(&fiq->interrupts)) {
1226 req = list_entry(fiq->interrupts.next, struct fuse_req,
Miklos Szeredia4d27e72006-06-25 05:48:54 -07001227 intr_entry);
Miklos Szeredifd22d622015-07-01 16:26:03 +02001228 return fuse_read_interrupt(fiq, cs, nbytes, req);
Miklos Szeredia4d27e72006-06-25 05:48:54 -07001229 }
1230
Miklos Szeredif88996a2015-07-01 16:26:01 +02001231 if (forget_pending(fiq)) {
1232 if (list_empty(&fiq->pending) || fiq->forget_batch-- > 0)
Miklos Szeredifd22d622015-07-01 16:26:03 +02001233 return fuse_read_forget(fc, fiq, cs, nbytes);
Miklos Szeredi07e77dc2010-12-07 20:16:56 +01001234
Miklos Szeredif88996a2015-07-01 16:26:01 +02001235 if (fiq->forget_batch <= -8)
1236 fiq->forget_batch = 16;
Miklos Szeredi07e77dc2010-12-07 20:16:56 +01001237 }
1238
Miklos Szeredif88996a2015-07-01 16:26:01 +02001239 req = list_entry(fiq->pending.next, struct fuse_req, list);
Miklos Szeredi33e14b42015-07-01 16:26:01 +02001240 clear_bit(FR_PENDING, &req->flags);
Miklos Szeredief759252015-07-01 16:26:02 +02001241 list_del_init(&req->list);
Eric Biggers76e43c82019-09-08 20:15:18 -07001242 spin_unlock(&fiq->lock);
Miklos Szeredi4ce60812015-07-01 16:26:02 +02001243
Miklos Szeredid4993772019-09-10 15:04:11 +02001244 args = req->args;
1245 reqsize = req->in.h.len;
Miklos Szeredi5d6d3a32017-09-12 16:57:53 +02001246
Miklos Szeredi1d3d7522006-01-06 00:19:40 -08001247 /* If request is too large, reply with an error and restart the read */
Miklos Szeredic3021622010-05-25 15:06:07 +02001248 if (nbytes < reqsize) {
Miklos Szeredi1d3d7522006-01-06 00:19:40 -08001249 req->out.h.error = -EIO;
1250 /* SETXATTR is special, since it may contain too large data */
Miklos Szeredid4993772019-09-10 15:04:11 +02001251 if (args->opcode == FUSE_SETXATTR)
Miklos Szeredi1d3d7522006-01-06 00:19:40 -08001252 req->out.h.error = -E2BIG;
Stefan Hajnoczi04ec5af2018-06-21 09:33:40 +01001253 fuse_request_end(fc, req);
Miklos Szeredi1d3d7522006-01-06 00:19:40 -08001254 goto restart;
Miklos Szeredi334f4852005-09-09 13:10:27 -07001255 }
Miklos Szeredi45a91cb2015-07-01 16:26:06 +02001256 spin_lock(&fpq->lock);
Miklos Szeredi82cbdcd2015-07-01 16:26:05 +02001257 list_add(&req->list, &fpq->io);
Miklos Szeredi45a91cb2015-07-01 16:26:06 +02001258 spin_unlock(&fpq->lock);
Miklos Szeredic3021622010-05-25 15:06:07 +02001259 cs->req = req;
Miklos Szeredid4993772019-09-10 15:04:11 +02001260 err = fuse_copy_one(cs, &req->in.h, sizeof(req->in.h));
Miklos Szeredi1d3d7522006-01-06 00:19:40 -08001261 if (!err)
Miklos Szeredid4993772019-09-10 15:04:11 +02001262 err = fuse_copy_args(cs, args->in_numargs, args->in_pages,
1263 (struct fuse_arg *) args->in_args, 0);
Miklos Szeredic3021622010-05-25 15:06:07 +02001264 fuse_copy_finish(cs);
Miklos Szeredi45a91cb2015-07-01 16:26:06 +02001265 spin_lock(&fpq->lock);
Miklos Szeredi825d6d32015-07-01 16:25:58 +02001266 clear_bit(FR_LOCKED, &req->flags);
Miklos Szeredie96edd92015-07-01 16:26:04 +02001267 if (!fpq->connected) {
Miklos Szeredieb98e3bd2019-01-24 10:40:16 +01001268 err = fc->aborted ? -ECONNABORTED : -ENODEV;
Miklos Szeredi82cbdcd2015-07-01 16:26:05 +02001269 goto out_end;
Miklos Szeredic9c9d7d2007-10-16 23:31:05 -07001270 }
Miklos Szeredi334f4852005-09-09 13:10:27 -07001271 if (err) {
Miklos Szeredic9c9d7d2007-10-16 23:31:05 -07001272 req->out.h.error = -EIO;
Miklos Szeredi82cbdcd2015-07-01 16:26:05 +02001273 goto out_end;
Miklos Szeredi334f4852005-09-09 13:10:27 -07001274 }
Miklos Szeredi825d6d32015-07-01 16:25:58 +02001275 if (!test_bit(FR_ISREPLY, &req->flags)) {
Miklos Szeredi82cbdcd2015-07-01 16:26:05 +02001276 err = reqsize;
1277 goto out_end;
Miklos Szeredi334f4852005-09-09 13:10:27 -07001278 }
Kirill Tkhaibe2ff422018-09-11 13:12:14 +03001279 hash = fuse_req_hash(req->in.h.unique);
1280 list_move_tail(&req->list, &fpq->processing[hash]);
Kirill Tkhaibc78abb2018-09-25 12:28:55 +03001281 __fuse_get_request(req);
Miklos Szeredi82cbdcd2015-07-01 16:26:05 +02001282 set_bit(FR_SENT, &req->flags);
Miklos Szeredi4c316f22018-09-28 16:43:22 +02001283 spin_unlock(&fpq->lock);
Miklos Szeredi82cbdcd2015-07-01 16:26:05 +02001284 /* matches barrier in request_wait_answer() */
1285 smp_mb__after_atomic();
1286 if (test_bit(FR_INTERRUPTED, &req->flags))
1287 queue_interrupt(fiq, req);
Kirill Tkhaibc78abb2018-09-25 12:28:55 +03001288 fuse_put_request(fc, req);
Miklos Szeredi82cbdcd2015-07-01 16:26:05 +02001289
Miklos Szeredi334f4852005-09-09 13:10:27 -07001290 return reqsize;
1291
Miklos Szeredi82cbdcd2015-07-01 16:26:05 +02001292out_end:
Miklos Szeredi77cd9d42015-07-01 16:26:06 +02001293 if (!test_bit(FR_PRIVATE, &req->flags))
1294 list_del_init(&req->list);
Miklos Szeredi45a91cb2015-07-01 16:26:06 +02001295 spin_unlock(&fpq->lock);
Stefan Hajnoczi04ec5af2018-06-21 09:33:40 +01001296 fuse_request_end(fc, req);
Miklos Szeredi82cbdcd2015-07-01 16:26:05 +02001297 return err;
1298
Miklos Szeredi334f4852005-09-09 13:10:27 -07001299 err_unlock:
Eric Biggers76e43c82019-09-08 20:15:18 -07001300 spin_unlock(&fiq->lock);
Miklos Szeredi334f4852005-09-09 13:10:27 -07001301 return err;
1302}
1303
Tom Van Braeckel94e4fe22015-01-12 05:22:16 +01001304static int fuse_dev_open(struct inode *inode, struct file *file)
1305{
1306 /*
1307 * The fuse device's file's private_data is used to hold
1308 * the fuse_conn(ection) when it is mounted, and is used to
1309 * keep track of whether the file has been mounted already.
1310 */
1311 file->private_data = NULL;
1312 return 0;
1313}
1314
Al Virofbdbacc2015-04-03 21:53:39 -04001315static ssize_t fuse_dev_read(struct kiocb *iocb, struct iov_iter *to)
Miklos Szeredic3021622010-05-25 15:06:07 +02001316{
1317 struct fuse_copy_state cs;
1318 struct file *file = iocb->ki_filp;
Miklos Szeredicc080e92015-07-01 16:26:08 +02001319 struct fuse_dev *fud = fuse_get_dev(file);
1320
1321 if (!fud)
Miklos Szeredic3021622010-05-25 15:06:07 +02001322 return -EPERM;
1323
Al Virofbdbacc2015-04-03 21:53:39 -04001324 if (!iter_is_iovec(to))
1325 return -EINVAL;
Miklos Szeredic3021622010-05-25 15:06:07 +02001326
Miklos Szeredidc008092015-07-01 16:25:58 +02001327 fuse_copy_init(&cs, 1, to);
Al Virofbdbacc2015-04-03 21:53:39 -04001328
Miklos Szeredic36960462015-07-01 16:26:09 +02001329 return fuse_dev_do_read(fud, file, &cs, iov_iter_count(to));
Miklos Szeredic3021622010-05-25 15:06:07 +02001330}
1331
Miklos Szeredic3021622010-05-25 15:06:07 +02001332static ssize_t fuse_dev_splice_read(struct file *in, loff_t *ppos,
1333 struct pipe_inode_info *pipe,
1334 size_t len, unsigned int flags)
1335{
Al Virod82718e2016-09-17 22:56:25 -04001336 int total, ret;
Miklos Szeredic3021622010-05-25 15:06:07 +02001337 int page_nr = 0;
Miklos Szeredic3021622010-05-25 15:06:07 +02001338 struct pipe_buffer *bufs;
1339 struct fuse_copy_state cs;
Miklos Szeredicc080e92015-07-01 16:26:08 +02001340 struct fuse_dev *fud = fuse_get_dev(in);
1341
1342 if (!fud)
Miklos Szeredic3021622010-05-25 15:06:07 +02001343 return -EPERM;
1344
Andrey Ryabinind6d931a2018-07-17 19:00:34 +03001345 bufs = kvmalloc_array(pipe->buffers, sizeof(struct pipe_buffer),
1346 GFP_KERNEL);
Miklos Szeredic3021622010-05-25 15:06:07 +02001347 if (!bufs)
1348 return -ENOMEM;
1349
Miklos Szeredidc008092015-07-01 16:25:58 +02001350 fuse_copy_init(&cs, 1, NULL);
Miklos Szeredic3021622010-05-25 15:06:07 +02001351 cs.pipebufs = bufs;
1352 cs.pipe = pipe;
Miklos Szeredic36960462015-07-01 16:26:09 +02001353 ret = fuse_dev_do_read(fud, in, &cs, len);
Miklos Szeredic3021622010-05-25 15:06:07 +02001354 if (ret < 0)
1355 goto out;
1356
Miklos Szeredic3021622010-05-25 15:06:07 +02001357 if (pipe->nrbufs + cs.nr_segs > pipe->buffers) {
1358 ret = -EIO;
Al Virod82718e2016-09-17 22:56:25 -04001359 goto out;
Miklos Szeredic3021622010-05-25 15:06:07 +02001360 }
1361
Al Virod82718e2016-09-17 22:56:25 -04001362 for (ret = total = 0; page_nr < cs.nr_segs; total += ret) {
Miklos Szeredi28a625c2014-01-22 19:36:57 +01001363 /*
1364 * Need to be careful about this. Having buf->ops in module
1365 * code can Oops if the buffer persists after module unload.
1366 */
Al Virod82718e2016-09-17 22:56:25 -04001367 bufs[page_nr].ops = &nosteal_pipe_buf_ops;
Miklos Szeredi84588a92017-02-16 15:08:20 +01001368 bufs[page_nr].flags = 0;
Al Virod82718e2016-09-17 22:56:25 -04001369 ret = add_to_pipe(pipe, &bufs[page_nr++]);
1370 if (unlikely(ret < 0))
1371 break;
Miklos Szeredic3021622010-05-25 15:06:07 +02001372 }
Al Virod82718e2016-09-17 22:56:25 -04001373 if (total)
1374 ret = total;
Miklos Szeredic3021622010-05-25 15:06:07 +02001375out:
1376 for (; page_nr < cs.nr_segs; page_nr++)
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +03001377 put_page(bufs[page_nr].page);
Miklos Szeredic3021622010-05-25 15:06:07 +02001378
Andrey Ryabinind6d931a2018-07-17 19:00:34 +03001379 kvfree(bufs);
Miklos Szeredic3021622010-05-25 15:06:07 +02001380 return ret;
1381}
1382
Tejun Heo95668a62008-11-26 12:03:55 +01001383static int fuse_notify_poll(struct fuse_conn *fc, unsigned int size,
1384 struct fuse_copy_state *cs)
1385{
1386 struct fuse_notify_poll_wakeup_out outarg;
Miklos Szeredif6d47a12009-01-26 15:00:59 +01001387 int err = -EINVAL;
Tejun Heo95668a62008-11-26 12:03:55 +01001388
1389 if (size != sizeof(outarg))
Miklos Szeredif6d47a12009-01-26 15:00:59 +01001390 goto err;
Tejun Heo95668a62008-11-26 12:03:55 +01001391
1392 err = fuse_copy_one(cs, &outarg, sizeof(outarg));
1393 if (err)
Miklos Szeredif6d47a12009-01-26 15:00:59 +01001394 goto err;
Tejun Heo95668a62008-11-26 12:03:55 +01001395
Miklos Szeredif6d47a12009-01-26 15:00:59 +01001396 fuse_copy_finish(cs);
Tejun Heo95668a62008-11-26 12:03:55 +01001397 return fuse_notify_poll_wakeup(fc, &outarg);
Miklos Szeredif6d47a12009-01-26 15:00:59 +01001398
1399err:
1400 fuse_copy_finish(cs);
1401 return err;
Tejun Heo95668a62008-11-26 12:03:55 +01001402}
1403
John Muir3b463ae2009-05-31 11:13:57 -04001404static int fuse_notify_inval_inode(struct fuse_conn *fc, unsigned int size,
1405 struct fuse_copy_state *cs)
1406{
1407 struct fuse_notify_inval_inode_out outarg;
1408 int err = -EINVAL;
1409
1410 if (size != sizeof(outarg))
1411 goto err;
1412
1413 err = fuse_copy_one(cs, &outarg, sizeof(outarg));
1414 if (err)
1415 goto err;
1416 fuse_copy_finish(cs);
1417
1418 down_read(&fc->killsb);
1419 err = -ENOENT;
Miklos Szeredib21dda42010-02-05 12:08:31 +01001420 if (fc->sb) {
1421 err = fuse_reverse_inval_inode(fc->sb, outarg.ino,
1422 outarg.off, outarg.len);
1423 }
John Muir3b463ae2009-05-31 11:13:57 -04001424 up_read(&fc->killsb);
1425 return err;
1426
1427err:
1428 fuse_copy_finish(cs);
1429 return err;
1430}
1431
1432static int fuse_notify_inval_entry(struct fuse_conn *fc, unsigned int size,
1433 struct fuse_copy_state *cs)
1434{
1435 struct fuse_notify_inval_entry_out outarg;
Fang Wenqib2d82ee2009-12-30 18:37:13 +08001436 int err = -ENOMEM;
1437 char *buf;
John Muir3b463ae2009-05-31 11:13:57 -04001438 struct qstr name;
1439
Fang Wenqib2d82ee2009-12-30 18:37:13 +08001440 buf = kzalloc(FUSE_NAME_MAX + 1, GFP_KERNEL);
1441 if (!buf)
1442 goto err;
1443
1444 err = -EINVAL;
John Muir3b463ae2009-05-31 11:13:57 -04001445 if (size < sizeof(outarg))
1446 goto err;
1447
1448 err = fuse_copy_one(cs, &outarg, sizeof(outarg));
1449 if (err)
1450 goto err;
1451
1452 err = -ENAMETOOLONG;
1453 if (outarg.namelen > FUSE_NAME_MAX)
1454 goto err;
1455
Miklos Szeredic2183d12011-08-24 10:20:17 +02001456 err = -EINVAL;
1457 if (size != sizeof(outarg) + outarg.namelen + 1)
1458 goto err;
1459
John Muir3b463ae2009-05-31 11:13:57 -04001460 name.name = buf;
1461 name.len = outarg.namelen;
1462 err = fuse_copy_one(cs, buf, outarg.namelen + 1);
1463 if (err)
1464 goto err;
1465 fuse_copy_finish(cs);
1466 buf[outarg.namelen] = 0;
John Muir3b463ae2009-05-31 11:13:57 -04001467
1468 down_read(&fc->killsb);
1469 err = -ENOENT;
Miklos Szeredib21dda42010-02-05 12:08:31 +01001470 if (fc->sb)
John Muir451d0f52011-12-06 21:50:06 +01001471 err = fuse_reverse_inval_entry(fc->sb, outarg.parent, 0, &name);
1472 up_read(&fc->killsb);
1473 kfree(buf);
1474 return err;
1475
1476err:
1477 kfree(buf);
1478 fuse_copy_finish(cs);
1479 return err;
1480}
1481
1482static int fuse_notify_delete(struct fuse_conn *fc, unsigned int size,
1483 struct fuse_copy_state *cs)
1484{
1485 struct fuse_notify_delete_out outarg;
1486 int err = -ENOMEM;
1487 char *buf;
1488 struct qstr name;
1489
1490 buf = kzalloc(FUSE_NAME_MAX + 1, GFP_KERNEL);
1491 if (!buf)
1492 goto err;
1493
1494 err = -EINVAL;
1495 if (size < sizeof(outarg))
1496 goto err;
1497
1498 err = fuse_copy_one(cs, &outarg, sizeof(outarg));
1499 if (err)
1500 goto err;
1501
1502 err = -ENAMETOOLONG;
1503 if (outarg.namelen > FUSE_NAME_MAX)
1504 goto err;
1505
1506 err = -EINVAL;
1507 if (size != sizeof(outarg) + outarg.namelen + 1)
1508 goto err;
1509
1510 name.name = buf;
1511 name.len = outarg.namelen;
1512 err = fuse_copy_one(cs, buf, outarg.namelen + 1);
1513 if (err)
1514 goto err;
1515 fuse_copy_finish(cs);
1516 buf[outarg.namelen] = 0;
John Muir451d0f52011-12-06 21:50:06 +01001517
1518 down_read(&fc->killsb);
1519 err = -ENOENT;
1520 if (fc->sb)
1521 err = fuse_reverse_inval_entry(fc->sb, outarg.parent,
1522 outarg.child, &name);
John Muir3b463ae2009-05-31 11:13:57 -04001523 up_read(&fc->killsb);
Fang Wenqib2d82ee2009-12-30 18:37:13 +08001524 kfree(buf);
John Muir3b463ae2009-05-31 11:13:57 -04001525 return err;
1526
1527err:
Fang Wenqib2d82ee2009-12-30 18:37:13 +08001528 kfree(buf);
John Muir3b463ae2009-05-31 11:13:57 -04001529 fuse_copy_finish(cs);
1530 return err;
1531}
1532
Miklos Szeredia1d75f22010-07-12 14:41:40 +02001533static int fuse_notify_store(struct fuse_conn *fc, unsigned int size,
1534 struct fuse_copy_state *cs)
1535{
1536 struct fuse_notify_store_out outarg;
1537 struct inode *inode;
1538 struct address_space *mapping;
1539 u64 nodeid;
1540 int err;
1541 pgoff_t index;
1542 unsigned int offset;
1543 unsigned int num;
1544 loff_t file_size;
1545 loff_t end;
1546
1547 err = -EINVAL;
1548 if (size < sizeof(outarg))
1549 goto out_finish;
1550
1551 err = fuse_copy_one(cs, &outarg, sizeof(outarg));
1552 if (err)
1553 goto out_finish;
1554
1555 err = -EINVAL;
1556 if (size - sizeof(outarg) != outarg.size)
1557 goto out_finish;
1558
1559 nodeid = outarg.nodeid;
1560
1561 down_read(&fc->killsb);
1562
1563 err = -ENOENT;
1564 if (!fc->sb)
1565 goto out_up_killsb;
1566
1567 inode = ilookup5(fc->sb, nodeid, fuse_inode_eq, &nodeid);
1568 if (!inode)
1569 goto out_up_killsb;
1570
1571 mapping = inode->i_mapping;
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +03001572 index = outarg.offset >> PAGE_SHIFT;
1573 offset = outarg.offset & ~PAGE_MASK;
Miklos Szeredia1d75f22010-07-12 14:41:40 +02001574 file_size = i_size_read(inode);
1575 end = outarg.offset + outarg.size;
1576 if (end > file_size) {
1577 file_size = end;
1578 fuse_write_update_size(inode, file_size);
1579 }
1580
1581 num = outarg.size;
1582 while (num) {
1583 struct page *page;
1584 unsigned int this_num;
1585
1586 err = -ENOMEM;
1587 page = find_or_create_page(mapping, index,
1588 mapping_gfp_mask(mapping));
1589 if (!page)
1590 goto out_iput;
1591
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +03001592 this_num = min_t(unsigned, num, PAGE_SIZE - offset);
Miklos Szeredia1d75f22010-07-12 14:41:40 +02001593 err = fuse_copy_page(cs, &page, offset, this_num, 0);
Miklos Szeredi063ec1e2014-01-22 19:36:58 +01001594 if (!err && offset == 0 &&
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +03001595 (this_num == PAGE_SIZE || file_size == end))
Miklos Szeredia1d75f22010-07-12 14:41:40 +02001596 SetPageUptodate(page);
1597 unlock_page(page);
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +03001598 put_page(page);
Miklos Szeredia1d75f22010-07-12 14:41:40 +02001599
1600 if (err)
1601 goto out_iput;
1602
1603 num -= this_num;
1604 offset = 0;
1605 index++;
1606 }
1607
1608 err = 0;
1609
1610out_iput:
1611 iput(inode);
1612out_up_killsb:
1613 up_read(&fc->killsb);
1614out_finish:
1615 fuse_copy_finish(cs);
1616 return err;
1617}
1618
Miklos Szeredi75b399d2019-09-10 15:04:11 +02001619struct fuse_retrieve_args {
1620 struct fuse_args_pages ap;
1621 struct fuse_notify_retrieve_in inarg;
1622};
1623
1624static void fuse_retrieve_end(struct fuse_conn *fc, struct fuse_args *args,
1625 int error)
Miklos Szeredi2d45ba32010-07-12 14:41:40 +02001626{
Miklos Szeredi75b399d2019-09-10 15:04:11 +02001627 struct fuse_retrieve_args *ra =
1628 container_of(args, typeof(*ra), ap.args);
1629
1630 release_pages(ra->ap.pages, ra->ap.num_pages);
1631 kfree(ra);
Miklos Szeredi2d45ba32010-07-12 14:41:40 +02001632}
1633
1634static int fuse_retrieve(struct fuse_conn *fc, struct inode *inode,
1635 struct fuse_notify_retrieve_out *outarg)
1636{
1637 int err;
1638 struct address_space *mapping = inode->i_mapping;
Miklos Szeredi2d45ba32010-07-12 14:41:40 +02001639 pgoff_t index;
1640 loff_t file_size;
1641 unsigned int num;
1642 unsigned int offset;
Geert Uytterhoeven01574432010-09-30 22:06:21 +02001643 size_t total_len = 0;
Constantine Shulyupin5da784c2018-09-06 15:37:06 +03001644 unsigned int num_pages;
Miklos Szeredi75b399d2019-09-10 15:04:11 +02001645 struct fuse_retrieve_args *ra;
1646 size_t args_size = sizeof(*ra);
1647 struct fuse_args_pages *ap;
1648 struct fuse_args *args;
Miklos Szeredi2d45ba32010-07-12 14:41:40 +02001649
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +03001650 offset = outarg->offset & ~PAGE_MASK;
Maxim Patlasov4d53dc92012-10-26 19:48:42 +04001651 file_size = i_size_read(inode);
1652
Kirill Smelkov76406822019-03-27 10:15:19 +00001653 num = min(outarg->size, fc->max_write);
Maxim Patlasov4d53dc92012-10-26 19:48:42 +04001654 if (outarg->offset > file_size)
1655 num = 0;
1656 else if (outarg->offset + num > file_size)
1657 num = file_size - outarg->offset;
1658
1659 num_pages = (num + offset + PAGE_SIZE - 1) >> PAGE_SHIFT;
Constantine Shulyupin5da784c2018-09-06 15:37:06 +03001660 num_pages = min(num_pages, fc->max_pages);
Maxim Patlasov4d53dc92012-10-26 19:48:42 +04001661
Miklos Szeredi75b399d2019-09-10 15:04:11 +02001662 args_size += num_pages * (sizeof(ap->pages[0]) + sizeof(ap->descs[0]));
Miklos Szeredi2d45ba32010-07-12 14:41:40 +02001663
Miklos Szeredi75b399d2019-09-10 15:04:11 +02001664 ra = kzalloc(args_size, GFP_KERNEL);
1665 if (!ra)
1666 return -ENOMEM;
1667
1668 ap = &ra->ap;
1669 ap->pages = (void *) (ra + 1);
1670 ap->descs = (void *) (ap->pages + num_pages);
1671
1672 args = &ap->args;
1673 args->nodeid = outarg->nodeid;
1674 args->opcode = FUSE_NOTIFY_REPLY;
1675 args->in_numargs = 2;
1676 args->in_pages = true;
1677 args->end = fuse_retrieve_end;
Miklos Szeredi2d45ba32010-07-12 14:41:40 +02001678
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +03001679 index = outarg->offset >> PAGE_SHIFT;
Miklos Szeredi2d45ba32010-07-12 14:41:40 +02001680
Miklos Szeredi75b399d2019-09-10 15:04:11 +02001681 while (num && ap->num_pages < num_pages) {
Miklos Szeredi2d45ba32010-07-12 14:41:40 +02001682 struct page *page;
1683 unsigned int this_num;
1684
1685 page = find_get_page(mapping, index);
1686 if (!page)
1687 break;
1688
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +03001689 this_num = min_t(unsigned, num, PAGE_SIZE - offset);
Miklos Szeredi75b399d2019-09-10 15:04:11 +02001690 ap->pages[ap->num_pages] = page;
1691 ap->descs[ap->num_pages].offset = offset;
1692 ap->descs[ap->num_pages].length = this_num;
1693 ap->num_pages++;
Miklos Szeredi2d45ba32010-07-12 14:41:40 +02001694
Miklos Szeredic9e67d42012-09-04 18:45:54 +02001695 offset = 0;
Miklos Szeredi2d45ba32010-07-12 14:41:40 +02001696 num -= this_num;
1697 total_len += this_num;
Miklos Szeredi48706d02011-12-13 10:36:59 +01001698 index++;
Miklos Szeredi2d45ba32010-07-12 14:41:40 +02001699 }
Miklos Szeredi75b399d2019-09-10 15:04:11 +02001700 ra->inarg.offset = outarg->offset;
1701 ra->inarg.size = total_len;
1702 args->in_args[0].size = sizeof(ra->inarg);
1703 args->in_args[0].value = &ra->inarg;
1704 args->in_args[1].size = total_len;
Miklos Szeredi2d45ba32010-07-12 14:41:40 +02001705
Miklos Szeredi75b399d2019-09-10 15:04:11 +02001706 err = fuse_simple_notify_reply(fc, args, outarg->notify_unique);
1707 if (err)
1708 fuse_retrieve_end(fc, args, err);
Miklos Szeredi2d45ba32010-07-12 14:41:40 +02001709
1710 return err;
1711}
1712
1713static int fuse_notify_retrieve(struct fuse_conn *fc, unsigned int size,
1714 struct fuse_copy_state *cs)
1715{
1716 struct fuse_notify_retrieve_out outarg;
1717 struct inode *inode;
1718 int err;
1719
1720 err = -EINVAL;
1721 if (size != sizeof(outarg))
1722 goto copy_finish;
1723
1724 err = fuse_copy_one(cs, &outarg, sizeof(outarg));
1725 if (err)
1726 goto copy_finish;
1727
1728 fuse_copy_finish(cs);
1729
1730 down_read(&fc->killsb);
1731 err = -ENOENT;
1732 if (fc->sb) {
1733 u64 nodeid = outarg.nodeid;
1734
1735 inode = ilookup5(fc->sb, nodeid, fuse_inode_eq, &nodeid);
1736 if (inode) {
1737 err = fuse_retrieve(fc, inode, &outarg);
1738 iput(inode);
1739 }
1740 }
1741 up_read(&fc->killsb);
1742
1743 return err;
1744
1745copy_finish:
1746 fuse_copy_finish(cs);
1747 return err;
1748}
1749
Tejun Heo85993962008-11-26 12:03:55 +01001750static int fuse_notify(struct fuse_conn *fc, enum fuse_notify_code code,
1751 unsigned int size, struct fuse_copy_state *cs)
1752{
Miklos Szeredi0d278362015-02-26 11:45:47 +01001753 /* Don't try to move pages (yet) */
1754 cs->move_pages = 0;
1755
Tejun Heo85993962008-11-26 12:03:55 +01001756 switch (code) {
Tejun Heo95668a62008-11-26 12:03:55 +01001757 case FUSE_NOTIFY_POLL:
1758 return fuse_notify_poll(fc, size, cs);
1759
John Muir3b463ae2009-05-31 11:13:57 -04001760 case FUSE_NOTIFY_INVAL_INODE:
1761 return fuse_notify_inval_inode(fc, size, cs);
1762
1763 case FUSE_NOTIFY_INVAL_ENTRY:
1764 return fuse_notify_inval_entry(fc, size, cs);
1765
Miklos Szeredia1d75f22010-07-12 14:41:40 +02001766 case FUSE_NOTIFY_STORE:
1767 return fuse_notify_store(fc, size, cs);
1768
Miklos Szeredi2d45ba32010-07-12 14:41:40 +02001769 case FUSE_NOTIFY_RETRIEVE:
1770 return fuse_notify_retrieve(fc, size, cs);
1771
John Muir451d0f52011-12-06 21:50:06 +01001772 case FUSE_NOTIFY_DELETE:
1773 return fuse_notify_delete(fc, size, cs);
1774
Tejun Heo85993962008-11-26 12:03:55 +01001775 default:
Miklos Szeredif6d47a12009-01-26 15:00:59 +01001776 fuse_copy_finish(cs);
Tejun Heo85993962008-11-26 12:03:55 +01001777 return -EINVAL;
1778 }
1779}
1780
Miklos Szeredi334f4852005-09-09 13:10:27 -07001781/* Look up request on processing list by unique ID */
Miklos Szeredi3a2b5b92015-07-01 16:26:04 +02001782static struct fuse_req *request_find(struct fuse_pqueue *fpq, u64 unique)
Miklos Szeredi334f4852005-09-09 13:10:27 -07001783{
Kirill Tkhaibe2ff422018-09-11 13:12:14 +03001784 unsigned int hash = fuse_req_hash(unique);
Dong Fang05726ac2013-07-30 22:50:01 -04001785 struct fuse_req *req;
Miklos Szeredi334f4852005-09-09 13:10:27 -07001786
Kirill Tkhaibe2ff422018-09-11 13:12:14 +03001787 list_for_each_entry(req, &fpq->processing[hash], list) {
Kirill Tkhai3a5358d2018-09-11 13:12:05 +03001788 if (req->in.h.unique == unique)
Miklos Szeredi334f4852005-09-09 13:10:27 -07001789 return req;
1790 }
1791 return NULL;
1792}
1793
Miklos Szeredid4993772019-09-10 15:04:11 +02001794static int copy_out_args(struct fuse_copy_state *cs, struct fuse_args *args,
Miklos Szeredi334f4852005-09-09 13:10:27 -07001795 unsigned nbytes)
1796{
1797 unsigned reqsize = sizeof(struct fuse_out_header);
1798
Stefan Hajnoczi14d46d72018-06-21 09:34:25 +01001799 reqsize += fuse_len_args(args->out_numargs, args->out_args);
Miklos Szeredi334f4852005-09-09 13:10:27 -07001800
Miklos Szeredid4993772019-09-10 15:04:11 +02001801 if (reqsize < nbytes || (reqsize > nbytes && !args->out_argvar))
Miklos Szeredi334f4852005-09-09 13:10:27 -07001802 return -EINVAL;
1803 else if (reqsize > nbytes) {
Miklos Szeredid4993772019-09-10 15:04:11 +02001804 struct fuse_arg *lastarg = &args->out_args[args->out_numargs-1];
Miklos Szeredi334f4852005-09-09 13:10:27 -07001805 unsigned diffsize = reqsize - nbytes;
Miklos Szeredid4993772019-09-10 15:04:11 +02001806
Miklos Szeredi334f4852005-09-09 13:10:27 -07001807 if (diffsize > lastarg->size)
1808 return -EINVAL;
1809 lastarg->size -= diffsize;
1810 }
Miklos Szeredid4993772019-09-10 15:04:11 +02001811 return fuse_copy_args(cs, args->out_numargs, args->out_pages,
1812 args->out_args, args->page_zeroing);
Miklos Szeredi334f4852005-09-09 13:10:27 -07001813}
1814
1815/*
1816 * Write a single reply to a request. First the header is copied from
1817 * the write buffer. The request is then searched on the processing
1818 * list by the unique ID found in the header. If found, then remove
1819 * it from the list and copy the rest of the buffer to the request.
Stefan Hajnoczi04ec5af2018-06-21 09:33:40 +01001820 * The request is finished by calling fuse_request_end().
Miklos Szeredi334f4852005-09-09 13:10:27 -07001821 */
Miklos Szeredic36960462015-07-01 16:26:09 +02001822static ssize_t fuse_dev_do_write(struct fuse_dev *fud,
Miklos Szeredidd3bb142010-05-25 15:06:06 +02001823 struct fuse_copy_state *cs, size_t nbytes)
Miklos Szeredi334f4852005-09-09 13:10:27 -07001824{
1825 int err;
Miklos Szeredic36960462015-07-01 16:26:09 +02001826 struct fuse_conn *fc = fud->fc;
1827 struct fuse_pqueue *fpq = &fud->pq;
Miklos Szeredi334f4852005-09-09 13:10:27 -07001828 struct fuse_req *req;
1829 struct fuse_out_header oh;
Miklos Szeredi334f4852005-09-09 13:10:27 -07001830
Kirill Tkhai7407a102018-11-08 12:05:36 +03001831 err = -EINVAL;
Miklos Szeredi334f4852005-09-09 13:10:27 -07001832 if (nbytes < sizeof(struct fuse_out_header))
Kirill Tkhai7407a102018-11-08 12:05:36 +03001833 goto out;
Miklos Szeredi334f4852005-09-09 13:10:27 -07001834
Miklos Szeredidd3bb142010-05-25 15:06:06 +02001835 err = fuse_copy_one(cs, &oh, sizeof(oh));
Miklos Szeredi334f4852005-09-09 13:10:27 -07001836 if (err)
Kirill Tkhai7407a102018-11-08 12:05:36 +03001837 goto copy_finish;
Tejun Heo85993962008-11-26 12:03:55 +01001838
Miklos Szeredi334f4852005-09-09 13:10:27 -07001839 err = -EINVAL;
Tejun Heo85993962008-11-26 12:03:55 +01001840 if (oh.len != nbytes)
Kirill Tkhai7407a102018-11-08 12:05:36 +03001841 goto copy_finish;
Tejun Heo85993962008-11-26 12:03:55 +01001842
1843 /*
1844 * Zero oh.unique indicates unsolicited notification message
1845 * and error contains notification code.
1846 */
1847 if (!oh.unique) {
Miklos Szeredidd3bb142010-05-25 15:06:06 +02001848 err = fuse_notify(fc, oh.error, nbytes - sizeof(oh), cs);
Kirill Tkhai7407a102018-11-08 12:05:36 +03001849 goto out;
Tejun Heo85993962008-11-26 12:03:55 +01001850 }
1851
1852 err = -EINVAL;
1853 if (oh.error <= -1000 || oh.error > 0)
Kirill Tkhai7407a102018-11-08 12:05:36 +03001854 goto copy_finish;
Miklos Szeredi334f4852005-09-09 13:10:27 -07001855
Miklos Szeredi45a91cb2015-07-01 16:26:06 +02001856 spin_lock(&fpq->lock);
Kirill Tkhai7407a102018-11-08 12:05:36 +03001857 req = NULL;
1858 if (fpq->connected)
1859 req = request_find(fpq, oh.unique & ~FUSE_INT_REQ_BIT);
Miklos Szeredi69a53bf2006-01-16 22:14:41 -08001860
Kirill Tkhai7407a102018-11-08 12:05:36 +03001861 err = -ENOENT;
1862 if (!req) {
1863 spin_unlock(&fpq->lock);
1864 goto copy_finish;
1865 }
Miklos Szeredi334f4852005-09-09 13:10:27 -07001866
Kirill Tkhai3a5358d2018-09-11 13:12:05 +03001867 /* Is it an interrupt reply ID? */
1868 if (oh.unique & FUSE_INT_REQ_BIT) {
Kirill Tkhaid2d2d4f2018-09-25 12:52:42 +03001869 __fuse_get_request(req);
Miklos Szeredi45a91cb2015-07-01 16:26:06 +02001870 spin_unlock(&fpq->lock);
1871
Kirill Tkhai7407a102018-11-08 12:05:36 +03001872 err = 0;
1873 if (nbytes != sizeof(struct fuse_out_header))
1874 err = -EINVAL;
1875 else if (oh.error == -ENOSYS)
Miklos Szeredia4d27e72006-06-25 05:48:54 -07001876 fc->no_interrupt = 1;
1877 else if (oh.error == -EAGAIN)
Kirill Tkhaib7829112018-11-08 12:05:42 +03001878 err = queue_interrupt(&fc->iq, req);
Kirill Tkhai7407a102018-11-08 12:05:36 +03001879
Kirill Tkhaid2d2d4f2018-09-25 12:52:42 +03001880 fuse_put_request(fc, req);
Miklos Szeredia4d27e72006-06-25 05:48:54 -07001881
Kirill Tkhai7407a102018-11-08 12:05:36 +03001882 goto copy_finish;
Miklos Szeredia4d27e72006-06-25 05:48:54 -07001883 }
1884
Miklos Szeredi33e14b42015-07-01 16:26:01 +02001885 clear_bit(FR_SENT, &req->flags);
Miklos Szeredi3a2b5b92015-07-01 16:26:04 +02001886 list_move(&req->list, &fpq->io);
Miklos Szeredi334f4852005-09-09 13:10:27 -07001887 req->out.h = oh;
Miklos Szeredi825d6d32015-07-01 16:25:58 +02001888 set_bit(FR_LOCKED, &req->flags);
Miklos Szeredi45a91cb2015-07-01 16:26:06 +02001889 spin_unlock(&fpq->lock);
Miklos Szeredidd3bb142010-05-25 15:06:06 +02001890 cs->req = req;
Miklos Szeredid4993772019-09-10 15:04:11 +02001891 if (!req->args->page_replace)
Miklos Szeredice534fb2010-05-25 15:06:07 +02001892 cs->move_pages = 0;
Miklos Szeredi334f4852005-09-09 13:10:27 -07001893
Miklos Szeredid4993772019-09-10 15:04:11 +02001894 if (oh.error)
1895 err = nbytes != sizeof(oh) ? -EINVAL : 0;
1896 else
1897 err = copy_out_args(cs, req->args, nbytes);
Miklos Szeredidd3bb142010-05-25 15:06:06 +02001898 fuse_copy_finish(cs);
Miklos Szeredi334f4852005-09-09 13:10:27 -07001899
Miklos Szeredi45a91cb2015-07-01 16:26:06 +02001900 spin_lock(&fpq->lock);
Miklos Szeredi825d6d32015-07-01 16:25:58 +02001901 clear_bit(FR_LOCKED, &req->flags);
Miklos Szeredie96edd92015-07-01 16:26:04 +02001902 if (!fpq->connected)
Miklos Szeredi0d8e84b2015-07-01 16:25:58 +02001903 err = -ENOENT;
1904 else if (err)
Miklos Szeredi334f4852005-09-09 13:10:27 -07001905 req->out.h.error = -EIO;
Miklos Szeredi77cd9d42015-07-01 16:26:06 +02001906 if (!test_bit(FR_PRIVATE, &req->flags))
1907 list_del_init(&req->list);
Miklos Szeredi45a91cb2015-07-01 16:26:06 +02001908 spin_unlock(&fpq->lock);
Miklos Szeredi46c34a32015-07-01 16:26:07 +02001909
Stefan Hajnoczi04ec5af2018-06-21 09:33:40 +01001910 fuse_request_end(fc, req);
Kirill Tkhai7407a102018-11-08 12:05:36 +03001911out:
Miklos Szeredi334f4852005-09-09 13:10:27 -07001912 return err ? err : nbytes;
1913
Kirill Tkhai7407a102018-11-08 12:05:36 +03001914copy_finish:
Miklos Szeredidd3bb142010-05-25 15:06:06 +02001915 fuse_copy_finish(cs);
Kirill Tkhai7407a102018-11-08 12:05:36 +03001916 goto out;
Miklos Szeredi334f4852005-09-09 13:10:27 -07001917}
1918
Al Virofbdbacc2015-04-03 21:53:39 -04001919static ssize_t fuse_dev_write(struct kiocb *iocb, struct iov_iter *from)
Miklos Szeredidd3bb142010-05-25 15:06:06 +02001920{
1921 struct fuse_copy_state cs;
Miklos Szeredicc080e92015-07-01 16:26:08 +02001922 struct fuse_dev *fud = fuse_get_dev(iocb->ki_filp);
1923
1924 if (!fud)
Miklos Szeredidd3bb142010-05-25 15:06:06 +02001925 return -EPERM;
1926
Al Virofbdbacc2015-04-03 21:53:39 -04001927 if (!iter_is_iovec(from))
1928 return -EINVAL;
Miklos Szeredidd3bb142010-05-25 15:06:06 +02001929
Miklos Szeredidc008092015-07-01 16:25:58 +02001930 fuse_copy_init(&cs, 0, from);
Al Virofbdbacc2015-04-03 21:53:39 -04001931
Miklos Szeredic36960462015-07-01 16:26:09 +02001932 return fuse_dev_do_write(fud, &cs, iov_iter_count(from));
Miklos Szeredidd3bb142010-05-25 15:06:06 +02001933}
1934
1935static ssize_t fuse_dev_splice_write(struct pipe_inode_info *pipe,
1936 struct file *out, loff_t *ppos,
1937 size_t len, unsigned int flags)
1938{
1939 unsigned nbuf;
1940 unsigned idx;
1941 struct pipe_buffer *bufs;
1942 struct fuse_copy_state cs;
Miklos Szeredicc080e92015-07-01 16:26:08 +02001943 struct fuse_dev *fud;
Miklos Szeredidd3bb142010-05-25 15:06:06 +02001944 size_t rem;
1945 ssize_t ret;
1946
Miklos Szeredicc080e92015-07-01 16:26:08 +02001947 fud = fuse_get_dev(out);
1948 if (!fud)
Miklos Szeredidd3bb142010-05-25 15:06:06 +02001949 return -EPERM;
1950
Andrey Ryabinina2477b02018-07-17 19:00:33 +03001951 pipe_lock(pipe);
1952
Andrey Ryabinin96354532018-07-17 19:00:35 +03001953 bufs = kvmalloc_array(pipe->nrbufs, sizeof(struct pipe_buffer),
Andrey Ryabinind6d931a2018-07-17 19:00:34 +03001954 GFP_KERNEL);
Andrey Ryabinina2477b02018-07-17 19:00:33 +03001955 if (!bufs) {
1956 pipe_unlock(pipe);
Miklos Szeredidd3bb142010-05-25 15:06:06 +02001957 return -ENOMEM;
Andrey Ryabinina2477b02018-07-17 19:00:33 +03001958 }
Miklos Szeredidd3bb142010-05-25 15:06:06 +02001959
Miklos Szeredidd3bb142010-05-25 15:06:06 +02001960 nbuf = 0;
1961 rem = 0;
1962 for (idx = 0; idx < pipe->nrbufs && rem < len; idx++)
1963 rem += pipe->bufs[(pipe->curbuf + idx) & (pipe->buffers - 1)].len;
1964
1965 ret = -EINVAL;
Matthew Wilcox15fab632019-04-05 14:02:10 -07001966 if (rem < len)
1967 goto out_free;
Miklos Szeredidd3bb142010-05-25 15:06:06 +02001968
1969 rem = len;
1970 while (rem) {
1971 struct pipe_buffer *ibuf;
1972 struct pipe_buffer *obuf;
1973
1974 BUG_ON(nbuf >= pipe->buffers);
1975 BUG_ON(!pipe->nrbufs);
1976 ibuf = &pipe->bufs[pipe->curbuf];
1977 obuf = &bufs[nbuf];
1978
1979 if (rem >= ibuf->len) {
1980 *obuf = *ibuf;
1981 ibuf->ops = NULL;
1982 pipe->curbuf = (pipe->curbuf + 1) & (pipe->buffers - 1);
1983 pipe->nrbufs--;
1984 } else {
Matthew Wilcox15fab632019-04-05 14:02:10 -07001985 if (!pipe_buf_get(pipe, ibuf))
1986 goto out_free;
1987
Miklos Szeredidd3bb142010-05-25 15:06:06 +02001988 *obuf = *ibuf;
1989 obuf->flags &= ~PIPE_BUF_FLAG_GIFT;
1990 obuf->len = rem;
1991 ibuf->offset += obuf->len;
1992 ibuf->len -= obuf->len;
1993 }
1994 nbuf++;
1995 rem -= obuf->len;
1996 }
1997 pipe_unlock(pipe);
1998
Miklos Szeredidc008092015-07-01 16:25:58 +02001999 fuse_copy_init(&cs, 0, NULL);
Miklos Szeredidd3bb142010-05-25 15:06:06 +02002000 cs.pipebufs = bufs;
Al Viro6c09e942015-04-03 22:06:08 -04002001 cs.nr_segs = nbuf;
Miklos Szeredidd3bb142010-05-25 15:06:06 +02002002 cs.pipe = pipe;
2003
Miklos Szeredice534fb2010-05-25 15:06:07 +02002004 if (flags & SPLICE_F_MOVE)
2005 cs.move_pages = 1;
2006
Miklos Szeredic36960462015-07-01 16:26:09 +02002007 ret = fuse_dev_do_write(fud, &cs, len);
Miklos Szeredidd3bb142010-05-25 15:06:06 +02002008
Jann Horn95099412019-01-12 02:39:05 +01002009 pipe_lock(pipe);
Matthew Wilcox15fab632019-04-05 14:02:10 -07002010out_free:
Miklos Szeredia7796382016-09-27 10:45:12 +02002011 for (idx = 0; idx < nbuf; idx++)
2012 pipe_buf_release(pipe, &bufs[idx]);
Jann Horn95099412019-01-12 02:39:05 +01002013 pipe_unlock(pipe);
Miklos Szeredia7796382016-09-27 10:45:12 +02002014
Andrey Ryabinind6d931a2018-07-17 19:00:34 +03002015 kvfree(bufs);
Miklos Szeredidd3bb142010-05-25 15:06:06 +02002016 return ret;
2017}
2018
Al Viro076ccb72017-07-03 01:02:18 -04002019static __poll_t fuse_dev_poll(struct file *file, poll_table *wait)
Miklos Szeredi334f4852005-09-09 13:10:27 -07002020{
Linus Torvaldsa9a08842018-02-11 14:34:03 -08002021 __poll_t mask = EPOLLOUT | EPOLLWRNORM;
Miklos Szeredif88996a2015-07-01 16:26:01 +02002022 struct fuse_iqueue *fiq;
Miklos Szeredicc080e92015-07-01 16:26:08 +02002023 struct fuse_dev *fud = fuse_get_dev(file);
2024
2025 if (!fud)
Linus Torvaldsa9a08842018-02-11 14:34:03 -08002026 return EPOLLERR;
Miklos Szeredi334f4852005-09-09 13:10:27 -07002027
Miklos Szeredicc080e92015-07-01 16:26:08 +02002028 fiq = &fud->fc->iq;
Miklos Szeredif88996a2015-07-01 16:26:01 +02002029 poll_wait(file, &fiq->waitq, wait);
Miklos Szeredi334f4852005-09-09 13:10:27 -07002030
Eric Biggers76e43c82019-09-08 20:15:18 -07002031 spin_lock(&fiq->lock);
Miklos Szeredie16714d2015-07-01 16:26:01 +02002032 if (!fiq->connected)
Linus Torvaldsa9a08842018-02-11 14:34:03 -08002033 mask = EPOLLERR;
Miklos Szeredif88996a2015-07-01 16:26:01 +02002034 else if (request_pending(fiq))
Linus Torvaldsa9a08842018-02-11 14:34:03 -08002035 mask |= EPOLLIN | EPOLLRDNORM;
Eric Biggers76e43c82019-09-08 20:15:18 -07002036 spin_unlock(&fiq->lock);
Miklos Szeredi334f4852005-09-09 13:10:27 -07002037
2038 return mask;
2039}
2040
Kirill Tkhai34061752018-11-06 12:15:20 +03002041/* Abort all requests on the given list (pending or processing) */
Miklos Szeredi334f4852005-09-09 13:10:27 -07002042static void end_requests(struct fuse_conn *fc, struct list_head *head)
2043{
2044 while (!list_empty(head)) {
2045 struct fuse_req *req;
2046 req = list_entry(head->next, struct fuse_req, list);
Miklos Szeredi334f4852005-09-09 13:10:27 -07002047 req->out.h.error = -ECONNABORTED;
Miklos Szeredi33e14b42015-07-01 16:26:01 +02002048 clear_bit(FR_SENT, &req->flags);
Miklos Szeredif377cb72015-07-01 16:26:04 +02002049 list_del_init(&req->list);
Stefan Hajnoczi04ec5af2018-06-21 09:33:40 +01002050 fuse_request_end(fc, req);
Miklos Szeredi334f4852005-09-09 13:10:27 -07002051 }
2052}
2053
Bryan Green357ccf22011-03-01 16:43:52 -08002054static void end_polls(struct fuse_conn *fc)
2055{
2056 struct rb_node *p;
2057
2058 p = rb_first(&fc->polled_files);
2059
2060 while (p) {
2061 struct fuse_file *ff;
2062 ff = rb_entry(p, struct fuse_file, polled_node);
2063 wake_up_interruptible_all(&ff->poll_wait);
2064
2065 p = rb_next(p);
2066 }
2067}
2068
Miklos Szeredi69a53bf2006-01-16 22:14:41 -08002069/*
2070 * Abort all requests.
2071 *
Miklos Szeredib716d422015-07-01 16:25:59 +02002072 * Emergency exit in case of a malicious or accidental deadlock, or just a hung
2073 * filesystem.
Miklos Szeredi69a53bf2006-01-16 22:14:41 -08002074 *
Miklos Szeredib716d422015-07-01 16:25:59 +02002075 * The same effect is usually achievable through killing the filesystem daemon
2076 * and all users of the filesystem. The exception is the combination of an
2077 * asynchronous request and the tricky deadlock (see
2078 * Documentation/filesystems/fuse.txt).
Miklos Szeredi69a53bf2006-01-16 22:14:41 -08002079 *
Miklos Szeredib716d422015-07-01 16:25:59 +02002080 * Aborting requests under I/O goes as follows: 1: Separate out unlocked
2081 * requests, they should be finished off immediately. Locked requests will be
2082 * finished after unlock; see unlock_request(). 2: Finish off the unlocked
2083 * requests. It is possible that some request will finish before we can. This
2084 * is OK, the request will in that case be removed from the list before we touch
2085 * it.
Miklos Szeredi69a53bf2006-01-16 22:14:41 -08002086 */
Miklos Szeredieb98e3bd2019-01-24 10:40:16 +01002087void fuse_abort_conn(struct fuse_conn *fc)
Miklos Szeredi69a53bf2006-01-16 22:14:41 -08002088{
Miklos Szeredif88996a2015-07-01 16:26:01 +02002089 struct fuse_iqueue *fiq = &fc->iq;
2090
Miklos Szeredid7133112006-04-10 22:54:55 -07002091 spin_lock(&fc->lock);
Miklos Szeredi69a53bf2006-01-16 22:14:41 -08002092 if (fc->connected) {
Miklos Szeredic36960462015-07-01 16:26:09 +02002093 struct fuse_dev *fud;
Miklos Szeredib716d422015-07-01 16:25:59 +02002094 struct fuse_req *req, *next;
Miklos Szeredi75f3ee42018-07-26 16:13:12 +02002095 LIST_HEAD(to_end);
Kirill Tkhaibe2ff422018-09-11 13:12:14 +03002096 unsigned int i;
Miklos Szeredib716d422015-07-01 16:25:59 +02002097
Kirill Tkhai63825b42018-08-27 18:29:56 +03002098 /* Background queuing checks fc->connected under bg_lock */
2099 spin_lock(&fc->bg_lock);
Miklos Szeredi69a53bf2006-01-16 22:14:41 -08002100 fc->connected = 0;
Kirill Tkhai63825b42018-08-27 18:29:56 +03002101 spin_unlock(&fc->bg_lock);
2102
Miklos Szeredi9759bd512015-01-06 10:45:35 +01002103 fuse_set_initialized(fc);
Miklos Szeredic36960462015-07-01 16:26:09 +02002104 list_for_each_entry(fud, &fc->devices, entry) {
2105 struct fuse_pqueue *fpq = &fud->pq;
2106
2107 spin_lock(&fpq->lock);
2108 fpq->connected = 0;
2109 list_for_each_entry_safe(req, next, &fpq->io, list) {
2110 req->out.h.error = -ECONNABORTED;
2111 spin_lock(&req->waitq.lock);
2112 set_bit(FR_ABORTED, &req->flags);
2113 if (!test_bit(FR_LOCKED, &req->flags)) {
2114 set_bit(FR_PRIVATE, &req->flags);
Miklos Szeredi87114372018-07-26 16:13:11 +02002115 __fuse_get_request(req);
Miklos Szeredi75f3ee42018-07-26 16:13:12 +02002116 list_move(&req->list, &to_end);
Miklos Szeredic36960462015-07-01 16:26:09 +02002117 }
2118 spin_unlock(&req->waitq.lock);
Miklos Szeredi77cd9d42015-07-01 16:26:06 +02002119 }
Kirill Tkhaibe2ff422018-09-11 13:12:14 +03002120 for (i = 0; i < FUSE_PQ_HASH_SIZE; i++)
2121 list_splice_tail_init(&fpq->processing[i],
2122 &to_end);
Miklos Szeredic36960462015-07-01 16:26:09 +02002123 spin_unlock(&fpq->lock);
Miklos Szeredib716d422015-07-01 16:25:59 +02002124 }
Kirill Tkhaiae2dffa2018-08-27 18:29:46 +03002125 spin_lock(&fc->bg_lock);
2126 fc->blocked = 0;
Miklos Szeredi41f98272015-07-01 16:25:59 +02002127 fc->max_background = UINT_MAX;
2128 flush_bg_queue(fc);
Kirill Tkhaiae2dffa2018-08-27 18:29:46 +03002129 spin_unlock(&fc->bg_lock);
Miklos Szeredi8c911892015-07-01 16:26:02 +02002130
Eric Biggers76e43c82019-09-08 20:15:18 -07002131 spin_lock(&fiq->lock);
Miklos Szeredi8c911892015-07-01 16:26:02 +02002132 fiq->connected = 0;
Miklos Szeredi75f3ee42018-07-26 16:13:12 +02002133 list_for_each_entry(req, &fiq->pending, list)
Tahsin Erdogana8a86d72017-01-12 12:04:04 -08002134 clear_bit(FR_PENDING, &req->flags);
Miklos Szeredi75f3ee42018-07-26 16:13:12 +02002135 list_splice_tail_init(&fiq->pending, &to_end);
Miklos Szeredi8c911892015-07-01 16:26:02 +02002136 while (forget_pending(fiq))
Vivek Goyal4388c5a2019-06-05 15:50:43 -04002137 kfree(fuse_dequeue_forget(fiq, 1, NULL));
Eric Biggers76e43c82019-09-08 20:15:18 -07002138 wake_up_all(&fiq->waitq);
2139 spin_unlock(&fiq->lock);
Miklos Szeredi8c911892015-07-01 16:26:02 +02002140 kill_fasync(&fiq->fasync, SIGIO, POLL_IN);
Miklos Szerediee314a82015-07-01 16:26:08 +02002141 end_polls(fc);
2142 wake_up_all(&fc->blocked_waitq);
2143 spin_unlock(&fc->lock);
Miklos Szeredi8c911892015-07-01 16:26:02 +02002144
Miklos Szeredi75f3ee42018-07-26 16:13:12 +02002145 end_requests(fc, &to_end);
Miklos Szerediee314a82015-07-01 16:26:08 +02002146 } else {
2147 spin_unlock(&fc->lock);
Miklos Szeredi69a53bf2006-01-16 22:14:41 -08002148 }
Miklos Szeredi69a53bf2006-01-16 22:14:41 -08002149}
Tejun Heo08cbf542009-04-14 10:54:53 +09002150EXPORT_SYMBOL_GPL(fuse_abort_conn);
Miklos Szeredi69a53bf2006-01-16 22:14:41 -08002151
Miklos Szeredib8f95e52018-07-26 16:13:11 +02002152void fuse_wait_aborted(struct fuse_conn *fc)
2153{
Miklos Szeredi2d84a2d2018-11-09 15:52:16 +01002154 /* matches implicit memory barrier in fuse_drop_waiting() */
2155 smp_mb();
Miklos Szeredib8f95e52018-07-26 16:13:11 +02002156 wait_event(fc->blocked_waitq, atomic_read(&fc->num_waiting) == 0);
2157}
2158
Tejun Heo08cbf542009-04-14 10:54:53 +09002159int fuse_dev_release(struct inode *inode, struct file *file)
Miklos Szeredi334f4852005-09-09 13:10:27 -07002160{
Miklos Szeredicc080e92015-07-01 16:26:08 +02002161 struct fuse_dev *fud = fuse_get_dev(file);
2162
2163 if (fud) {
2164 struct fuse_conn *fc = fud->fc;
Miklos Szeredic36960462015-07-01 16:26:09 +02002165 struct fuse_pqueue *fpq = &fud->pq;
Miklos Szeredi45ff3502018-07-26 16:13:11 +02002166 LIST_HEAD(to_end);
Kirill Tkhaibe2ff422018-09-11 13:12:14 +03002167 unsigned int i;
Miklos Szeredicc080e92015-07-01 16:26:08 +02002168
Miklos Szeredi45ff3502018-07-26 16:13:11 +02002169 spin_lock(&fpq->lock);
Miklos Szeredic36960462015-07-01 16:26:09 +02002170 WARN_ON(!list_empty(&fpq->io));
Kirill Tkhaibe2ff422018-09-11 13:12:14 +03002171 for (i = 0; i < FUSE_PQ_HASH_SIZE; i++)
2172 list_splice_init(&fpq->processing[i], &to_end);
Miklos Szeredi45ff3502018-07-26 16:13:11 +02002173 spin_unlock(&fpq->lock);
2174
2175 end_requests(fc, &to_end);
2176
Miklos Szeredic36960462015-07-01 16:26:09 +02002177 /* Are we the last open device? */
2178 if (atomic_dec_and_test(&fc->dev_count)) {
2179 WARN_ON(fc->iq.fasync != NULL);
Miklos Szeredieb98e3bd2019-01-24 10:40:16 +01002180 fuse_abort_conn(fc);
Miklos Szeredic36960462015-07-01 16:26:09 +02002181 }
Miklos Szeredicc080e92015-07-01 16:26:08 +02002182 fuse_dev_free(fud);
Jeff Dike385a17b2006-04-10 22:54:52 -07002183 }
Miklos Szeredi334f4852005-09-09 13:10:27 -07002184 return 0;
2185}
Tejun Heo08cbf542009-04-14 10:54:53 +09002186EXPORT_SYMBOL_GPL(fuse_dev_release);
Miklos Szeredi334f4852005-09-09 13:10:27 -07002187
Jeff Dike385a17b2006-04-10 22:54:52 -07002188static int fuse_dev_fasync(int fd, struct file *file, int on)
2189{
Miklos Szeredicc080e92015-07-01 16:26:08 +02002190 struct fuse_dev *fud = fuse_get_dev(file);
2191
2192 if (!fud)
Miklos Szeredia87046d2006-04-10 22:54:56 -07002193 return -EPERM;
Jeff Dike385a17b2006-04-10 22:54:52 -07002194
2195 /* No locking - fasync_helper does its own locking */
Miklos Szeredicc080e92015-07-01 16:26:08 +02002196 return fasync_helper(fd, file, on, &fud->fc->iq.fasync);
Jeff Dike385a17b2006-04-10 22:54:52 -07002197}
2198
Miklos Szeredi00c570f2015-07-01 16:26:08 +02002199static int fuse_device_clone(struct fuse_conn *fc, struct file *new)
2200{
Miklos Szeredicc080e92015-07-01 16:26:08 +02002201 struct fuse_dev *fud;
2202
Miklos Szeredi00c570f2015-07-01 16:26:08 +02002203 if (new->private_data)
2204 return -EINVAL;
2205
Miklos Szeredicc080e92015-07-01 16:26:08 +02002206 fud = fuse_dev_alloc(fc);
2207 if (!fud)
2208 return -ENOMEM;
2209
2210 new->private_data = fud;
Miklos Szeredic36960462015-07-01 16:26:09 +02002211 atomic_inc(&fc->dev_count);
Miklos Szeredi00c570f2015-07-01 16:26:08 +02002212
2213 return 0;
2214}
2215
2216static long fuse_dev_ioctl(struct file *file, unsigned int cmd,
2217 unsigned long arg)
2218{
2219 int err = -ENOTTY;
2220
2221 if (cmd == FUSE_DEV_IOC_CLONE) {
2222 int oldfd;
2223
2224 err = -EFAULT;
2225 if (!get_user(oldfd, (__u32 __user *) arg)) {
2226 struct file *old = fget(oldfd);
2227
2228 err = -EINVAL;
2229 if (old) {
Jann Horn8ed1f0e2015-08-16 20:27:01 +02002230 struct fuse_dev *fud = NULL;
2231
2232 /*
2233 * Check against file->f_op because CUSE
2234 * uses the same ioctl handler.
2235 */
2236 if (old->f_op == file->f_op &&
2237 old->f_cred->user_ns == file->f_cred->user_ns)
2238 fud = fuse_get_dev(old);
Miklos Szeredi00c570f2015-07-01 16:26:08 +02002239
Miklos Szeredicc080e92015-07-01 16:26:08 +02002240 if (fud) {
Miklos Szeredi00c570f2015-07-01 16:26:08 +02002241 mutex_lock(&fuse_mutex);
Miklos Szeredicc080e92015-07-01 16:26:08 +02002242 err = fuse_device_clone(fud->fc, file);
Miklos Szeredi00c570f2015-07-01 16:26:08 +02002243 mutex_unlock(&fuse_mutex);
2244 }
2245 fput(old);
2246 }
2247 }
2248 }
2249 return err;
2250}
2251
Arjan van de Ven4b6f5d22006-03-28 01:56:42 -08002252const struct file_operations fuse_dev_operations = {
Miklos Szeredi334f4852005-09-09 13:10:27 -07002253 .owner = THIS_MODULE,
Tom Van Braeckel94e4fe22015-01-12 05:22:16 +01002254 .open = fuse_dev_open,
Miklos Szeredi334f4852005-09-09 13:10:27 -07002255 .llseek = no_llseek,
Al Virofbdbacc2015-04-03 21:53:39 -04002256 .read_iter = fuse_dev_read,
Miklos Szeredic3021622010-05-25 15:06:07 +02002257 .splice_read = fuse_dev_splice_read,
Al Virofbdbacc2015-04-03 21:53:39 -04002258 .write_iter = fuse_dev_write,
Miklos Szeredidd3bb142010-05-25 15:06:06 +02002259 .splice_write = fuse_dev_splice_write,
Miklos Szeredi334f4852005-09-09 13:10:27 -07002260 .poll = fuse_dev_poll,
2261 .release = fuse_dev_release,
Jeff Dike385a17b2006-04-10 22:54:52 -07002262 .fasync = fuse_dev_fasync,
Miklos Szeredi00c570f2015-07-01 16:26:08 +02002263 .unlocked_ioctl = fuse_dev_ioctl,
2264 .compat_ioctl = fuse_dev_ioctl,
Miklos Szeredi334f4852005-09-09 13:10:27 -07002265};
Tejun Heo08cbf542009-04-14 10:54:53 +09002266EXPORT_SYMBOL_GPL(fuse_dev_operations);
Miklos Szeredi334f4852005-09-09 13:10:27 -07002267
2268static struct miscdevice fuse_miscdevice = {
2269 .minor = FUSE_MINOR,
2270 .name = "fuse",
2271 .fops = &fuse_dev_operations,
2272};
2273
2274int __init fuse_dev_init(void)
2275{
2276 int err = -ENOMEM;
2277 fuse_req_cachep = kmem_cache_create("fuse_request",
2278 sizeof(struct fuse_req),
Paul Mundt20c2df82007-07-20 10:11:58 +09002279 0, 0, NULL);
Miklos Szeredi334f4852005-09-09 13:10:27 -07002280 if (!fuse_req_cachep)
2281 goto out;
2282
2283 err = misc_register(&fuse_miscdevice);
2284 if (err)
2285 goto out_cache_clean;
2286
2287 return 0;
2288
2289 out_cache_clean:
2290 kmem_cache_destroy(fuse_req_cachep);
2291 out:
2292 return err;
2293}
2294
2295void fuse_dev_cleanup(void)
2296{
2297 misc_deregister(&fuse_miscdevice);
2298 kmem_cache_destroy(fuse_req_cachep);
2299}