Lines Matching full:nf
124 struct nfsd_file *nf = container_of(rcu, struct nfsd_file, nf_rcu); in nfsd_file_slab_free() local
126 put_cred(nf->nf_cred); in nfsd_file_slab_free()
127 kmem_cache_free(nfsd_file_slab, nf); in nfsd_file_slab_free()
157 nfsd_file_mark_find_or_create(struct nfsd_file *nf, struct inode *inode) in nfsd_file_mark_find_or_create() argument
215 struct nfsd_file *nf; in nfsd_file_alloc() local
217 nf = kmem_cache_alloc(nfsd_file_slab, GFP_KERNEL); in nfsd_file_alloc()
218 if (unlikely(!nf)) in nfsd_file_alloc()
221 INIT_LIST_HEAD(&nf->nf_lru); in nfsd_file_alloc()
222 INIT_LIST_HEAD(&nf->nf_gc); in nfsd_file_alloc()
223 nf->nf_birthtime = ktime_get(); in nfsd_file_alloc()
224 nf->nf_file = NULL; in nfsd_file_alloc()
225 nf->nf_cred = get_current_cred(); in nfsd_file_alloc()
226 nf->nf_net = net; in nfsd_file_alloc()
227 nf->nf_flags = want_gc ? in nfsd_file_alloc()
230 nf->nf_inode = inode; in nfsd_file_alloc()
231 refcount_set(&nf->nf_ref, 1); in nfsd_file_alloc()
232 nf->nf_may = need; in nfsd_file_alloc()
233 nf->nf_mark = NULL; in nfsd_file_alloc()
234 return nf; in nfsd_file_alloc()
239 * @nf: nfsd_file to check for writeback errors
245 nfsd_file_check_write_error(struct nfsd_file *nf) in nfsd_file_check_write_error() argument
247 struct file *file = nf->nf_file; in nfsd_file_check_write_error()
251 nfsd_reset_write_verifier(net_generic(nf->nf_net, nfsd_net_id)); in nfsd_file_check_write_error()
255 nfsd_file_hash_remove(struct nfsd_file *nf) in nfsd_file_hash_remove() argument
257 trace_nfsd_file_unhash(nf); in nfsd_file_hash_remove()
258 rhltable_remove(&nfsd_file_rhltable, &nf->nf_rlist, in nfsd_file_hash_remove()
263 nfsd_file_unhash(struct nfsd_file *nf) in nfsd_file_unhash() argument
265 if (test_and_clear_bit(NFSD_FILE_HASHED, &nf->nf_flags)) { in nfsd_file_unhash()
266 nfsd_file_hash_remove(nf); in nfsd_file_unhash()
273 nfsd_file_free(struct nfsd_file *nf) in nfsd_file_free() argument
275 s64 age = ktime_to_ms(ktime_sub(ktime_get(), nf->nf_birthtime)); in nfsd_file_free()
277 trace_nfsd_file_free(nf); in nfsd_file_free()
282 nfsd_file_unhash(nf); in nfsd_file_free()
283 if (nf->nf_mark) in nfsd_file_free()
284 nfsd_file_mark_put(nf->nf_mark); in nfsd_file_free()
285 if (nf->nf_file) { in nfsd_file_free()
286 nfsd_file_check_write_error(nf); in nfsd_file_free()
287 filp_close(nf->nf_file, NULL); in nfsd_file_free()
294 if (WARN_ON_ONCE(!list_empty(&nf->nf_lru))) in nfsd_file_free()
297 call_rcu(&nf->nf_rcu, nfsd_file_slab_free); in nfsd_file_free()
301 nfsd_file_check_writeback(struct nfsd_file *nf) in nfsd_file_check_writeback() argument
303 struct file *file = nf->nf_file; in nfsd_file_check_writeback()
323 static bool nfsd_file_lru_add(struct nfsd_file *nf) in nfsd_file_lru_add() argument
325 set_bit(NFSD_FILE_REFERENCED, &nf->nf_flags); in nfsd_file_lru_add()
326 if (list_lru_add(&nfsd_file_lru, &nf->nf_lru)) { in nfsd_file_lru_add()
327 trace_nfsd_file_lru_add(nf); in nfsd_file_lru_add()
333 static bool nfsd_file_lru_remove(struct nfsd_file *nf) in nfsd_file_lru_remove() argument
335 if (list_lru_del(&nfsd_file_lru, &nf->nf_lru)) { in nfsd_file_lru_remove()
336 trace_nfsd_file_lru_del(nf); in nfsd_file_lru_remove()
343 nfsd_file_get(struct nfsd_file *nf) in nfsd_file_get() argument
345 if (nf && refcount_inc_not_zero(&nf->nf_ref)) in nfsd_file_get()
346 return nf; in nfsd_file_get()
352 * @nf: nfsd_file of which to put the reference
359 nfsd_file_put(struct nfsd_file *nf) in nfsd_file_put() argument
362 trace_nfsd_file_put(nf); in nfsd_file_put()
364 if (test_bit(NFSD_FILE_GC, &nf->nf_flags) && in nfsd_file_put()
365 test_bit(NFSD_FILE_HASHED, &nf->nf_flags)) { in nfsd_file_put()
370 if (refcount_dec_not_one(&nf->nf_ref)) in nfsd_file_put()
374 if (nfsd_file_lru_add(nf)) { in nfsd_file_put()
376 if (test_bit(NFSD_FILE_HASHED, &nf->nf_flags)) { in nfsd_file_put()
386 if (!nfsd_file_lru_remove(nf)) in nfsd_file_put()
390 if (refcount_dec_and_test(&nf->nf_ref)) in nfsd_file_put()
391 nfsd_file_free(nf); in nfsd_file_put()
397 struct nfsd_file *nf; in nfsd_file_dispose_list() local
400 nf = list_first_entry(dispose, struct nfsd_file, nf_gc); in nfsd_file_dispose_list()
401 list_del_init(&nf->nf_gc); in nfsd_file_dispose_list()
402 nfsd_file_free(nf); in nfsd_file_dispose_list()
417 struct nfsd_file *nf = list_first_entry(dispose, in nfsd_file_dispose_list_delayed() local
419 struct nfsd_net *nn = net_generic(nf->nf_net, nfsd_net_id); in nfsd_file_dispose_list_delayed()
423 list_move_tail(&nf->nf_gc, &l->freeme); in nfsd_file_dispose_list_delayed()
448 struct nfsd_file *nf = list_entry(item, struct nfsd_file, nf_lru); in nfsd_file_lru_cb() local
451 WARN_ON_ONCE(!test_bit(NFSD_FILE_GC, &nf->nf_flags)); in nfsd_file_lru_cb()
457 if (nfsd_file_check_writeback(nf)) { in nfsd_file_lru_cb()
458 trace_nfsd_file_gc_writeback(nf); in nfsd_file_lru_cb()
463 if (test_and_clear_bit(NFSD_FILE_REFERENCED, &nf->nf_flags)) { in nfsd_file_lru_cb()
464 trace_nfsd_file_gc_referenced(nf); in nfsd_file_lru_cb()
472 if (!refcount_dec_and_test(&nf->nf_ref)) { in nfsd_file_lru_cb()
473 trace_nfsd_file_gc_in_use(nf); in nfsd_file_lru_cb()
474 list_lru_isolate(lru, &nf->nf_lru); in nfsd_file_lru_cb()
479 nfsd_file_unhash(nf); in nfsd_file_lru_cb()
480 list_lru_isolate(lru, &nf->nf_lru); in nfsd_file_lru_cb()
481 list_add(&nf->nf_gc, head); in nfsd_file_lru_cb()
483 trace_nfsd_file_gc_disposed(nf); in nfsd_file_lru_cb()
534 * @nf: nfsd_file to attempt to queue
541 nfsd_file_cond_queue(struct nfsd_file *nf, struct list_head *dispose) in nfsd_file_cond_queue() argument
547 if (!nfsd_file_unhash(nf)) in nfsd_file_cond_queue()
551 if (!nfsd_file_get(nf)) in nfsd_file_cond_queue()
555 if (nfsd_file_lru_remove(nf)) in nfsd_file_cond_queue()
559 if (refcount_sub_and_test(decrement, &nf->nf_ref)) { in nfsd_file_cond_queue()
560 list_add(&nf->nf_gc, dispose); in nfsd_file_cond_queue()
561 trace_nfsd_file_closing(nf); in nfsd_file_cond_queue()
585 struct nfsd_file *nf; in nfsd_file_queue_for_close() local
590 rhl_for_each_entry_rcu(nf, tmp, list, nf_rlist) { in nfsd_file_queue_for_close()
591 if (!test_bit(NFSD_FILE_GC, &nf->nf_flags)) in nfsd_file_queue_for_close()
593 nfsd_file_cond_queue(nf, dispose); in nfsd_file_queue_for_close()
629 struct nfsd_file *nf; in nfsd_file_close_inode_sync() local
636 nf = list_first_entry(&dispose, struct nfsd_file, nf_gc); in nfsd_file_close_inode_sync()
637 list_del_init(&nf->nf_gc); in nfsd_file_close_inode_sync()
638 nfsd_file_free(nf); in nfsd_file_close_inode_sync()
807 struct nfsd_file *nf; in __nfsd_file_cache_purge() local
814 nf = rhashtable_walk_next(&iter); in __nfsd_file_cache_purge()
815 while (!IS_ERR_OR_NULL(nf)) { in __nfsd_file_cache_purge()
816 if (!net || nf->nf_net == net) in __nfsd_file_cache_purge()
817 nfsd_file_cond_queue(nf, &dispose); in __nfsd_file_cache_purge()
818 nf = rhashtable_walk_next(&iter); in __nfsd_file_cache_purge()
822 } while (nf == ERR_PTR(-EAGAIN)); in __nfsd_file_cache_purge()
933 struct nfsd_file *nf; in nfsd_file_lookup_locked() local
937 rhl_for_each_entry_rcu(nf, tmp, list, nf_rlist) { in nfsd_file_lookup_locked()
938 if (nf->nf_may != need) in nfsd_file_lookup_locked()
940 if (nf->nf_net != net) in nfsd_file_lookup_locked()
942 if (!nfsd_match_cred(nf->nf_cred, cred)) in nfsd_file_lookup_locked()
944 if (test_bit(NFSD_FILE_GC, &nf->nf_flags) != want_gc) in nfsd_file_lookup_locked()
946 if (test_bit(NFSD_FILE_HASHED, &nf->nf_flags) == 0) in nfsd_file_lookup_locked()
949 if (!nfsd_file_get(nf)) in nfsd_file_lookup_locked()
951 return nf; in nfsd_file_lookup_locked()
971 struct nfsd_file *nf; in nfsd_file_is_cached() local
977 rhl_for_each_entry_rcu(nf, tmp, list, nf_rlist) in nfsd_file_is_cached()
978 if (test_bit(NFSD_FILE_GC, &nf->nf_flags)) { in nfsd_file_is_cached()
995 struct nfsd_file *new, *nf; in nfsd_file_do_acquire() local
1010 nf = nfsd_file_lookup_locked(net, current_cred(), inode, need, want_gc); in nfsd_file_do_acquire()
1013 if (nf) { in nfsd_file_do_acquire()
1015 * If the nf is on the LRU then it holds an extra reference in nfsd_file_do_acquire()
1019 if (nfsd_file_lru_remove(nf)) in nfsd_file_do_acquire()
1020 WARN_ON_ONCE(refcount_dec_and_test(&nf->nf_ref)); in nfsd_file_do_acquire()
1032 nf = nfsd_file_lookup_locked(net, current_cred(), inode, need, want_gc); in nfsd_file_do_acquire()
1033 if (unlikely(nf)) { in nfsd_file_do_acquire()
1039 nf = new; in nfsd_file_do_acquire()
1040 ret = rhltable_insert(&nfsd_file_rhltable, &nf->nf_rlist, in nfsd_file_do_acquire()
1052 wait_on_bit(&nf->nf_flags, NFSD_FILE_PENDING, TASK_UNINTERRUPTIBLE); in nfsd_file_do_acquire()
1055 if (!test_bit(NFSD_FILE_HASHED, &nf->nf_flags)) { in nfsd_file_do_acquire()
1056 trace_nfsd_file_cons_err(rqstp, inode, may_flags, nf); in nfsd_file_do_acquire()
1061 nfsd_file_put(nf); in nfsd_file_do_acquire()
1068 status = nfserrno(nfsd_open_break_lease(file_inode(nf->nf_file), may_flags)); in nfsd_file_do_acquire()
1070 nfsd_file_put(nf); in nfsd_file_do_acquire()
1071 nf = NULL; in nfsd_file_do_acquire()
1077 nfsd_file_check_write_error(nf); in nfsd_file_do_acquire()
1078 *pnf = nf; in nfsd_file_do_acquire()
1080 trace_nfsd_file_acquire(rqstp, inode, may_flags, nf, status); in nfsd_file_do_acquire()
1084 trace_nfsd_file_alloc(nf); in nfsd_file_do_acquire()
1085 nf->nf_mark = nfsd_file_mark_find_or_create(nf, inode); in nfsd_file_do_acquire()
1086 if (nf->nf_mark) { in nfsd_file_do_acquire()
1089 nf->nf_file = file; in nfsd_file_do_acquire()
1091 trace_nfsd_file_opened(nf, status); in nfsd_file_do_acquire()
1094 &nf->nf_file); in nfsd_file_do_acquire()
1097 nfsd_file_unhash(nf); in nfsd_file_do_acquire()
1099 &nf->nf_flags); in nfsd_file_do_acquire()
1100 if (refcount_dec_and_test(&nf->nf_ref)) in nfsd_file_do_acquire()
1101 nfsd_file_free(nf); in nfsd_file_do_acquire()
1102 nf = NULL; in nfsd_file_do_acquire()
1107 trace_nfsd_file_open(nf, status); in nfsd_file_do_acquire()
1116 nfsd_file_unhash(nf); in nfsd_file_do_acquire()
1117 clear_and_wake_up_bit(NFSD_FILE_PENDING, &nf->nf_flags); in nfsd_file_do_acquire()
1122 if (refcount_dec_and_test(&nf->nf_ref)) in nfsd_file_do_acquire()
1123 nfsd_file_free(nf); in nfsd_file_do_acquire()
1124 nf = NULL; in nfsd_file_do_acquire()