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()
51 __set_bit(FR_PENDING, &req->flags); in fuse_request_init()
56 struct fuse_req *req = kmem_cache_alloc(fuse_req_cachep, flags); in __fuse_request_alloc() local
57 if (req) { in __fuse_request_alloc()
62 pages = req->inline_pages; in __fuse_request_alloc()
63 page_descs = req->inline_page_descs; in __fuse_request_alloc()
73 kmem_cache_free(fuse_req_cachep, req); in __fuse_request_alloc()
77 fuse_request_init(req, pages, page_descs, npages); in __fuse_request_alloc()
79 return req; in __fuse_request_alloc()
93 void fuse_request_free(struct fuse_req *req) in fuse_request_free() argument
95 if (req->pages != req->inline_pages) { in fuse_request_free()
96 kfree(req->pages); in fuse_request_free()
97 kfree(req->page_descs); in fuse_request_free()
99 kmem_cache_free(fuse_req_cachep, req); in fuse_request_free()
115 void __fuse_get_request(struct fuse_req *req) in __fuse_get_request() argument
117 atomic_inc(&req->count); in __fuse_get_request()
121 static void __fuse_put_request(struct fuse_req *req) in __fuse_put_request() argument
123 BUG_ON(atomic_read(&req->count) < 2); in __fuse_put_request()
124 atomic_dec(&req->count); in __fuse_put_request()
127 static void fuse_req_init_context(struct fuse_req *req) in fuse_req_init_context() argument
129 req->in.h.uid = from_kuid_munged(&init_user_ns, current_fsuid()); in fuse_req_init_context()
130 req->in.h.gid = from_kgid_munged(&init_user_ns, current_fsgid()); in fuse_req_init_context()
131 req->in.h.pid = current->pid; in fuse_req_init_context()
149 struct fuse_req *req; in __fuse_get_req() local
176 req = fuse_request_alloc(npages); in __fuse_get_req()
178 if (!req) { in __fuse_get_req()
184 fuse_req_init_context(req); in __fuse_get_req()
185 __set_bit(FR_WAITING, &req->flags); in __fuse_get_req()
187 __set_bit(FR_BACKGROUND, &req->flags); in __fuse_get_req()
189 return req; in __fuse_get_req()
217 struct fuse_req *req = NULL; in get_reserved_req() local
224 req = ff->reserved_req; in get_reserved_req()
226 req->stolen_file = get_file(file); in get_reserved_req()
229 } while (!req); in get_reserved_req()
231 return req; in get_reserved_req()
237 static void put_reserved_req(struct fuse_conn *fc, struct fuse_req *req) in put_reserved_req() argument
239 struct file *file = req->stolen_file; in put_reserved_req()
243 fuse_request_init(req, req->pages, req->page_descs, req->max_pages); in put_reserved_req()
245 ff->reserved_req = req; in put_reserved_req()
267 struct fuse_req *req; in fuse_get_req_nofail_nopages() local
273 req = fuse_request_alloc(0); in fuse_get_req_nofail_nopages()
274 if (!req) in fuse_get_req_nofail_nopages()
275 req = get_reserved_req(fc, file); in fuse_get_req_nofail_nopages()
277 fuse_req_init_context(req); in fuse_get_req_nofail_nopages()
278 __set_bit(FR_WAITING, &req->flags); in fuse_get_req_nofail_nopages()
279 __clear_bit(FR_BACKGROUND, &req->flags); in fuse_get_req_nofail_nopages()
280 return req; in fuse_get_req_nofail_nopages()
283 void fuse_put_request(struct fuse_conn *fc, struct fuse_req *req) in fuse_put_request() argument
285 if (atomic_dec_and_test(&req->count)) { in fuse_put_request()
286 if (test_bit(FR_BACKGROUND, &req->flags)) { in fuse_put_request()
297 if (test_bit(FR_WAITING, &req->flags)) { in fuse_put_request()
298 __clear_bit(FR_WAITING, &req->flags); in fuse_put_request()
302 if (req->stolen_file) in fuse_put_request()
303 put_reserved_req(fc, req); in fuse_put_request()
305 fuse_request_free(req); in fuse_put_request()
326 static void queue_request(struct fuse_iqueue *fiq, struct fuse_req *req) in queue_request() argument
328 req->in.h.len = sizeof(struct fuse_in_header) + in queue_request()
329 len_args(req->in.numargs, (struct fuse_arg *) req->in.args); in queue_request()
330 list_add_tail(&req->list, &fiq->pending); in queue_request()
359 struct fuse_req *req; in flush_bg_queue() local
362 req = list_entry(fc->bg_queue.next, struct fuse_req, list); in flush_bg_queue()
363 list_del(&req->list); in flush_bg_queue()
366 req->in.h.unique = fuse_get_unique(fiq); in flush_bg_queue()
367 queue_request(fiq, req); in flush_bg_queue()
380 static void request_end(struct fuse_conn *fc, struct fuse_req *req) in request_end() argument
384 if (test_and_set_bit(FR_FINISHED, &req->flags)) in request_end()
388 list_del_init(&req->intr_entry); in request_end()
390 WARN_ON(test_bit(FR_PENDING, &req->flags)); in request_end()
391 WARN_ON(test_bit(FR_SENT, &req->flags)); in request_end()
392 if (test_bit(FR_BACKGROUND, &req->flags)) { in request_end()
394 clear_bit(FR_BACKGROUND, &req->flags); in request_end()
412 wake_up(&req->waitq); in request_end()
413 if (req->end) in request_end()
414 req->end(fc, req); in request_end()
415 fuse_put_request(fc, req); in request_end()
418 static void queue_interrupt(struct fuse_iqueue *fiq, struct fuse_req *req) in queue_interrupt() argument
421 if (list_empty(&req->intr_entry)) { in queue_interrupt()
422 list_add_tail(&req->intr_entry, &fiq->interrupts); in queue_interrupt()
429 static void request_wait_answer(struct fuse_conn *fc, struct fuse_req *req) in request_wait_answer() argument
436 err = wait_event_interruptible(req->waitq, in request_wait_answer()
437 test_bit(FR_FINISHED, &req->flags)); in request_wait_answer()
441 set_bit(FR_INTERRUPTED, &req->flags); in request_wait_answer()
444 if (test_bit(FR_SENT, &req->flags)) in request_wait_answer()
445 queue_interrupt(fiq, req); in request_wait_answer()
448 if (!test_bit(FR_FORCE, &req->flags)) { in request_wait_answer()
453 err = wait_event_interruptible(req->waitq, in request_wait_answer()
454 test_bit(FR_FINISHED, &req->flags)); in request_wait_answer()
462 if (test_bit(FR_PENDING, &req->flags)) { in request_wait_answer()
463 list_del(&req->list); in request_wait_answer()
465 __fuse_put_request(req); in request_wait_answer()
466 req->out.h.error = -EINTR; in request_wait_answer()
476 wait_event(req->waitq, test_bit(FR_FINISHED, &req->flags)); in request_wait_answer()
479 static void __fuse_request_send(struct fuse_conn *fc, struct fuse_req *req) in __fuse_request_send() argument
483 BUG_ON(test_bit(FR_BACKGROUND, &req->flags)); in __fuse_request_send()
487 req->out.h.error = -ENOTCONN; in __fuse_request_send()
489 req->in.h.unique = fuse_get_unique(fiq); in __fuse_request_send()
490 queue_request(fiq, req); in __fuse_request_send()
493 __fuse_get_request(req); in __fuse_request_send()
496 request_wait_answer(fc, req); in __fuse_request_send()
502 void fuse_request_send(struct fuse_conn *fc, struct fuse_req *req) in fuse_request_send() argument
504 __set_bit(FR_ISREPLY, &req->flags); in fuse_request_send()
505 if (!test_bit(FR_WAITING, &req->flags)) { in fuse_request_send()
506 __set_bit(FR_WAITING, &req->flags); in fuse_request_send()
509 __fuse_request_send(fc, req); in fuse_request_send()
548 struct fuse_req *req; in fuse_simple_request() local
551 req = fuse_get_req(fc, 0); in fuse_simple_request()
552 if (IS_ERR(req)) in fuse_simple_request()
553 return PTR_ERR(req); in fuse_simple_request()
558 req->in.h.opcode = args->in.h.opcode; in fuse_simple_request()
559 req->in.h.nodeid = args->in.h.nodeid; in fuse_simple_request()
560 req->in.numargs = args->in.numargs; in fuse_simple_request()
561 memcpy(req->in.args, args->in.args, in fuse_simple_request()
563 req->out.argvar = args->out.argvar; in fuse_simple_request()
564 req->out.numargs = args->out.numargs; in fuse_simple_request()
565 memcpy(req->out.args, args->out.args, in fuse_simple_request()
567 fuse_request_send(fc, req); in fuse_simple_request()
568 ret = req->out.h.error; in fuse_simple_request()
571 ret = req->out.args[0].size; in fuse_simple_request()
573 fuse_put_request(fc, req); in fuse_simple_request()
584 struct fuse_req *req) in fuse_request_send_background_locked() argument
586 BUG_ON(!test_bit(FR_BACKGROUND, &req->flags)); in fuse_request_send_background_locked()
587 if (!test_bit(FR_WAITING, &req->flags)) { in fuse_request_send_background_locked()
588 __set_bit(FR_WAITING, &req->flags); in fuse_request_send_background_locked()
591 __set_bit(FR_ISREPLY, &req->flags); in fuse_request_send_background_locked()
600 list_add_tail(&req->list, &fc->bg_queue); in fuse_request_send_background_locked()
604 void fuse_request_send_background(struct fuse_conn *fc, struct fuse_req *req) in fuse_request_send_background() argument
606 BUG_ON(!req->end); in fuse_request_send_background()
609 fuse_request_send_background_locked(fc, req); in fuse_request_send_background()
613 req->out.h.error = -ENOTCONN; in fuse_request_send_background()
614 req->end(fc, req); in fuse_request_send_background()
615 fuse_put_request(fc, req); in fuse_request_send_background()
621 struct fuse_req *req, u64 unique) in fuse_request_send_notify_reply() argument
626 __clear_bit(FR_ISREPLY, &req->flags); in fuse_request_send_notify_reply()
627 req->in.h.unique = unique; in fuse_request_send_notify_reply()
630 queue_request(fiq, req); in fuse_request_send_notify_reply()
642 struct fuse_req *req; in fuse_force_forget() local
647 req = fuse_get_req_nofail_nopages(fc, file); in fuse_force_forget()
648 req->in.h.opcode = FUSE_FORGET; in fuse_force_forget()
649 req->in.h.nodeid = nodeid; in fuse_force_forget()
650 req->in.numargs = 1; in fuse_force_forget()
651 req->in.args[0].size = sizeof(inarg); in fuse_force_forget()
652 req->in.args[0].value = &inarg; in fuse_force_forget()
653 __clear_bit(FR_ISREPLY, &req->flags); in fuse_force_forget()
654 __fuse_request_send(fc, req); in fuse_force_forget()
656 fuse_put_request(fc, req); in fuse_force_forget()
664 static int lock_request(struct fuse_req *req) in lock_request() argument
667 if (req) { in lock_request()
668 spin_lock(&req->waitq.lock); in lock_request()
669 if (test_bit(FR_ABORTED, &req->flags)) in lock_request()
672 set_bit(FR_LOCKED, &req->flags); in lock_request()
673 spin_unlock(&req->waitq.lock); in lock_request()
682 static int unlock_request(struct fuse_req *req) in unlock_request() argument
685 if (req) { in unlock_request()
686 spin_lock(&req->waitq.lock); in unlock_request()
687 if (test_bit(FR_ABORTED, &req->flags)) in unlock_request()
690 clear_bit(FR_LOCKED, &req->flags); in unlock_request()
691 spin_unlock(&req->waitq.lock); in unlock_request()
698 struct fuse_req *req; member
746 err = unlock_request(cs->req); in fuse_copy_fill()
798 return lock_request(cs->req); in fuse_copy_fill()
849 err = unlock_request(cs->req); in fuse_try_move_page()
906 spin_lock(&cs->req->waitq.lock); in fuse_try_move_page()
907 if (test_bit(FR_ABORTED, &cs->req->flags)) in fuse_try_move_page()
911 spin_unlock(&cs->req->waitq.lock); in fuse_try_move_page()
931 err = lock_request(cs->req); in fuse_try_move_page()
947 err = unlock_request(cs->req); in fuse_ref_page()
1012 struct fuse_req *req = cs->req; in fuse_copy_pages() local
1014 for (i = 0; i < req->num_pages && (nbytes || zeroing); i++) { in fuse_copy_pages()
1016 unsigned offset = req->page_descs[i].offset; in fuse_copy_pages()
1017 unsigned count = min(nbytes, req->page_descs[i].length); in fuse_copy_pages()
1019 err = fuse_copy_page(cs, &req->pages[i], offset, count, in fuse_copy_pages()
1082 size_t nbytes, struct fuse_req *req) in fuse_read_interrupt() argument
1090 list_del_init(&req->intr_entry); in fuse_read_interrupt()
1091 req->intr_unique = fuse_get_unique(fiq); in fuse_read_interrupt()
1096 ih.unique = req->intr_unique; in fuse_read_interrupt()
1097 arg.unique = req->in.h.unique; in fuse_read_interrupt()
1242 struct fuse_req *req; in fuse_dev_do_read() local
1263 req = list_entry(fiq->interrupts.next, struct fuse_req, in fuse_dev_do_read()
1265 return fuse_read_interrupt(fiq, cs, nbytes, req); in fuse_dev_do_read()
1276 req = list_entry(fiq->pending.next, struct fuse_req, list); in fuse_dev_do_read()
1277 clear_bit(FR_PENDING, &req->flags); in fuse_dev_do_read()
1278 list_del_init(&req->list); in fuse_dev_do_read()
1281 in = &req->in; in fuse_dev_do_read()
1285 req->out.h.error = -EIO; in fuse_dev_do_read()
1288 req->out.h.error = -E2BIG; in fuse_dev_do_read()
1289 request_end(fc, req); in fuse_dev_do_read()
1293 list_add(&req->list, &fpq->io); in fuse_dev_do_read()
1295 cs->req = req; in fuse_dev_do_read()
1302 clear_bit(FR_LOCKED, &req->flags); in fuse_dev_do_read()
1308 req->out.h.error = -EIO; in fuse_dev_do_read()
1311 if (!test_bit(FR_ISREPLY, &req->flags)) { in fuse_dev_do_read()
1315 list_move_tail(&req->list, &fpq->processing); in fuse_dev_do_read()
1317 set_bit(FR_SENT, &req->flags); in fuse_dev_do_read()
1320 if (test_bit(FR_INTERRUPTED, &req->flags)) in fuse_dev_do_read()
1321 queue_interrupt(fiq, req); in fuse_dev_do_read()
1326 if (!test_bit(FR_PRIVATE, &req->flags)) in fuse_dev_do_read()
1327 list_del_init(&req->list); in fuse_dev_do_read()
1329 request_end(fc, req); in fuse_dev_do_read()
1682 static void fuse_retrieve_end(struct fuse_conn *fc, struct fuse_req *req) in fuse_retrieve_end() argument
1684 release_pages(req->pages, req->num_pages, false); in fuse_retrieve_end()
1692 struct fuse_req *req; in fuse_retrieve() local
1712 req = fuse_get_req(fc, num_pages); in fuse_retrieve()
1713 if (IS_ERR(req)) in fuse_retrieve()
1714 return PTR_ERR(req); in fuse_retrieve()
1716 req->in.h.opcode = FUSE_NOTIFY_REPLY; in fuse_retrieve()
1717 req->in.h.nodeid = outarg->nodeid; in fuse_retrieve()
1718 req->in.numargs = 2; in fuse_retrieve()
1719 req->in.argpages = 1; in fuse_retrieve()
1720 req->page_descs[0].offset = offset; in fuse_retrieve()
1721 req->end = fuse_retrieve_end; in fuse_retrieve()
1725 while (num && req->num_pages < num_pages) { in fuse_retrieve()
1734 req->pages[req->num_pages] = page; in fuse_retrieve()
1735 req->page_descs[req->num_pages].length = this_num; in fuse_retrieve()
1736 req->num_pages++; in fuse_retrieve()
1743 req->misc.retrieve_in.offset = outarg->offset; in fuse_retrieve()
1744 req->misc.retrieve_in.size = total_len; in fuse_retrieve()
1745 req->in.args[0].size = sizeof(req->misc.retrieve_in); in fuse_retrieve()
1746 req->in.args[0].value = &req->misc.retrieve_in; in fuse_retrieve()
1747 req->in.args[1].size = total_len; in fuse_retrieve()
1749 err = fuse_request_send_notify_reply(fc, req, outarg->notify_unique); in fuse_retrieve()
1751 fuse_retrieve_end(fc, req); in fuse_retrieve()
1827 struct fuse_req *req; in request_find() local
1829 list_for_each_entry(req, &fpq->processing, list) { in request_find()
1830 if (req->in.h.unique == unique || req->intr_unique == unique) in request_find()
1831 return req; in request_find()
1872 struct fuse_req *req; in fuse_dev_do_write() local
1904 req = request_find(fpq, oh.unique); in fuse_dev_do_write()
1905 if (!req) in fuse_dev_do_write()
1909 if (req->intr_unique == oh.unique) { in fuse_dev_do_write()
1919 queue_interrupt(&fc->iq, req); in fuse_dev_do_write()
1925 clear_bit(FR_SENT, &req->flags); in fuse_dev_do_write()
1926 list_move(&req->list, &fpq->io); in fuse_dev_do_write()
1927 req->out.h = oh; in fuse_dev_do_write()
1928 set_bit(FR_LOCKED, &req->flags); in fuse_dev_do_write()
1930 cs->req = req; in fuse_dev_do_write()
1931 if (!req->out.page_replace) in fuse_dev_do_write()
1934 err = copy_out_args(cs, &req->out, nbytes); in fuse_dev_do_write()
1938 clear_bit(FR_LOCKED, &req->flags); in fuse_dev_do_write()
1942 req->out.h.error = -EIO; in fuse_dev_do_write()
1943 if (!test_bit(FR_PRIVATE, &req->flags)) in fuse_dev_do_write()
1944 list_del_init(&req->list); in fuse_dev_do_write()
1947 request_end(fc, req); in fuse_dev_do_write()
2083 struct fuse_req *req; in end_requests() local
2084 req = list_entry(head->next, struct fuse_req, list); in end_requests()
2085 req->out.h.error = -ECONNABORTED; in end_requests()
2086 clear_bit(FR_PENDING, &req->flags); in end_requests()
2087 clear_bit(FR_SENT, &req->flags); in end_requests()
2088 list_del_init(&req->list); in end_requests()
2089 request_end(fc, req); in end_requests()
2133 struct fuse_req *req, *next; in fuse_abort_conn() local
2145 list_for_each_entry_safe(req, next, &fpq->io, list) { in fuse_abort_conn()
2146 req->out.h.error = -ECONNABORTED; in fuse_abort_conn()
2147 spin_lock(&req->waitq.lock); in fuse_abort_conn()
2148 set_bit(FR_ABORTED, &req->flags); in fuse_abort_conn()
2149 if (!test_bit(FR_LOCKED, &req->flags)) { in fuse_abort_conn()
2150 set_bit(FR_PRIVATE, &req->flags); in fuse_abort_conn()
2151 list_move(&req->list, &to_end1); in fuse_abort_conn()
2153 spin_unlock(&req->waitq.lock); in fuse_abort_conn()
2174 req = list_first_entry(&to_end1, struct fuse_req, list); in fuse_abort_conn()
2175 __fuse_get_request(req); in fuse_abort_conn()
2176 list_del_init(&req->list); in fuse_abort_conn()
2177 request_end(fc, req); in fuse_abort_conn()