Lines Matching refs:rreq
26 struct netfs_io_request *rreq; in netfs_alloc_request() local
32 rreq = mempool_alloc(mempool, GFP_KERNEL); in netfs_alloc_request()
33 if (rreq) in netfs_alloc_request()
38 memset(rreq, 0, kmem_cache_size(cache)); in netfs_alloc_request()
39 INIT_WORK(&rreq->cleanup_work, netfs_free_request); in netfs_alloc_request()
40 rreq->start = start; in netfs_alloc_request()
41 rreq->len = len; in netfs_alloc_request()
42 rreq->origin = origin; in netfs_alloc_request()
43 rreq->netfs_ops = ctx->ops; in netfs_alloc_request()
44 rreq->mapping = mapping; in netfs_alloc_request()
45 rreq->inode = inode; in netfs_alloc_request()
46 rreq->i_size = i_size_read(inode); in netfs_alloc_request()
47 rreq->debug_id = atomic_inc_return(&debug_ids); in netfs_alloc_request()
48 rreq->wsize = INT_MAX; in netfs_alloc_request()
49 rreq->io_streams[0].sreq_max_len = ULONG_MAX; in netfs_alloc_request()
50 rreq->io_streams[0].sreq_max_segs = 0; in netfs_alloc_request()
51 spin_lock_init(&rreq->lock); in netfs_alloc_request()
52 INIT_LIST_HEAD(&rreq->io_streams[0].subrequests); in netfs_alloc_request()
53 INIT_LIST_HEAD(&rreq->io_streams[1].subrequests); in netfs_alloc_request()
54 init_waitqueue_head(&rreq->waitq); in netfs_alloc_request()
55 refcount_set(&rreq->ref, 2); in netfs_alloc_request()
64 INIT_WORK(&rreq->work, netfs_read_collection_worker); in netfs_alloc_request()
65 rreq->io_streams[0].avail = true; in netfs_alloc_request()
67 INIT_WORK(&rreq->work, netfs_write_collection_worker); in netfs_alloc_request()
70 __set_bit(NETFS_RREQ_IN_PROGRESS, &rreq->flags); in netfs_alloc_request()
71 if (rreq->netfs_ops->init_request) { in netfs_alloc_request()
72 ret = rreq->netfs_ops->init_request(rreq, file); in netfs_alloc_request()
74 mempool_free(rreq, rreq->netfs_ops->request_pool ?: &netfs_request_pool); in netfs_alloc_request()
80 trace_netfs_rreq_ref(rreq->debug_id, refcount_read(&rreq->ref), netfs_rreq_trace_new); in netfs_alloc_request()
81 netfs_proc_add_rreq(rreq); in netfs_alloc_request()
83 return rreq; in netfs_alloc_request()
86 void netfs_get_request(struct netfs_io_request *rreq, enum netfs_rreq_ref_trace what) in netfs_get_request() argument
90 __refcount_inc(&rreq->ref, &r); in netfs_get_request()
91 trace_netfs_rreq_ref(rreq->debug_id, r + 1, what); in netfs_get_request()
94 void netfs_clear_subrequests(struct netfs_io_request *rreq) in netfs_clear_subrequests() argument
100 for (s = 0; s < ARRAY_SIZE(rreq->io_streams); s++) { in netfs_clear_subrequests()
101 stream = &rreq->io_streams[s]; in netfs_clear_subrequests()
113 struct netfs_io_request *rreq = container_of(rcu, struct netfs_io_request, rcu); in netfs_free_request_rcu() local
115 mempool_free(rreq, rreq->netfs_ops->request_pool ?: &netfs_request_pool); in netfs_free_request_rcu()
119 static void netfs_deinit_request(struct netfs_io_request *rreq) in netfs_deinit_request() argument
121 struct netfs_inode *ictx = netfs_inode(rreq->inode); in netfs_deinit_request()
124 trace_netfs_rreq(rreq, netfs_rreq_trace_free); in netfs_deinit_request()
129 cancel_work_sync(&rreq->work); in netfs_deinit_request()
131 netfs_proc_del_rreq(rreq); in netfs_deinit_request()
132 netfs_clear_subrequests(rreq); in netfs_deinit_request()
133 if (rreq->netfs_ops->free_request) in netfs_deinit_request()
134 rreq->netfs_ops->free_request(rreq); in netfs_deinit_request()
135 if (rreq->cache_resources.ops) in netfs_deinit_request()
136 rreq->cache_resources.ops->end_operation(&rreq->cache_resources); in netfs_deinit_request()
137 if (rreq->direct_bv) { in netfs_deinit_request()
138 for (i = 0; i < rreq->direct_bv_count; i++) { in netfs_deinit_request()
139 if (rreq->direct_bv[i].bv_page) { in netfs_deinit_request()
140 if (rreq->direct_bv_unpin) in netfs_deinit_request()
141 unpin_user_page(rreq->direct_bv[i].bv_page); in netfs_deinit_request()
144 kvfree(rreq->direct_bv); in netfs_deinit_request()
146 rolling_buffer_clear(&rreq->buffer); in netfs_deinit_request()
154 struct netfs_io_request *rreq = in netfs_free_request() local
157 netfs_deinit_request(rreq); in netfs_free_request()
158 call_rcu(&rreq->rcu, netfs_free_request_rcu); in netfs_free_request()
161 void netfs_put_request(struct netfs_io_request *rreq, enum netfs_rreq_ref_trace what) in netfs_put_request() argument
167 if (rreq) { in netfs_put_request()
168 debug_id = rreq->debug_id; in netfs_put_request()
169 dead = __refcount_dec_and_test(&rreq->ref, &r); in netfs_put_request()
172 WARN_ON(!queue_work(system_dfl_wq, &rreq->cleanup_work)); in netfs_put_request()
180 void netfs_put_failed_request(struct netfs_io_request *rreq) in netfs_put_failed_request() argument
182 int r = refcount_read(&rreq->ref); in netfs_put_failed_request()
190 trace_netfs_rreq_ref(rreq->debug_id, r, netfs_rreq_trace_put_failed); in netfs_put_failed_request()
191 netfs_free_request(&rreq->cleanup_work); in netfs_put_failed_request()
197 struct netfs_io_subrequest *netfs_alloc_subrequest(struct netfs_io_request *rreq) in netfs_alloc_subrequest() argument
200 mempool_t *mempool = rreq->netfs_ops->subrequest_pool ?: &netfs_subrequest_pool; in netfs_alloc_subrequest()
204 subreq = mempool_alloc(rreq->netfs_ops->subrequest_pool ?: &netfs_subrequest_pool, in netfs_alloc_subrequest()
215 subreq->rreq = rreq; in netfs_alloc_subrequest()
216 subreq->debug_index = atomic_inc_return(&rreq->subreq_counter); in netfs_alloc_subrequest()
217 netfs_get_request(rreq, netfs_rreq_trace_get_subreq); in netfs_alloc_subrequest()
228 trace_netfs_sreq_ref(subreq->rreq->debug_id, subreq->debug_index, r + 1, in netfs_get_subrequest()
234 struct netfs_io_request *rreq = subreq->rreq; in netfs_free_subrequest() local
237 if (rreq->netfs_ops->free_subrequest) in netfs_free_subrequest()
238 rreq->netfs_ops->free_subrequest(subreq); in netfs_free_subrequest()
239 mempool_free(subreq, rreq->netfs_ops->subrequest_pool ?: &netfs_subrequest_pool); in netfs_free_subrequest()
241 netfs_put_request(rreq, netfs_rreq_trace_put_subreq); in netfs_free_subrequest()
248 unsigned int debug_id = subreq->rreq->debug_id; in netfs_put_subrequest()