Lines Matching refs:nf
111 const struct nfsd_file *nf = data; in nfsd_file_obj_hashfn() local
113 return nfsd_file_inode_hash(nf->nf_inode, seed); in nfsd_file_obj_hashfn()
149 const struct nfsd_file *nf = ptr; in nfsd_file_obj_cmpfn() local
153 if (nf->nf_inode != key->inode) in nfsd_file_obj_cmpfn()
157 if (nf->nf_inode != key->inode) in nfsd_file_obj_cmpfn()
159 if (nf->nf_may != key->need) in nfsd_file_obj_cmpfn()
161 if (nf->nf_net != key->net) in nfsd_file_obj_cmpfn()
163 if (!nfsd_match_cred(nf->nf_cred, key->cred)) in nfsd_file_obj_cmpfn()
165 if (test_bit(NFSD_FILE_HASHED, &nf->nf_flags) == 0) in nfsd_file_obj_cmpfn()
198 struct nfsd_file *nf = container_of(rcu, struct nfsd_file, nf_rcu); in nfsd_file_slab_free() local
200 put_cred(nf->nf_cred); in nfsd_file_slab_free()
201 kmem_cache_free(nfsd_file_slab, nf); in nfsd_file_slab_free()
231 nfsd_file_mark_find_or_create(struct nfsd_file *nf, struct inode *inode) in nfsd_file_mark_find_or_create() argument
288 struct nfsd_file *nf; in nfsd_file_alloc() local
290 nf = kmem_cache_alloc(nfsd_file_slab, GFP_KERNEL); in nfsd_file_alloc()
291 if (nf) { in nfsd_file_alloc()
292 INIT_LIST_HEAD(&nf->nf_lru); in nfsd_file_alloc()
293 nf->nf_birthtime = ktime_get(); in nfsd_file_alloc()
294 nf->nf_file = NULL; in nfsd_file_alloc()
295 nf->nf_cred = get_current_cred(); in nfsd_file_alloc()
296 nf->nf_net = key->net; in nfsd_file_alloc()
297 nf->nf_flags = 0; in nfsd_file_alloc()
298 __set_bit(NFSD_FILE_HASHED, &nf->nf_flags); in nfsd_file_alloc()
299 __set_bit(NFSD_FILE_PENDING, &nf->nf_flags); in nfsd_file_alloc()
300 nf->nf_inode = key->inode; in nfsd_file_alloc()
302 refcount_set(&nf->nf_ref, 2); in nfsd_file_alloc()
303 nf->nf_may = key->need; in nfsd_file_alloc()
304 nf->nf_mark = NULL; in nfsd_file_alloc()
306 return nf; in nfsd_file_alloc()
310 nfsd_file_free(struct nfsd_file *nf) in nfsd_file_free() argument
312 s64 age = ktime_to_ms(ktime_sub(ktime_get(), nf->nf_birthtime)); in nfsd_file_free()
318 trace_nfsd_file_put_final(nf); in nfsd_file_free()
319 if (nf->nf_mark) in nfsd_file_free()
320 nfsd_file_mark_put(nf->nf_mark); in nfsd_file_free()
321 if (nf->nf_file) { in nfsd_file_free()
322 get_file(nf->nf_file); in nfsd_file_free()
323 filp_close(nf->nf_file, NULL); in nfsd_file_free()
324 fput(nf->nf_file); in nfsd_file_free()
332 if (WARN_ON_ONCE(!list_empty(&nf->nf_lru))) in nfsd_file_free()
335 call_rcu(&nf->nf_rcu, nfsd_file_slab_free); in nfsd_file_free()
340 nfsd_file_check_writeback(struct nfsd_file *nf) in nfsd_file_check_writeback() argument
342 struct file *file = nf->nf_file; in nfsd_file_check_writeback()
353 nfsd_file_check_write_error(struct nfsd_file *nf) in nfsd_file_check_write_error() argument
355 struct file *file = nf->nf_file; in nfsd_file_check_write_error()
363 nfsd_file_flush(struct nfsd_file *nf) in nfsd_file_flush() argument
365 struct file *file = nf->nf_file; in nfsd_file_flush()
371 nfsd_reset_write_verifier(net_generic(nf->nf_net, nfsd_net_id)); in nfsd_file_flush()
374 static void nfsd_file_lru_add(struct nfsd_file *nf) in nfsd_file_lru_add() argument
376 set_bit(NFSD_FILE_REFERENCED, &nf->nf_flags); in nfsd_file_lru_add()
377 if (list_lru_add(&nfsd_file_lru, &nf->nf_lru)) in nfsd_file_lru_add()
378 trace_nfsd_file_lru_add(nf); in nfsd_file_lru_add()
381 static void nfsd_file_lru_remove(struct nfsd_file *nf) in nfsd_file_lru_remove() argument
383 if (list_lru_del(&nfsd_file_lru, &nf->nf_lru)) in nfsd_file_lru_remove()
384 trace_nfsd_file_lru_del(nf); in nfsd_file_lru_remove()
388 nfsd_file_hash_remove(struct nfsd_file *nf) in nfsd_file_hash_remove() argument
390 trace_nfsd_file_unhash(nf); in nfsd_file_hash_remove()
392 if (nfsd_file_check_write_error(nf)) in nfsd_file_hash_remove()
393 nfsd_reset_write_verifier(net_generic(nf->nf_net, nfsd_net_id)); in nfsd_file_hash_remove()
394 rhashtable_remove_fast(&nfsd_file_rhash_tbl, &nf->nf_rhash, in nfsd_file_hash_remove()
399 nfsd_file_unhash(struct nfsd_file *nf) in nfsd_file_unhash() argument
401 if (test_and_clear_bit(NFSD_FILE_HASHED, &nf->nf_flags)) { in nfsd_file_unhash()
402 nfsd_file_hash_remove(nf); in nfsd_file_unhash()
409 nfsd_file_unhash_and_dispose(struct nfsd_file *nf, struct list_head *dispose) in nfsd_file_unhash_and_dispose() argument
411 trace_nfsd_file_unhash_and_dispose(nf); in nfsd_file_unhash_and_dispose()
412 if (nfsd_file_unhash(nf)) { in nfsd_file_unhash_and_dispose()
414 nfsd_file_lru_remove(nf); in nfsd_file_unhash_and_dispose()
415 list_add(&nf->nf_lru, dispose); in nfsd_file_unhash_and_dispose()
420 nfsd_file_put_noref(struct nfsd_file *nf) in nfsd_file_put_noref() argument
422 trace_nfsd_file_put(nf); in nfsd_file_put_noref()
424 if (refcount_dec_and_test(&nf->nf_ref)) { in nfsd_file_put_noref()
425 WARN_ON(test_bit(NFSD_FILE_HASHED, &nf->nf_flags)); in nfsd_file_put_noref()
426 nfsd_file_lru_remove(nf); in nfsd_file_put_noref()
427 nfsd_file_free(nf); in nfsd_file_put_noref()
432 nfsd_file_put(struct nfsd_file *nf) in nfsd_file_put() argument
436 nfsd_file_lru_add(nf); in nfsd_file_put()
437 if (test_bit(NFSD_FILE_HASHED, &nf->nf_flags) == 0) { in nfsd_file_put()
438 nfsd_file_flush(nf); in nfsd_file_put()
439 nfsd_file_put_noref(nf); in nfsd_file_put()
440 } else if (nf->nf_file) { in nfsd_file_put()
441 nfsd_file_put_noref(nf); in nfsd_file_put()
444 nfsd_file_put_noref(nf); in nfsd_file_put()
455 void nfsd_file_close(struct nfsd_file *nf) in nfsd_file_close() argument
457 nfsd_file_put(nf); in nfsd_file_close()
458 if (refcount_dec_if_one(&nf->nf_ref)) { in nfsd_file_close()
459 nfsd_file_unhash(nf); in nfsd_file_close()
460 nfsd_file_lru_remove(nf); in nfsd_file_close()
461 nfsd_file_free(nf); in nfsd_file_close()
466 nfsd_file_get(struct nfsd_file *nf) in nfsd_file_get() argument
468 if (likely(refcount_inc_not_zero(&nf->nf_ref))) in nfsd_file_get()
469 return nf; in nfsd_file_get()
476 struct nfsd_file *nf; in nfsd_file_dispose_list() local
479 nf = list_first_entry(dispose, struct nfsd_file, nf_lru); in nfsd_file_dispose_list()
480 list_del_init(&nf->nf_lru); in nfsd_file_dispose_list()
481 nfsd_file_flush(nf); in nfsd_file_dispose_list()
482 nfsd_file_put_noref(nf); in nfsd_file_dispose_list()
490 struct nfsd_file *nf; in nfsd_file_dispose_list_sync() local
493 nf = list_first_entry(dispose, struct nfsd_file, nf_lru); in nfsd_file_dispose_list_sync()
494 list_del_init(&nf->nf_lru); in nfsd_file_dispose_list_sync()
495 nfsd_file_flush(nf); in nfsd_file_dispose_list_sync()
496 if (!refcount_dec_and_test(&nf->nf_ref)) in nfsd_file_dispose_list_sync()
498 if (nfsd_file_free(nf)) in nfsd_file_dispose_list_sync()
530 struct nfsd_file *nf, *tmp; in nfsd_file_list_add_pernet() local
532 list_for_each_entry_safe(nf, tmp, src, nf_lru) { in nfsd_file_list_add_pernet()
533 if (nf->nf_net == net) in nfsd_file_list_add_pernet()
534 list_move_tail(&nf->nf_lru, dst); in nfsd_file_list_add_pernet()
542 struct nfsd_file *nf; in nfsd_file_dispose_list_delayed() local
545 nf = list_first_entry(dispose, struct nfsd_file, nf_lru); in nfsd_file_dispose_list_delayed()
546 nfsd_file_list_add_pernet(&list, dispose, nf->nf_net); in nfsd_file_dispose_list_delayed()
547 nfsd_file_list_add_disposal(&list, nf->nf_net); in nfsd_file_dispose_list_delayed()
570 struct nfsd_file *nf = list_entry(item, struct nfsd_file, nf_lru); in nfsd_file_lru_cb() local
582 if (refcount_read(&nf->nf_ref) > 1) { in nfsd_file_lru_cb()
583 list_lru_isolate(lru, &nf->nf_lru); in nfsd_file_lru_cb()
584 trace_nfsd_file_gc_in_use(nf); in nfsd_file_lru_cb()
592 if (nfsd_file_check_writeback(nf)) { in nfsd_file_lru_cb()
593 trace_nfsd_file_gc_writeback(nf); in nfsd_file_lru_cb()
597 if (test_and_clear_bit(NFSD_FILE_REFERENCED, &nf->nf_flags)) { in nfsd_file_lru_cb()
598 trace_nfsd_file_gc_referenced(nf); in nfsd_file_lru_cb()
602 if (!test_and_clear_bit(NFSD_FILE_HASHED, &nf->nf_flags)) { in nfsd_file_lru_cb()
603 trace_nfsd_file_gc_hashed(nf); in nfsd_file_lru_cb()
607 list_lru_isolate_move(lru, &nf->nf_lru, head); in nfsd_file_lru_cb()
609 trace_nfsd_file_gc_disposed(nf); in nfsd_file_lru_cb()
624 struct nfsd_file *nf; in nfsd_file_gc_dispose_list() local
626 list_for_each_entry(nf, dispose, nf_lru) in nfsd_file_gc_dispose_list()
627 nfsd_file_hash_remove(nf); in nfsd_file_gc_dispose_list()
687 struct nfsd_file *nf; in __nfsd_file_close_inode() local
691 nf = rhashtable_lookup(&nfsd_file_rhash_tbl, &key, in __nfsd_file_close_inode()
693 if (!nf) in __nfsd_file_close_inode()
695 nfsd_file_unhash_and_dispose(nf, dispose); in __nfsd_file_close_inode()
887 struct nfsd_file *nf; in __nfsd_file_cache_purge() local
894 nf = rhashtable_walk_next(&iter); in __nfsd_file_cache_purge()
895 while (!IS_ERR_OR_NULL(nf)) { in __nfsd_file_cache_purge()
896 if (!net || nf->nf_net == net) in __nfsd_file_cache_purge()
897 nfsd_file_unhash_and_dispose(nf, &dispose); in __nfsd_file_cache_purge()
898 nf = rhashtable_walk_next(&iter); in __nfsd_file_cache_purge()
902 } while (nf == ERR_PTR(-EAGAIN)); in __nfsd_file_cache_purge()
1045 struct nfsd_file *nf; in nfsd_file_do_acquire() local
1058 nf = rhashtable_lookup(&nfsd_file_rhash_tbl, &key, in nfsd_file_do_acquire()
1060 if (nf) in nfsd_file_do_acquire()
1061 nf = nfsd_file_get(nf); in nfsd_file_do_acquire()
1063 if (nf) in nfsd_file_do_acquire()
1066 nf = nfsd_file_alloc(&key, may_flags); in nfsd_file_do_acquire()
1067 if (!nf) { in nfsd_file_do_acquire()
1073 &key, &nf->nf_rhash, in nfsd_file_do_acquire()
1078 nfsd_file_slab_free(&nf->nf_rcu); in nfsd_file_do_acquire()
1079 nf = NULL; in nfsd_file_do_acquire()
1087 wait_on_bit(&nf->nf_flags, NFSD_FILE_PENDING, TASK_UNINTERRUPTIBLE); in nfsd_file_do_acquire()
1090 if (!test_bit(NFSD_FILE_HASHED, &nf->nf_flags)) { in nfsd_file_do_acquire()
1091 trace_nfsd_file_cons_err(rqstp, key.inode, may_flags, nf); in nfsd_file_do_acquire()
1097 nfsd_file_put_noref(nf); in nfsd_file_do_acquire()
1101 nfsd_file_lru_remove(nf); in nfsd_file_do_acquire()
1104 status = nfserrno(nfsd_open_break_lease(file_inode(nf->nf_file), may_flags)); in nfsd_file_do_acquire()
1109 *pnf = nf; in nfsd_file_do_acquire()
1111 nfsd_file_put(nf); in nfsd_file_do_acquire()
1112 nf = NULL; in nfsd_file_do_acquire()
1118 trace_nfsd_file_acquire(rqstp, key.inode, may_flags, nf, status); in nfsd_file_do_acquire()
1122 trace_nfsd_file_alloc(nf); in nfsd_file_do_acquire()
1123 nf->nf_mark = nfsd_file_mark_find_or_create(nf, key.inode); in nfsd_file_do_acquire()
1124 if (nf->nf_mark) { in nfsd_file_do_acquire()
1127 &nf->nf_file); in nfsd_file_do_acquire()
1128 trace_nfsd_file_open(nf, status); in nfsd_file_do_acquire()
1138 if (nfsd_file_unhash(nf)) in nfsd_file_do_acquire()
1139 nfsd_file_put_noref(nf); in nfsd_file_do_acquire()
1140 clear_bit_unlock(NFSD_FILE_PENDING, &nf->nf_flags); in nfsd_file_do_acquire()
1142 wake_up_bit(&nf->nf_flags, NFSD_FILE_PENDING); in nfsd_file_do_acquire()