• Home
  • Raw
  • Download

Lines Matching refs:req

43 static void fuse_request_init(struct fuse_req *req)  in fuse_request_init()  argument
45 INIT_LIST_HEAD(&req->list); in fuse_request_init()
46 INIT_LIST_HEAD(&req->intr_entry); in fuse_request_init()
47 init_waitqueue_head(&req->waitq); in fuse_request_init()
48 refcount_set(&req->count, 1); in fuse_request_init()
49 __set_bit(FR_PENDING, &req->flags); in fuse_request_init()
54 struct fuse_req *req = kmem_cache_zalloc(fuse_req_cachep, flags); in fuse_request_alloc() local
55 if (req) in fuse_request_alloc()
56 fuse_request_init(req); in fuse_request_alloc()
58 return req; in fuse_request_alloc()
61 static void fuse_request_free(struct fuse_req *req) in fuse_request_free() argument
63 kmem_cache_free(fuse_req_cachep, req); in fuse_request_free()
66 static void __fuse_get_request(struct fuse_req *req) in __fuse_get_request() argument
68 refcount_inc(&req->count); in __fuse_get_request()
72 static void __fuse_put_request(struct fuse_req *req) in __fuse_put_request() argument
74 refcount_dec(&req->count); in __fuse_put_request()
103 static void fuse_put_request(struct fuse_conn *fc, struct fuse_req *req);
107 struct fuse_req *req; in fuse_get_req() local
128 req = fuse_request_alloc(GFP_KERNEL); in fuse_get_req()
130 if (!req) { in fuse_get_req()
136 req->in.h.uid = from_kuid(fc->user_ns, current_fsuid()); in fuse_get_req()
137 req->in.h.gid = from_kgid(fc->user_ns, current_fsgid()); in fuse_get_req()
138 req->in.h.pid = pid_nr_ns(task_pid(current), fc->pid_ns); in fuse_get_req()
140 __set_bit(FR_WAITING, &req->flags); in fuse_get_req()
142 __set_bit(FR_BACKGROUND, &req->flags); in fuse_get_req()
144 if (unlikely(req->in.h.uid == ((uid_t)-1) || in fuse_get_req()
145 req->in.h.gid == ((gid_t)-1))) { in fuse_get_req()
146 fuse_put_request(fc, req); in fuse_get_req()
149 return req; in fuse_get_req()
156 static void fuse_put_request(struct fuse_conn *fc, struct fuse_req *req) in fuse_put_request() argument
158 if (refcount_dec_and_test(&req->count)) { in fuse_put_request()
159 if (test_bit(FR_BACKGROUND, &req->flags)) { in fuse_put_request()
170 if (test_bit(FR_WAITING, &req->flags)) { in fuse_put_request()
171 __clear_bit(FR_WAITING, &req->flags); in fuse_put_request()
175 fuse_request_free(req); in fuse_put_request()
222 struct fuse_req *req) in queue_request_and_unlock() argument
225 req->in.h.len = sizeof(struct fuse_in_header) + in queue_request_and_unlock()
226 fuse_len_args(req->args->in_numargs, in queue_request_and_unlock()
227 (struct fuse_arg *) req->args->in_args); in queue_request_and_unlock()
228 list_add_tail(&req->list, &fiq->pending); in queue_request_and_unlock()
257 struct fuse_req *req; in flush_bg_queue() local
259 req = list_first_entry(&fc->bg_queue, struct fuse_req, list); in flush_bg_queue()
260 list_del(&req->list); in flush_bg_queue()
263 req->in.h.unique = fuse_get_unique(fiq); in flush_bg_queue()
264 queue_request_and_unlock(fiq, req); in flush_bg_queue()
276 void fuse_request_end(struct fuse_conn *fc, struct fuse_req *req) in fuse_request_end() argument
281 if (test_and_set_bit(FR_FINISHED, &req->flags)) in fuse_request_end()
284 async = req->args->end; in fuse_request_end()
290 if (!list_empty(&req->intr_entry)) { in fuse_request_end()
292 list_del_init(&req->intr_entry); in fuse_request_end()
295 WARN_ON(test_bit(FR_PENDING, &req->flags)); in fuse_request_end()
296 WARN_ON(test_bit(FR_SENT, &req->flags)); in fuse_request_end()
297 if (test_bit(FR_BACKGROUND, &req->flags)) { in fuse_request_end()
299 clear_bit(FR_BACKGROUND, &req->flags); in fuse_request_end()
324 wake_up(&req->waitq); in fuse_request_end()
328 req->args->end(fc, req->args, req->out.h.error); in fuse_request_end()
330 fuse_put_request(fc, req); in fuse_request_end()
334 static int queue_interrupt(struct fuse_iqueue *fiq, struct fuse_req *req) in queue_interrupt() argument
338 if (unlikely(!test_bit(FR_INTERRUPTED, &req->flags))) { in queue_interrupt()
343 if (list_empty(&req->intr_entry)) { in queue_interrupt()
344 list_add_tail(&req->intr_entry, &fiq->interrupts); in queue_interrupt()
350 if (test_bit(FR_FINISHED, &req->flags)) { in queue_interrupt()
351 list_del_init(&req->intr_entry); in queue_interrupt()
362 static void request_wait_answer(struct fuse_conn *fc, struct fuse_req *req) in request_wait_answer() argument
369 err = wait_event_interruptible(req->waitq, in request_wait_answer()
370 test_bit(FR_FINISHED, &req->flags)); in request_wait_answer()
374 set_bit(FR_INTERRUPTED, &req->flags); in request_wait_answer()
377 if (test_bit(FR_SENT, &req->flags)) in request_wait_answer()
378 queue_interrupt(fiq, req); in request_wait_answer()
381 if (!test_bit(FR_FORCE, &req->flags)) { in request_wait_answer()
383 err = wait_event_killable(req->waitq, in request_wait_answer()
384 test_bit(FR_FINISHED, &req->flags)); in request_wait_answer()
390 if (test_bit(FR_PENDING, &req->flags)) { in request_wait_answer()
391 list_del(&req->list); in request_wait_answer()
393 __fuse_put_request(req); in request_wait_answer()
394 req->out.h.error = -EINTR; in request_wait_answer()
404 wait_event(req->waitq, test_bit(FR_FINISHED, &req->flags)); in request_wait_answer()
407 static void __fuse_request_send(struct fuse_conn *fc, struct fuse_req *req) in __fuse_request_send() argument
411 BUG_ON(test_bit(FR_BACKGROUND, &req->flags)); in __fuse_request_send()
415 req->out.h.error = -ENOTCONN; in __fuse_request_send()
417 req->in.h.unique = fuse_get_unique(fiq); in __fuse_request_send()
420 __fuse_get_request(req); in __fuse_request_send()
421 queue_request_and_unlock(fiq, req); in __fuse_request_send()
423 request_wait_answer(fc, req); in __fuse_request_send()
462 static void fuse_force_creds(struct fuse_conn *fc, struct fuse_req *req) in fuse_force_creds() argument
464 req->in.h.uid = from_kuid_munged(fc->user_ns, current_fsuid()); in fuse_force_creds()
465 req->in.h.gid = from_kgid_munged(fc->user_ns, current_fsgid()); in fuse_force_creds()
466 req->in.h.pid = pid_nr_ns(task_pid(current), fc->pid_ns); in fuse_force_creds()
469 static void fuse_args_to_req(struct fuse_req *req, struct fuse_args *args) in fuse_args_to_req() argument
471 req->in.h.opcode = args->opcode; in fuse_args_to_req()
472 req->in.h.nodeid = args->nodeid; in fuse_args_to_req()
473 req->args = args; in fuse_args_to_req()
478 struct fuse_req *req; in fuse_simple_request() local
483 req = fuse_request_alloc(GFP_KERNEL | __GFP_NOFAIL); in fuse_simple_request()
486 fuse_force_creds(fc, req); in fuse_simple_request()
488 __set_bit(FR_WAITING, &req->flags); in fuse_simple_request()
489 __set_bit(FR_FORCE, &req->flags); in fuse_simple_request()
492 req = fuse_get_req(fc, false); in fuse_simple_request()
493 if (IS_ERR(req)) in fuse_simple_request()
494 return PTR_ERR(req); in fuse_simple_request()
499 fuse_args_to_req(req, args); in fuse_simple_request()
502 __set_bit(FR_ISREPLY, &req->flags); in fuse_simple_request()
503 __fuse_request_send(fc, req); in fuse_simple_request()
504 ret = req->out.h.error; in fuse_simple_request()
509 fuse_put_request(fc, req); in fuse_simple_request()
515 struct fuse_req *req) in fuse_request_queue_background() argument
519 WARN_ON(!test_bit(FR_BACKGROUND, &req->flags)); in fuse_request_queue_background()
520 if (!test_bit(FR_WAITING, &req->flags)) { in fuse_request_queue_background()
521 __set_bit(FR_WAITING, &req->flags); in fuse_request_queue_background()
524 __set_bit(FR_ISREPLY, &req->flags); in fuse_request_queue_background()
534 list_add_tail(&req->list, &fc->bg_queue); in fuse_request_queue_background()
546 struct fuse_req *req; in fuse_simple_background() local
550 req = fuse_request_alloc(gfp_flags); in fuse_simple_background()
551 if (!req) in fuse_simple_background()
553 __set_bit(FR_BACKGROUND, &req->flags); in fuse_simple_background()
556 req = fuse_get_req(fc, true); in fuse_simple_background()
557 if (IS_ERR(req)) in fuse_simple_background()
558 return PTR_ERR(req); in fuse_simple_background()
561 fuse_args_to_req(req, args); in fuse_simple_background()
563 if (!fuse_request_queue_background(fc, req)) { in fuse_simple_background()
564 fuse_put_request(fc, req); in fuse_simple_background()
575 struct fuse_req *req; in fuse_simple_notify_reply() local
579 req = fuse_get_req(fc, false); in fuse_simple_notify_reply()
580 if (IS_ERR(req)) in fuse_simple_notify_reply()
581 return PTR_ERR(req); in fuse_simple_notify_reply()
583 __clear_bit(FR_ISREPLY, &req->flags); in fuse_simple_notify_reply()
584 req->in.h.unique = unique; in fuse_simple_notify_reply()
586 fuse_args_to_req(req, args); in fuse_simple_notify_reply()
590 queue_request_and_unlock(fiq, req); in fuse_simple_notify_reply()
594 fuse_put_request(fc, req); in fuse_simple_notify_reply()
605 static int lock_request(struct fuse_req *req) in lock_request() argument
608 if (req) { in lock_request()
609 spin_lock(&req->waitq.lock); in lock_request()
610 if (test_bit(FR_ABORTED, &req->flags)) in lock_request()
613 set_bit(FR_LOCKED, &req->flags); in lock_request()
614 spin_unlock(&req->waitq.lock); in lock_request()
623 static int unlock_request(struct fuse_req *req) in unlock_request() argument
626 if (req) { in unlock_request()
627 spin_lock(&req->waitq.lock); in unlock_request()
628 if (test_bit(FR_ABORTED, &req->flags)) in unlock_request()
631 clear_bit(FR_LOCKED, &req->flags); in unlock_request()
632 spin_unlock(&req->waitq.lock); in unlock_request()
639 struct fuse_req *req; member
687 err = unlock_request(cs->req); in fuse_copy_fill()
738 return lock_request(cs->req); in fuse_copy_fill()
789 err = unlock_request(cs->req); in fuse_try_move_page()
846 spin_lock(&cs->req->waitq.lock); in fuse_try_move_page()
847 if (test_bit(FR_ABORTED, &cs->req->flags)) in fuse_try_move_page()
851 spin_unlock(&cs->req->waitq.lock); in fuse_try_move_page()
871 err = lock_request(cs->req); in fuse_try_move_page()
887 err = unlock_request(cs->req); in fuse_ref_page()
952 struct fuse_req *req = cs->req; in fuse_copy_pages() local
953 struct fuse_args_pages *ap = container_of(req->args, typeof(*ap), args); in fuse_copy_pages()
1023 size_t nbytes, struct fuse_req *req) in fuse_read_interrupt() argument
1031 list_del_init(&req->intr_entry); in fuse_read_interrupt()
1036 ih.unique = (req->in.h.unique | FUSE_INT_REQ_BIT); in fuse_read_interrupt()
1037 arg.unique = req->in.h.unique; in fuse_read_interrupt()
1183 struct fuse_req *req; in fuse_dev_do_read() local
1227 req = list_entry(fiq->interrupts.next, struct fuse_req, in fuse_dev_do_read()
1229 return fuse_read_interrupt(fiq, cs, nbytes, req); in fuse_dev_do_read()
1240 req = list_entry(fiq->pending.next, struct fuse_req, list); in fuse_dev_do_read()
1241 clear_bit(FR_PENDING, &req->flags); in fuse_dev_do_read()
1242 list_del_init(&req->list); in fuse_dev_do_read()
1245 args = req->args; in fuse_dev_do_read()
1246 reqsize = req->in.h.len; in fuse_dev_do_read()
1250 req->out.h.error = -EIO; in fuse_dev_do_read()
1253 req->out.h.error = -E2BIG; in fuse_dev_do_read()
1254 fuse_request_end(fc, req); in fuse_dev_do_read()
1258 list_add(&req->list, &fpq->io); in fuse_dev_do_read()
1260 cs->req = req; in fuse_dev_do_read()
1261 err = fuse_copy_one(cs, &req->in.h, sizeof(req->in.h)); in fuse_dev_do_read()
1267 clear_bit(FR_LOCKED, &req->flags); in fuse_dev_do_read()
1273 req->out.h.error = -EIO; in fuse_dev_do_read()
1276 if (!test_bit(FR_ISREPLY, &req->flags)) { in fuse_dev_do_read()
1280 hash = fuse_req_hash(req->in.h.unique); in fuse_dev_do_read()
1281 list_move_tail(&req->list, &fpq->processing[hash]); in fuse_dev_do_read()
1282 __fuse_get_request(req); in fuse_dev_do_read()
1283 set_bit(FR_SENT, &req->flags); in fuse_dev_do_read()
1287 if (test_bit(FR_INTERRUPTED, &req->flags)) in fuse_dev_do_read()
1288 queue_interrupt(fiq, req); in fuse_dev_do_read()
1289 fuse_put_request(fc, req); in fuse_dev_do_read()
1294 if (!test_bit(FR_PRIVATE, &req->flags)) in fuse_dev_do_read()
1295 list_del_init(&req->list); in fuse_dev_do_read()
1297 fuse_request_end(fc, req); in fuse_dev_do_read()
1786 struct fuse_req *req; in request_find() local
1788 list_for_each_entry(req, &fpq->processing[hash], list) { in request_find()
1789 if (req->in.h.unique == unique) in request_find()
1790 return req; in request_find()
1829 struct fuse_req *req; in fuse_dev_do_write() local
1858 req = NULL; in fuse_dev_do_write()
1860 req = request_find(fpq, oh.unique & ~FUSE_INT_REQ_BIT); in fuse_dev_do_write()
1863 if (!req) { in fuse_dev_do_write()
1870 __fuse_get_request(req); in fuse_dev_do_write()
1879 err = queue_interrupt(&fc->iq, req); in fuse_dev_do_write()
1881 fuse_put_request(fc, req); in fuse_dev_do_write()
1886 clear_bit(FR_SENT, &req->flags); in fuse_dev_do_write()
1887 list_move(&req->list, &fpq->io); in fuse_dev_do_write()
1888 req->out.h = oh; in fuse_dev_do_write()
1889 set_bit(FR_LOCKED, &req->flags); in fuse_dev_do_write()
1891 cs->req = req; in fuse_dev_do_write()
1892 if (!req->args->page_replace) in fuse_dev_do_write()
1898 err = copy_out_args(cs, req->args, nbytes); in fuse_dev_do_write()
1902 clear_bit(FR_LOCKED, &req->flags); in fuse_dev_do_write()
1906 req->out.h.error = -EIO; in fuse_dev_do_write()
1907 if (!test_bit(FR_PRIVATE, &req->flags)) in fuse_dev_do_write()
1908 list_del_init(&req->list); in fuse_dev_do_write()
1911 fuse_request_end(fc, req); in fuse_dev_do_write()
2046 struct fuse_req *req; in end_requests() local
2047 req = list_entry(head->next, struct fuse_req, list); in end_requests()
2048 req->out.h.error = -ECONNABORTED; in end_requests()
2049 clear_bit(FR_SENT, &req->flags); in end_requests()
2050 list_del_init(&req->list); in end_requests()
2051 fuse_request_end(fc, req); in end_requests()
2095 struct fuse_req *req, *next; in fuse_abort_conn() local
2110 list_for_each_entry_safe(req, next, &fpq->io, list) { in fuse_abort_conn()
2111 req->out.h.error = -ECONNABORTED; in fuse_abort_conn()
2112 spin_lock(&req->waitq.lock); in fuse_abort_conn()
2113 set_bit(FR_ABORTED, &req->flags); in fuse_abort_conn()
2114 if (!test_bit(FR_LOCKED, &req->flags)) { in fuse_abort_conn()
2115 set_bit(FR_PRIVATE, &req->flags); in fuse_abort_conn()
2116 __fuse_get_request(req); in fuse_abort_conn()
2117 list_move(&req->list, &to_end); in fuse_abort_conn()
2119 spin_unlock(&req->waitq.lock); in fuse_abort_conn()
2134 list_for_each_entry(req, &fiq->pending, list) in fuse_abort_conn()
2135 clear_bit(FR_PENDING, &req->flags); in fuse_abort_conn()