Lines Matching refs:fc
134 void fuse_set_initialized(struct fuse_conn *fc) in fuse_set_initialized() argument
138 fc->initialized = 1; in fuse_set_initialized()
141 static bool fuse_block_alloc(struct fuse_conn *fc, bool for_background) in fuse_block_alloc() argument
143 return !fc->initialized || (for_background && fc->blocked); in fuse_block_alloc()
146 static struct fuse_req *__fuse_get_req(struct fuse_conn *fc, unsigned npages, in __fuse_get_req() argument
151 atomic_inc(&fc->num_waiting); in __fuse_get_req()
153 if (fuse_block_alloc(fc, for_background)) { in __fuse_get_req()
158 intr = wait_event_interruptible_exclusive(fc->blocked_waitq, in __fuse_get_req()
159 !fuse_block_alloc(fc, for_background)); in __fuse_get_req()
169 if (!fc->connected) in __fuse_get_req()
173 if (fc->conn_error) in __fuse_get_req()
180 wake_up(&fc->blocked_waitq); in __fuse_get_req()
192 atomic_dec(&fc->num_waiting); in __fuse_get_req()
196 struct fuse_req *fuse_get_req(struct fuse_conn *fc, unsigned npages) in fuse_get_req() argument
198 return __fuse_get_req(fc, npages, false); in fuse_get_req()
202 struct fuse_req *fuse_get_req_for_background(struct fuse_conn *fc, in fuse_get_req_for_background() argument
205 return __fuse_get_req(fc, npages, true); in fuse_get_req_for_background()
214 static struct fuse_req *get_reserved_req(struct fuse_conn *fc, in get_reserved_req() argument
221 wait_event(fc->reserved_req_waitq, ff->reserved_req); in get_reserved_req()
222 spin_lock(&fc->lock); in get_reserved_req()
228 spin_unlock(&fc->lock); in get_reserved_req()
237 static void put_reserved_req(struct fuse_conn *fc, struct fuse_req *req) in put_reserved_req() argument
242 spin_lock(&fc->lock); in put_reserved_req()
246 wake_up_all(&fc->reserved_req_waitq); in put_reserved_req()
247 spin_unlock(&fc->lock); in put_reserved_req()
264 struct fuse_req *fuse_get_req_nofail_nopages(struct fuse_conn *fc, in fuse_get_req_nofail_nopages() argument
269 atomic_inc(&fc->num_waiting); in fuse_get_req_nofail_nopages()
270 wait_event(fc->blocked_waitq, fc->initialized); in fuse_get_req_nofail_nopages()
275 req = get_reserved_req(fc, file); in fuse_get_req_nofail_nopages()
283 void fuse_put_request(struct fuse_conn *fc, struct fuse_req *req) in fuse_put_request() argument
291 spin_lock(&fc->lock); in fuse_put_request()
292 if (!fc->blocked) in fuse_put_request()
293 wake_up(&fc->blocked_waitq); in fuse_put_request()
294 spin_unlock(&fc->lock); in fuse_put_request()
299 atomic_dec(&fc->num_waiting); in fuse_put_request()
303 put_reserved_req(fc, req); in fuse_put_request()
335 void fuse_queue_forget(struct fuse_conn *fc, struct fuse_forget_link *forget, in fuse_queue_forget() argument
338 struct fuse_iqueue *fiq = &fc->iq; in fuse_queue_forget()
355 static void flush_bg_queue(struct fuse_conn *fc) in flush_bg_queue() argument
357 while (fc->active_background < fc->max_background && in flush_bg_queue()
358 !list_empty(&fc->bg_queue)) { in flush_bg_queue()
360 struct fuse_iqueue *fiq = &fc->iq; in flush_bg_queue()
362 req = list_entry(fc->bg_queue.next, struct fuse_req, list); in flush_bg_queue()
364 fc->active_background++; in flush_bg_queue()
380 static void request_end(struct fuse_conn *fc, struct fuse_req *req) in request_end() argument
382 struct fuse_iqueue *fiq = &fc->iq; in request_end()
393 spin_lock(&fc->lock); in request_end()
395 if (fc->num_background == fc->max_background) in request_end()
396 fc->blocked = 0; in request_end()
399 if (!fc->blocked && waitqueue_active(&fc->blocked_waitq)) in request_end()
400 wake_up(&fc->blocked_waitq); in request_end()
402 if (fc->num_background == fc->congestion_threshold && in request_end()
403 fc->connected && fc->bdi_initialized) { in request_end()
404 clear_bdi_congested(&fc->bdi, BLK_RW_SYNC); in request_end()
405 clear_bdi_congested(&fc->bdi, BLK_RW_ASYNC); in request_end()
407 fc->num_background--; in request_end()
408 fc->active_background--; in request_end()
409 flush_bg_queue(fc); in request_end()
410 spin_unlock(&fc->lock); in request_end()
414 req->end(fc, req); in request_end()
415 fuse_put_request(fc, req); in request_end()
429 static void request_wait_answer(struct fuse_conn *fc, struct fuse_req *req) in request_wait_answer() argument
431 struct fuse_iqueue *fiq = &fc->iq; in request_wait_answer()
434 if (!fc->no_interrupt) { in request_wait_answer()
479 static void __fuse_request_send(struct fuse_conn *fc, struct fuse_req *req) in __fuse_request_send() argument
481 struct fuse_iqueue *fiq = &fc->iq; 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
507 atomic_inc(&fc->num_waiting); in fuse_request_send()
509 __fuse_request_send(fc, req); in fuse_request_send()
513 static void fuse_adjust_compat(struct fuse_conn *fc, struct fuse_args *args) in fuse_adjust_compat() argument
515 if (fc->minor < 4 && args->in.h.opcode == FUSE_STATFS) in fuse_adjust_compat()
518 if (fc->minor < 9) { in fuse_adjust_compat()
534 if (fc->minor < 12) { in fuse_adjust_compat()
546 ssize_t fuse_simple_request(struct fuse_conn *fc, struct fuse_args *args) in fuse_simple_request() argument
551 req = fuse_get_req(fc, 0); in fuse_simple_request()
556 fuse_adjust_compat(fc, args); in fuse_simple_request()
567 fuse_request_send(fc, req); in fuse_simple_request()
573 fuse_put_request(fc, req); in fuse_simple_request()
583 void fuse_request_send_background_locked(struct fuse_conn *fc, in fuse_request_send_background_locked() argument
589 atomic_inc(&fc->num_waiting); in fuse_request_send_background_locked()
592 fc->num_background++; in fuse_request_send_background_locked()
593 if (fc->num_background == fc->max_background) in fuse_request_send_background_locked()
594 fc->blocked = 1; in fuse_request_send_background_locked()
595 if (fc->num_background == fc->congestion_threshold && in fuse_request_send_background_locked()
596 fc->bdi_initialized) { in fuse_request_send_background_locked()
597 set_bdi_congested(&fc->bdi, BLK_RW_SYNC); in fuse_request_send_background_locked()
598 set_bdi_congested(&fc->bdi, BLK_RW_ASYNC); in fuse_request_send_background_locked()
600 list_add_tail(&req->list, &fc->bg_queue); in fuse_request_send_background_locked()
601 flush_bg_queue(fc); 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
607 spin_lock(&fc->lock); in fuse_request_send_background()
608 if (fc->connected) { in fuse_request_send_background()
609 fuse_request_send_background_locked(fc, req); in fuse_request_send_background()
610 spin_unlock(&fc->lock); in fuse_request_send_background()
612 spin_unlock(&fc->lock); 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()
620 static int fuse_request_send_notify_reply(struct fuse_conn *fc, in fuse_request_send_notify_reply() argument
624 struct fuse_iqueue *fiq = &fc->iq; in fuse_request_send_notify_reply()
641 struct fuse_conn *fc = get_fuse_conn(inode); in fuse_force_forget() local
647 req = fuse_get_req_nofail_nopages(fc, file); in fuse_force_forget()
654 __fuse_request_send(fc, req); in fuse_force_forget()
656 fuse_put_request(fc, req); in fuse_force_forget()
1215 static int fuse_read_forget(struct fuse_conn *fc, struct fuse_iqueue *fiq, in fuse_read_forget() argument
1220 if (fc->minor < 16 || fiq->forget_list_head.next->next == NULL) in fuse_read_forget()
1239 struct fuse_conn *fc = fud->fc; in fuse_dev_do_read() local
1240 struct fuse_iqueue *fiq = &fc->iq; in fuse_dev_do_read()
1270 return fuse_read_forget(fc, fiq, cs, nbytes); in fuse_dev_do_read()
1289 request_end(fc, req); in fuse_dev_do_read()
1329 request_end(fc, req); in fuse_dev_do_read()
1444 static int fuse_notify_poll(struct fuse_conn *fc, unsigned int size, in fuse_notify_poll() argument
1458 return fuse_notify_poll_wakeup(fc, &outarg); in fuse_notify_poll()
1465 static int fuse_notify_inval_inode(struct fuse_conn *fc, unsigned int size, in fuse_notify_inval_inode() argument
1479 down_read(&fc->killsb); in fuse_notify_inval_inode()
1481 if (fc->sb) { in fuse_notify_inval_inode()
1482 err = fuse_reverse_inval_inode(fc->sb, outarg.ino, in fuse_notify_inval_inode()
1485 up_read(&fc->killsb); in fuse_notify_inval_inode()
1493 static int fuse_notify_inval_entry(struct fuse_conn *fc, unsigned int size, in fuse_notify_inval_entry() argument
1530 down_read(&fc->killsb); in fuse_notify_inval_entry()
1532 if (fc->sb) in fuse_notify_inval_entry()
1533 err = fuse_reverse_inval_entry(fc->sb, outarg.parent, 0, &name); in fuse_notify_inval_entry()
1534 up_read(&fc->killsb); in fuse_notify_inval_entry()
1544 static int fuse_notify_delete(struct fuse_conn *fc, unsigned int size, in fuse_notify_delete() argument
1581 down_read(&fc->killsb); in fuse_notify_delete()
1583 if (fc->sb) in fuse_notify_delete()
1584 err = fuse_reverse_inval_entry(fc->sb, outarg.parent, in fuse_notify_delete()
1586 up_read(&fc->killsb); in fuse_notify_delete()
1596 static int fuse_notify_store(struct fuse_conn *fc, unsigned int size, in fuse_notify_store() argument
1624 down_read(&fc->killsb); in fuse_notify_store()
1627 if (!fc->sb) in fuse_notify_store()
1630 inode = ilookup5(fc->sb, nodeid, fuse_inode_eq, &nodeid); in fuse_notify_store()
1676 up_read(&fc->killsb); in fuse_notify_store()
1682 static void fuse_retrieve_end(struct fuse_conn *fc, struct fuse_req *req) in fuse_retrieve_end() argument
1687 static int fuse_retrieve(struct fuse_conn *fc, struct inode *inode, in fuse_retrieve() argument
1712 req = fuse_get_req(fc, num_pages); 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()
1756 static int fuse_notify_retrieve(struct fuse_conn *fc, unsigned int size, in fuse_notify_retrieve() argument
1773 down_read(&fc->killsb); in fuse_notify_retrieve()
1775 if (fc->sb) { in fuse_notify_retrieve()
1778 inode = ilookup5(fc->sb, nodeid, fuse_inode_eq, &nodeid); in fuse_notify_retrieve()
1780 err = fuse_retrieve(fc, inode, &outarg); in fuse_notify_retrieve()
1784 up_read(&fc->killsb); in fuse_notify_retrieve()
1793 static int fuse_notify(struct fuse_conn *fc, enum fuse_notify_code code, in fuse_notify() argument
1801 return fuse_notify_poll(fc, size, cs); in fuse_notify()
1804 return fuse_notify_inval_inode(fc, size, cs); in fuse_notify()
1807 return fuse_notify_inval_entry(fc, size, cs); in fuse_notify()
1810 return fuse_notify_store(fc, size, cs); in fuse_notify()
1813 return fuse_notify_retrieve(fc, size, cs); in fuse_notify()
1816 return fuse_notify_delete(fc, size, cs); in fuse_notify()
1870 struct fuse_conn *fc = fud->fc; in fuse_dev_do_write() local
1891 err = fuse_notify(fc, oh.error, nbytes - sizeof(oh), cs); in fuse_dev_do_write()
1917 fc->no_interrupt = 1; in fuse_dev_do_write()
1919 queue_interrupt(&fc->iq, req); in fuse_dev_do_write()
1947 request_end(fc, req); in fuse_dev_do_write()
2062 fiq = &fud->fc->iq; in fuse_dev_poll()
2080 static void end_requests(struct fuse_conn *fc, struct list_head *head) in end_requests() argument
2089 request_end(fc, req); in end_requests()
2093 static void end_polls(struct fuse_conn *fc) in end_polls() argument
2097 p = rb_first(&fc->polled_files); in end_polls()
2126 void fuse_abort_conn(struct fuse_conn *fc) in fuse_abort_conn() argument
2128 struct fuse_iqueue *fiq = &fc->iq; in fuse_abort_conn()
2130 spin_lock(&fc->lock); in fuse_abort_conn()
2131 if (fc->connected) { in fuse_abort_conn()
2137 fc->connected = 0; in fuse_abort_conn()
2138 fc->blocked = 0; in fuse_abort_conn()
2139 fuse_set_initialized(fc); in fuse_abort_conn()
2140 list_for_each_entry(fud, &fc->devices, entry) { in fuse_abort_conn()
2158 fc->max_background = UINT_MAX; in fuse_abort_conn()
2159 flush_bg_queue(fc); in fuse_abort_conn()
2169 end_polls(fc); in fuse_abort_conn()
2170 wake_up_all(&fc->blocked_waitq); in fuse_abort_conn()
2171 spin_unlock(&fc->lock); in fuse_abort_conn()
2177 request_end(fc, req); in fuse_abort_conn()
2179 end_requests(fc, &to_end2); in fuse_abort_conn()
2181 spin_unlock(&fc->lock); in fuse_abort_conn()
2191 struct fuse_conn *fc = fud->fc; in fuse_dev_release() local
2195 end_requests(fc, &fpq->processing); in fuse_dev_release()
2197 if (atomic_dec_and_test(&fc->dev_count)) { in fuse_dev_release()
2198 WARN_ON(fc->iq.fasync != NULL); in fuse_dev_release()
2199 fuse_abort_conn(fc); in fuse_dev_release()
2215 return fasync_helper(fd, file, on, &fud->fc->iq.fasync); in fuse_dev_fasync()
2218 static int fuse_device_clone(struct fuse_conn *fc, struct file *new) in fuse_device_clone() argument
2225 fud = fuse_dev_alloc(fc); in fuse_device_clone()
2230 atomic_inc(&fc->dev_count); in fuse_device_clone()
2261 err = fuse_device_clone(fud->fc, file); in fuse_dev_ioctl()