Lines Matching +full:key +full:- +full:release

1 // SPDX-License-Identifier: GPL-2.0-or-later
34 .release = afs_release,
72 * Discard a pin on a writeback key.
76 if (wbk && refcount_dec_and_test(&wbk->usage)) { in afs_put_wb_key()
77 key_put(wbk->key); in afs_put_wb_key()
83 * Cache key for writeback.
91 return -ENOMEM; in afs_cache_wb_key()
92 refcount_set(&wbk->usage, 2); in afs_cache_wb_key()
93 wbk->key = af->key; in afs_cache_wb_key()
95 spin_lock(&vnode->wb_lock); in afs_cache_wb_key()
96 list_for_each_entry(p, &vnode->wb_keys, vnode_link) { in afs_cache_wb_key()
97 if (p->key == wbk->key) in afs_cache_wb_key()
101 key_get(wbk->key); in afs_cache_wb_key()
102 list_add_tail(&wbk->vnode_link, &vnode->wb_keys); in afs_cache_wb_key()
103 spin_unlock(&vnode->wb_lock); in afs_cache_wb_key()
104 af->wb = wbk; in afs_cache_wb_key()
108 refcount_inc(&p->usage); in afs_cache_wb_key()
109 spin_unlock(&vnode->wb_lock); in afs_cache_wb_key()
110 af->wb = p; in afs_cache_wb_key()
116 * open an AFS file or directory and attach a key to it
122 struct key *key; in afs_open() local
125 _enter("{%llx:%llu},", vnode->fid.vid, vnode->fid.vnode); in afs_open()
127 key = afs_request_key(vnode->volume->cell); in afs_open()
128 if (IS_ERR(key)) { in afs_open()
129 ret = PTR_ERR(key); in afs_open()
135 ret = -ENOMEM; in afs_open()
138 af->key = key; in afs_open()
140 ret = afs_validate(vnode, key); in afs_open()
144 if (file->f_mode & FMODE_WRITE) { in afs_open()
150 if (file->f_flags & O_TRUNC) in afs_open()
151 set_bit(AFS_VNODE_NEW_CONTENT, &vnode->flags); in afs_open()
153 fscache_use_cookie(afs_vnode_cache(vnode), file->f_mode & FMODE_WRITE); in afs_open()
155 file->private_data = af; in afs_open()
162 key_put(key); in afs_open()
169 * release an AFS file or directory and discard its key
175 struct afs_file *af = file->private_data; in afs_release()
179 _enter("{%llx:%llu},", vnode->fid.vid, vnode->fid.vnode); in afs_release()
181 if ((file->f_mode & FMODE_WRITE)) in afs_release()
184 file->private_data = NULL; in afs_release()
185 if (af->wb) in afs_release()
186 afs_put_wb_key(af->wb); in afs_release()
188 if ((file->f_mode & FMODE_WRITE)) { in afs_release()
189 i_size = i_size_read(&vnode->netfs.inode); in afs_release()
196 key_put(af->key); in afs_release()
205 struct netfs_io_subrequest *subreq = op->fetch.subreq; in afs_fetch_data_notify()
207 subreq->error = afs_op_error(op); in afs_fetch_data_notify()
213 struct afs_vnode *vnode = op->file[0].vnode; in afs_fetch_data_success()
215 _enter("op=%08x", op->debug_id); in afs_fetch_data_success()
216 afs_vnode_commit_status(op, &op->file[0]); in afs_fetch_data_success()
218 atomic_long_add(op->fetch.subreq->transferred, &op->net->n_fetch_bytes); in afs_fetch_data_success()
238 op->call_responded = false; in afs_issue_read_call()
239 op->call_error = 0; in afs_issue_read_call()
240 op->call_abort_code = 0; in afs_issue_read_call()
241 if (test_bit(AFS_SERVER_FL_IS_YFS, &op->server->flags)) in afs_issue_read_call()
249 if (op->call_responded && op->server) in afs_end_read()
250 set_bit(AFS_SERVER_FL_RESPONDING, &op->server->flags); in afs_end_read()
254 else if (op->cumul_error.aborted) in afs_end_read()
265 * to the call struct that we either need to release or to pass on.
269 struct afs_operation *op = call->op; in afs_read_receive()
274 state = READ_ONCE(call->state); in afs_read_receive()
279 while (state < AFS_CALL_COMPLETE && READ_ONCE(call->need_attention)) { in afs_read_receive()
280 WRITE_ONCE(call->need_attention, false); in afs_read_receive()
282 state = READ_ONCE(call->state); in afs_read_receive()
286 netfs_read_subreq_progress(op->fetch.subreq); in afs_read_receive()
287 if (rxrpc_kernel_check_life(call->net->socket, call->rxcall)) in afs_read_receive()
290 afs_set_call_complete(call, call->error, call->abort_code); in afs_read_receive()
293 op->call_abort_code = call->abort_code; in afs_read_receive()
294 op->call_error = call->error; in afs_read_receive()
295 op->call_responded = call->responded; in afs_read_receive()
296 op->call = NULL; in afs_read_receive()
297 call->op = NULL; in afs_read_receive()
321 if (call->async) { in afs_fetch_data_immediate_cancel()
323 if (!queue_work(afs_async_calls, &call->async_work)) in afs_fetch_data_immediate_cancel()
325 flush_work(&call->async_work); in afs_fetch_data_immediate_cancel()
335 struct afs_vnode *vnode = AFS_FS_I(subreq->rreq->inode); in afs_issue_read()
336 struct key *key = subreq->rreq->netfs_priv; in afs_issue_read() local
339 vnode->volume->name, in afs_issue_read()
340 vnode->fid.vid, in afs_issue_read()
341 vnode->fid.vnode, in afs_issue_read()
342 vnode->fid.unique, in afs_issue_read()
343 key_serial(key)); in afs_issue_read()
345 op = afs_alloc_operation(key, vnode->volume); in afs_issue_read()
347 subreq->error = PTR_ERR(op); in afs_issue_read()
354 op->fetch.subreq = subreq; in afs_issue_read()
355 op->ops = &afs_fetch_data_operation; in afs_issue_read()
359 if (subreq->rreq->origin == NETFS_READAHEAD || in afs_issue_read()
360 subreq->rreq->iocb) { in afs_issue_read()
361 op->flags |= AFS_OPERATION_ASYNC; in afs_issue_read()
364 subreq->error = afs_put_operation(op); in afs_issue_read()
382 struct afs_vnode *vnode = AFS_FS_I(rreq->inode); in afs_init_request()
385 rreq->netfs_priv = key_get(afs_file_key(file)); in afs_init_request()
386 rreq->rsize = 256 * 1024; in afs_init_request()
387 rreq->wsize = 256 * 1024 * 1024; in afs_init_request()
389 switch (rreq->origin) { in afs_init_request()
392 struct key *key = afs_request_key(vnode->volume->cell); in afs_init_request() local
394 if (IS_ERR(key)) in afs_init_request()
395 return PTR_ERR(key); in afs_init_request()
396 rreq->netfs_priv = key; in afs_init_request()
403 if (S_ISREG(rreq->inode->i_mode)) in afs_init_request()
404 rreq->io_streams[0].avail = true; in afs_init_request()
418 return test_bit(AFS_VNODE_DELETED, &vnode->flags) ? -ESTALE : 0; in afs_check_write_begin()
423 key_put(rreq->netfs_priv); in afs_free_request()
424 afs_put_wb_key(rreq->netfs_priv2); in afs_free_request()
432 write_seqlock(&vnode->cb_lock); in afs_update_i_size()
433 i_size = i_size_read(&vnode->netfs.inode); in afs_update_i_size()
435 i_size_write(&vnode->netfs.inode, new_i_size); in afs_update_i_size()
436 inode_set_bytes(&vnode->netfs.inode, new_i_size); in afs_update_i_size()
438 write_sequnlock(&vnode->cb_lock); in afs_update_i_size()
444 struct afs_vnode *vnode = AFS_FS_I(wreq->inode); in afs_netfs_invalidate_cache()
464 if (atomic_inc_return(&vnode->cb_nr_mmap) == 1) { in afs_add_open_mmap()
465 down_write(&vnode->volume->open_mmaps_lock); in afs_add_open_mmap()
467 if (list_empty(&vnode->cb_mmap_link)) in afs_add_open_mmap()
468 list_add_tail(&vnode->cb_mmap_link, &vnode->volume->open_mmaps); in afs_add_open_mmap()
470 up_write(&vnode->volume->open_mmaps_lock); in afs_add_open_mmap()
476 if (atomic_add_unless(&vnode->cb_nr_mmap, -1, 1)) in afs_drop_open_mmap()
479 down_write(&vnode->volume->open_mmaps_lock); in afs_drop_open_mmap()
481 read_seqlock_excl(&vnode->cb_lock); in afs_drop_open_mmap()
482 // the only place where ->cb_nr_mmap may hit 0 in afs_drop_open_mmap()
484 if (atomic_dec_and_test(&vnode->cb_nr_mmap)) in afs_drop_open_mmap()
485 list_del_init(&vnode->cb_mmap_link); in afs_drop_open_mmap()
486 read_sequnlock_excl(&vnode->cb_lock); in afs_drop_open_mmap()
488 up_write(&vnode->volume->open_mmaps_lock); in afs_drop_open_mmap()
489 flush_work(&vnode->cb_work); in afs_drop_open_mmap()
504 vma->vm_ops = &afs_vm_ops; in afs_file_mmap()
512 afs_add_open_mmap(AFS_FS_I(file_inode(vma->vm_file))); in afs_vm_open()
517 afs_drop_open_mmap(AFS_FS_I(file_inode(vma->vm_file))); in afs_vm_close()
522 struct afs_vnode *vnode = AFS_FS_I(file_inode(vmf->vma->vm_file)); in afs_vm_map_pages()
531 struct inode *inode = file_inode(iocb->ki_filp); in afs_file_read_iter()
533 struct afs_file *af = iocb->ki_filp->private_data; in afs_file_read_iter()
536 if (iocb->ki_flags & IOCB_DIRECT) in afs_file_read_iter()
542 ret = afs_validate(vnode, af->key); in afs_file_read_iter()
555 struct afs_file *af = in->private_data; in afs_file_splice_read()
561 ret = afs_validate(vnode, af->key); in afs_file_splice_read()