Lines Matching refs:req
37 static void fuse_request_init(struct fuse_req *req, struct page **pages, in fuse_request_init() argument
41 memset(req, 0, sizeof(*req)); in fuse_request_init()
44 INIT_LIST_HEAD(&req->list); in fuse_request_init()
45 INIT_LIST_HEAD(&req->intr_entry); in fuse_request_init()
46 init_waitqueue_head(&req->waitq); in fuse_request_init()
47 atomic_set(&req->count, 1); in fuse_request_init()
48 req->pages = pages; in fuse_request_init()
49 req->page_descs = page_descs; in fuse_request_init()
50 req->max_pages = npages; in fuse_request_init()
55 struct fuse_req *req = kmem_cache_alloc(fuse_req_cachep, flags); in __fuse_request_alloc() local
56 if (req) { in __fuse_request_alloc()
61 pages = req->inline_pages; in __fuse_request_alloc()
62 page_descs = req->inline_page_descs; in __fuse_request_alloc()
72 kmem_cache_free(fuse_req_cachep, req); in __fuse_request_alloc()
76 fuse_request_init(req, pages, page_descs, npages); in __fuse_request_alloc()
78 return req; in __fuse_request_alloc()
92 void fuse_request_free(struct fuse_req *req) in fuse_request_free() argument
94 if (req->pages != req->inline_pages) { in fuse_request_free()
95 kfree(req->pages); in fuse_request_free()
96 kfree(req->page_descs); in fuse_request_free()
98 kmem_cache_free(fuse_req_cachep, req); in fuse_request_free()
114 void __fuse_get_request(struct fuse_req *req) in __fuse_get_request() argument
116 atomic_inc(&req->count); in __fuse_get_request()
120 static void __fuse_put_request(struct fuse_req *req) in __fuse_put_request() argument
122 BUG_ON(atomic_read(&req->count) < 2); in __fuse_put_request()
123 atomic_dec(&req->count); in __fuse_put_request()
126 static void fuse_req_init_context(struct fuse_req *req) in fuse_req_init_context() argument
128 req->in.h.uid = from_kuid_munged(&init_user_ns, current_fsuid()); in fuse_req_init_context()
129 req->in.h.gid = from_kgid_munged(&init_user_ns, current_fsgid()); in fuse_req_init_context()
130 req->in.h.pid = current->pid; in fuse_req_init_context()
148 struct fuse_req *req; in __fuse_get_req() local
171 req = fuse_request_alloc(npages); in __fuse_get_req()
173 if (!req) { in __fuse_get_req()
179 fuse_req_init_context(req); in __fuse_get_req()
180 req->waiting = 1; in __fuse_get_req()
181 req->background = for_background; in __fuse_get_req()
182 return req; in __fuse_get_req()
210 struct fuse_req *req = NULL; in get_reserved_req() local
217 req = ff->reserved_req; in get_reserved_req()
219 req->stolen_file = get_file(file); in get_reserved_req()
222 } while (!req); in get_reserved_req()
224 return req; in get_reserved_req()
230 static void put_reserved_req(struct fuse_conn *fc, struct fuse_req *req) in put_reserved_req() argument
232 struct file *file = req->stolen_file; in put_reserved_req()
236 fuse_request_init(req, req->pages, req->page_descs, req->max_pages); in put_reserved_req()
238 ff->reserved_req = req; in put_reserved_req()
260 struct fuse_req *req; in fuse_get_req_nofail_nopages() local
266 req = fuse_request_alloc(0); in fuse_get_req_nofail_nopages()
267 if (!req) in fuse_get_req_nofail_nopages()
268 req = get_reserved_req(fc, file); in fuse_get_req_nofail_nopages()
270 fuse_req_init_context(req); in fuse_get_req_nofail_nopages()
271 req->waiting = 1; in fuse_get_req_nofail_nopages()
272 req->background = 0; in fuse_get_req_nofail_nopages()
273 return req; in fuse_get_req_nofail_nopages()
276 void fuse_put_request(struct fuse_conn *fc, struct fuse_req *req) in fuse_put_request() argument
278 if (atomic_dec_and_test(&req->count)) { in fuse_put_request()
279 if (unlikely(req->background)) { in fuse_put_request()
290 if (req->waiting) in fuse_put_request()
293 if (req->stolen_file) in fuse_put_request()
294 put_reserved_req(fc, req); in fuse_put_request()
296 fuse_request_free(req); in fuse_put_request()
322 static void queue_request(struct fuse_conn *fc, struct fuse_req *req) in queue_request() argument
324 req->in.h.len = sizeof(struct fuse_in_header) + in queue_request()
325 len_args(req->in.numargs, (struct fuse_arg *) req->in.args); in queue_request()
326 list_add_tail(&req->list, &fc->pending); in queue_request()
327 req->state = FUSE_REQ_PENDING; in queue_request()
328 if (!req->waiting) { in queue_request()
329 req->waiting = 1; in queue_request()
358 struct fuse_req *req; in flush_bg_queue() local
360 req = list_entry(fc->bg_queue.next, struct fuse_req, list); in flush_bg_queue()
361 list_del(&req->list); in flush_bg_queue()
363 req->in.h.unique = fuse_get_unique(fc); in flush_bg_queue()
364 queue_request(fc, req); in flush_bg_queue()
378 static void request_end(struct fuse_conn *fc, struct fuse_req *req) in request_end() argument
381 void (*end) (struct fuse_conn *, struct fuse_req *) = req->end; in request_end()
382 req->end = NULL; in request_end()
383 list_del(&req->list); in request_end()
384 list_del(&req->intr_entry); in request_end()
385 req->state = FUSE_REQ_FINISHED; in request_end()
386 if (req->background) { in request_end()
387 req->background = 0; in request_end()
406 wake_up(&req->waitq); in request_end()
408 end(fc, req); in request_end()
409 fuse_put_request(fc, req); in request_end()
413 struct fuse_req *req) in wait_answer_interruptible() argument
421 wait_event_interruptible(req->waitq, req->state == FUSE_REQ_FINISHED); in wait_answer_interruptible()
425 static void queue_interrupt(struct fuse_conn *fc, struct fuse_req *req) in queue_interrupt() argument
427 list_add_tail(&req->intr_entry, &fc->interrupts); in queue_interrupt()
432 static void request_wait_answer(struct fuse_conn *fc, struct fuse_req *req) in request_wait_answer() argument
438 wait_answer_interruptible(fc, req); in request_wait_answer()
440 if (req->aborted) in request_wait_answer()
442 if (req->state == FUSE_REQ_FINISHED) in request_wait_answer()
445 req->interrupted = 1; in request_wait_answer()
446 if (req->state == FUSE_REQ_SENT) in request_wait_answer()
447 queue_interrupt(fc, req); in request_wait_answer()
450 if (!req->force) { in request_wait_answer()
455 wait_answer_interruptible(fc, req); in request_wait_answer()
458 if (req->aborted) in request_wait_answer()
460 if (req->state == FUSE_REQ_FINISHED) in request_wait_answer()
464 if (req->state == FUSE_REQ_PENDING) { in request_wait_answer()
465 list_del(&req->list); in request_wait_answer()
466 __fuse_put_request(req); in request_wait_answer()
467 req->out.h.error = -EINTR; in request_wait_answer()
477 wait_event(req->waitq, req->state == FUSE_REQ_FINISHED); in request_wait_answer()
480 if (!req->aborted) in request_wait_answer()
484 BUG_ON(req->state != FUSE_REQ_FINISHED); in request_wait_answer()
485 if (req->locked) { in request_wait_answer()
492 wait_event(req->waitq, !req->locked); in request_wait_answer()
497 static void __fuse_request_send(struct fuse_conn *fc, struct fuse_req *req) in __fuse_request_send() argument
499 BUG_ON(req->background); in __fuse_request_send()
502 req->out.h.error = -ENOTCONN; in __fuse_request_send()
504 req->out.h.error = -ECONNREFUSED; in __fuse_request_send()
506 req->in.h.unique = fuse_get_unique(fc); in __fuse_request_send()
507 queue_request(fc, req); in __fuse_request_send()
510 __fuse_get_request(req); in __fuse_request_send()
512 request_wait_answer(fc, req); in __fuse_request_send()
517 void fuse_request_send(struct fuse_conn *fc, struct fuse_req *req) in fuse_request_send() argument
519 req->isreply = 1; in fuse_request_send()
520 __fuse_request_send(fc, req); in fuse_request_send()
559 struct fuse_req *req; in fuse_simple_request() local
562 req = fuse_get_req(fc, 0); in fuse_simple_request()
563 if (IS_ERR(req)) in fuse_simple_request()
564 return PTR_ERR(req); in fuse_simple_request()
569 req->in.h.opcode = args->in.h.opcode; in fuse_simple_request()
570 req->in.h.nodeid = args->in.h.nodeid; in fuse_simple_request()
571 req->in.numargs = args->in.numargs; in fuse_simple_request()
572 memcpy(req->in.args, args->in.args, in fuse_simple_request()
574 req->out.argvar = args->out.argvar; in fuse_simple_request()
575 req->out.numargs = args->out.numargs; in fuse_simple_request()
576 memcpy(req->out.args, args->out.args, in fuse_simple_request()
578 fuse_request_send(fc, req); in fuse_simple_request()
579 ret = req->out.h.error; in fuse_simple_request()
582 ret = req->out.args[0].size; in fuse_simple_request()
584 fuse_put_request(fc, req); in fuse_simple_request()
590 struct fuse_req *req) in fuse_request_send_nowait_locked() argument
592 BUG_ON(!req->background); in fuse_request_send_nowait_locked()
601 list_add_tail(&req->list, &fc->bg_queue); in fuse_request_send_nowait_locked()
605 static void fuse_request_send_nowait(struct fuse_conn *fc, struct fuse_req *req) in fuse_request_send_nowait() argument
609 fuse_request_send_nowait_locked(fc, req); in fuse_request_send_nowait()
612 req->out.h.error = -ENOTCONN; in fuse_request_send_nowait()
613 request_end(fc, req); in fuse_request_send_nowait()
617 void fuse_request_send_background(struct fuse_conn *fc, struct fuse_req *req) in fuse_request_send_background() argument
619 req->isreply = 1; in fuse_request_send_background()
620 fuse_request_send_nowait(fc, req); in fuse_request_send_background()
625 struct fuse_req *req, u64 unique) in fuse_request_send_notify_reply() argument
629 req->isreply = 0; in fuse_request_send_notify_reply()
630 req->in.h.unique = unique; in fuse_request_send_notify_reply()
633 queue_request(fc, req); in fuse_request_send_notify_reply()
647 struct fuse_req *req) in fuse_request_send_background_locked() argument
649 req->isreply = 1; in fuse_request_send_background_locked()
650 fuse_request_send_nowait_locked(fc, req); in fuse_request_send_background_locked()
657 struct fuse_req *req; in fuse_force_forget() local
662 req = fuse_get_req_nofail_nopages(fc, file); in fuse_force_forget()
663 req->in.h.opcode = FUSE_FORGET; in fuse_force_forget()
664 req->in.h.nodeid = nodeid; in fuse_force_forget()
665 req->in.numargs = 1; in fuse_force_forget()
666 req->in.args[0].size = sizeof(inarg); in fuse_force_forget()
667 req->in.args[0].value = &inarg; in fuse_force_forget()
668 req->isreply = 0; in fuse_force_forget()
669 __fuse_request_send(fc, req); in fuse_force_forget()
671 fuse_put_request(fc, req); in fuse_force_forget()
679 static int lock_request(struct fuse_conn *fc, struct fuse_req *req) in lock_request() argument
682 if (req) { in lock_request()
684 if (req->aborted) in lock_request()
687 req->locked = 1; in lock_request()
698 static void unlock_request(struct fuse_conn *fc, struct fuse_req *req) in unlock_request() argument
700 if (req) { in unlock_request()
702 req->locked = 0; in unlock_request()
703 if (req->aborted) in unlock_request()
704 wake_up(&req->waitq); in unlock_request()
712 struct fuse_req *req; member
763 unlock_request(cs->fc, cs->req); in fuse_copy_fill()
812 return lock_request(cs->fc, cs->req); in fuse_copy_fill()
863 unlock_request(cs->fc, cs->req); in fuse_try_move_page()
918 if (cs->req->aborted) in fuse_try_move_page()
942 err = lock_request(cs->fc, cs->req); in fuse_try_move_page()
957 unlock_request(cs->fc, cs->req); in fuse_ref_page()
1019 struct fuse_req *req = cs->req; in fuse_copy_pages() local
1021 for (i = 0; i < req->num_pages && (nbytes || zeroing); i++) { in fuse_copy_pages()
1023 unsigned offset = req->page_descs[i].offset; in fuse_copy_pages()
1024 unsigned count = min(nbytes, req->page_descs[i].length); in fuse_copy_pages()
1026 err = fuse_copy_page(cs, &req->pages[i], offset, count, in fuse_copy_pages()
1109 size_t nbytes, struct fuse_req *req) in fuse_read_interrupt() argument
1117 list_del_init(&req->intr_entry); in fuse_read_interrupt()
1118 req->intr_unique = fuse_get_unique(fc); in fuse_read_interrupt()
1123 ih.unique = req->intr_unique; in fuse_read_interrupt()
1124 arg.unique = req->in.h.unique; in fuse_read_interrupt()
1265 struct fuse_req *req; in fuse_dev_do_read() local
1285 req = list_entry(fc->interrupts.next, struct fuse_req, in fuse_dev_do_read()
1287 return fuse_read_interrupt(fc, cs, nbytes, req); in fuse_dev_do_read()
1298 req = list_entry(fc->pending.next, struct fuse_req, list); in fuse_dev_do_read()
1299 req->state = FUSE_REQ_READING; in fuse_dev_do_read()
1300 list_move(&req->list, &fc->io); in fuse_dev_do_read()
1302 in = &req->in; in fuse_dev_do_read()
1306 req->out.h.error = -EIO; in fuse_dev_do_read()
1309 req->out.h.error = -E2BIG; in fuse_dev_do_read()
1310 request_end(fc, req); in fuse_dev_do_read()
1314 cs->req = req; in fuse_dev_do_read()
1321 req->locked = 0; in fuse_dev_do_read()
1322 if (req->aborted) { in fuse_dev_do_read()
1323 request_end(fc, req); in fuse_dev_do_read()
1327 req->out.h.error = -EIO; in fuse_dev_do_read()
1328 request_end(fc, req); in fuse_dev_do_read()
1331 if (!req->isreply) in fuse_dev_do_read()
1332 request_end(fc, req); in fuse_dev_do_read()
1334 req->state = FUSE_REQ_SENT; in fuse_dev_do_read()
1335 list_move_tail(&req->list, &fc->processing); in fuse_dev_do_read()
1336 if (req->interrupted) in fuse_dev_do_read()
1337 queue_interrupt(fc, req); in fuse_dev_do_read()
1690 static void fuse_retrieve_end(struct fuse_conn *fc, struct fuse_req *req) in fuse_retrieve_end() argument
1692 release_pages(req->pages, req->num_pages, false); in fuse_retrieve_end()
1700 struct fuse_req *req; in fuse_retrieve() local
1720 req = fuse_get_req(fc, num_pages); in fuse_retrieve()
1721 if (IS_ERR(req)) in fuse_retrieve()
1722 return PTR_ERR(req); in fuse_retrieve()
1724 req->in.h.opcode = FUSE_NOTIFY_REPLY; in fuse_retrieve()
1725 req->in.h.nodeid = outarg->nodeid; in fuse_retrieve()
1726 req->in.numargs = 2; in fuse_retrieve()
1727 req->in.argpages = 1; in fuse_retrieve()
1728 req->page_descs[0].offset = offset; in fuse_retrieve()
1729 req->end = fuse_retrieve_end; in fuse_retrieve()
1733 while (num && req->num_pages < num_pages) { in fuse_retrieve()
1742 req->pages[req->num_pages] = page; in fuse_retrieve()
1743 req->page_descs[req->num_pages].length = this_num; in fuse_retrieve()
1744 req->num_pages++; in fuse_retrieve()
1751 req->misc.retrieve_in.offset = outarg->offset; in fuse_retrieve()
1752 req->misc.retrieve_in.size = total_len; in fuse_retrieve()
1753 req->in.args[0].size = sizeof(req->misc.retrieve_in); in fuse_retrieve()
1754 req->in.args[0].value = &req->misc.retrieve_in; in fuse_retrieve()
1755 req->in.args[1].size = total_len; in fuse_retrieve()
1757 err = fuse_request_send_notify_reply(fc, req, outarg->notify_unique); in fuse_retrieve()
1759 fuse_retrieve_end(fc, req); in fuse_retrieve()
1835 struct fuse_req *req; in request_find() local
1837 list_for_each_entry(req, &fc->processing, list) { in request_find()
1838 if (req->in.h.unique == unique || req->intr_unique == unique) in request_find()
1839 return req; in request_find()
1878 struct fuse_req *req; in fuse_dev_do_write() local
1910 req = request_find(fc, oh.unique); in fuse_dev_do_write()
1911 if (!req) in fuse_dev_do_write()
1914 if (req->aborted) { in fuse_dev_do_write()
1918 request_end(fc, req); in fuse_dev_do_write()
1922 if (req->intr_unique == oh.unique) { in fuse_dev_do_write()
1930 queue_interrupt(fc, req); in fuse_dev_do_write()
1937 req->state = FUSE_REQ_WRITING; in fuse_dev_do_write()
1938 list_move(&req->list, &fc->io); in fuse_dev_do_write()
1939 req->out.h = oh; in fuse_dev_do_write()
1940 req->locked = 1; in fuse_dev_do_write()
1941 cs->req = req; in fuse_dev_do_write()
1942 if (!req->out.page_replace) in fuse_dev_do_write()
1946 err = copy_out_args(cs, &req->out, nbytes); in fuse_dev_do_write()
1950 req->locked = 0; in fuse_dev_do_write()
1952 if (req->aborted) in fuse_dev_do_write()
1954 } else if (!req->aborted) in fuse_dev_do_write()
1955 req->out.h.error = -EIO; in fuse_dev_do_write()
1956 request_end(fc, req); in fuse_dev_do_write()
2090 struct fuse_req *req; in end_requests() local
2091 req = list_entry(head->next, struct fuse_req, list); in end_requests()
2092 req->out.h.error = -ECONNABORTED; in end_requests()
2093 request_end(fc, req); in end_requests()
2114 struct fuse_req *req = in end_io_requests() local
2116 void (*end) (struct fuse_conn *, struct fuse_req *) = req->end; in end_io_requests()
2118 req->aborted = 1; in end_io_requests()
2119 req->out.h.error = -ECONNABORTED; in end_io_requests()
2120 req->state = FUSE_REQ_FINISHED; in end_io_requests()
2121 list_del_init(&req->list); in end_io_requests()
2122 wake_up(&req->waitq); in end_io_requests()
2124 req->end = NULL; in end_io_requests()
2125 __fuse_get_request(req); in end_io_requests()
2127 wait_event(req->waitq, !req->locked); in end_io_requests()
2128 end(fc, req); in end_io_requests()
2129 fuse_put_request(fc, req); in end_io_requests()