Lines Matching refs:nf

86 	struct nfsd_file *nf = container_of(rcu, struct nfsd_file, nf_rcu);  in nfsd_file_slab_free()  local
88 put_cred(nf->nf_cred); in nfsd_file_slab_free()
89 kmem_cache_free(nfsd_file_slab, nf); in nfsd_file_slab_free()
120 nfsd_file_mark_find_or_create(struct nfsd_file *nf) in nfsd_file_mark_find_or_create() argument
125 struct inode *inode = nf->nf_inode; in nfsd_file_mark_find_or_create()
174 struct nfsd_file *nf; in nfsd_file_alloc() local
176 nf = kmem_cache_alloc(nfsd_file_slab, GFP_KERNEL); in nfsd_file_alloc()
177 if (nf) { in nfsd_file_alloc()
178 INIT_HLIST_NODE(&nf->nf_node); in nfsd_file_alloc()
179 INIT_LIST_HEAD(&nf->nf_lru); in nfsd_file_alloc()
180 nf->nf_file = NULL; in nfsd_file_alloc()
181 nf->nf_cred = get_current_cred(); in nfsd_file_alloc()
182 nf->nf_net = net; in nfsd_file_alloc()
183 nf->nf_flags = 0; in nfsd_file_alloc()
184 nf->nf_inode = inode; in nfsd_file_alloc()
185 nf->nf_hashval = hashval; in nfsd_file_alloc()
186 atomic_set(&nf->nf_ref, 1); in nfsd_file_alloc()
187 nf->nf_may = may & NFSD_FILE_MAY_MASK; in nfsd_file_alloc()
190 __set_bit(NFSD_FILE_BREAK_WRITE, &nf->nf_flags); in nfsd_file_alloc()
192 __set_bit(NFSD_FILE_BREAK_READ, &nf->nf_flags); in nfsd_file_alloc()
194 nf->nf_mark = NULL; in nfsd_file_alloc()
195 trace_nfsd_file_alloc(nf); in nfsd_file_alloc()
197 return nf; in nfsd_file_alloc()
201 nfsd_file_free(struct nfsd_file *nf) in nfsd_file_free() argument
205 trace_nfsd_file_put_final(nf); in nfsd_file_free()
206 if (nf->nf_mark) in nfsd_file_free()
207 nfsd_file_mark_put(nf->nf_mark); in nfsd_file_free()
208 if (nf->nf_file) { in nfsd_file_free()
209 get_file(nf->nf_file); in nfsd_file_free()
210 filp_close(nf->nf_file, NULL); in nfsd_file_free()
211 fput(nf->nf_file); in nfsd_file_free()
214 call_rcu(&nf->nf_rcu, nfsd_file_slab_free); in nfsd_file_free()
219 nfsd_file_check_writeback(struct nfsd_file *nf) in nfsd_file_check_writeback() argument
221 struct file *file = nf->nf_file; in nfsd_file_check_writeback()
232 nfsd_file_check_write_error(struct nfsd_file *nf) in nfsd_file_check_write_error() argument
234 struct file *file = nf->nf_file; in nfsd_file_check_write_error()
242 nfsd_file_in_use(struct nfsd_file *nf) in nfsd_file_in_use() argument
244 return nfsd_file_check_writeback(nf) || in nfsd_file_in_use()
245 nfsd_file_check_write_error(nf); in nfsd_file_in_use()
249 nfsd_file_do_unhash(struct nfsd_file *nf) in nfsd_file_do_unhash() argument
251 lockdep_assert_held(&nfsd_file_hashtbl[nf->nf_hashval].nfb_lock); in nfsd_file_do_unhash()
253 trace_nfsd_file_unhash(nf); in nfsd_file_do_unhash()
255 if (nfsd_file_check_write_error(nf)) in nfsd_file_do_unhash()
256 nfsd_reset_boot_verifier(net_generic(nf->nf_net, nfsd_net_id)); in nfsd_file_do_unhash()
257 --nfsd_file_hashtbl[nf->nf_hashval].nfb_count; in nfsd_file_do_unhash()
258 hlist_del_rcu(&nf->nf_node); in nfsd_file_do_unhash()
259 if (!list_empty(&nf->nf_lru)) in nfsd_file_do_unhash()
260 list_lru_del(&nfsd_file_lru, &nf->nf_lru); in nfsd_file_do_unhash()
265 nfsd_file_unhash(struct nfsd_file *nf) in nfsd_file_unhash() argument
267 if (test_and_clear_bit(NFSD_FILE_HASHED, &nf->nf_flags)) { in nfsd_file_unhash()
268 nfsd_file_do_unhash(nf); in nfsd_file_unhash()
278 nfsd_file_unhash_and_release_locked(struct nfsd_file *nf, struct list_head *dispose) in nfsd_file_unhash_and_release_locked() argument
280 lockdep_assert_held(&nfsd_file_hashtbl[nf->nf_hashval].nfb_lock); in nfsd_file_unhash_and_release_locked()
282 trace_nfsd_file_unhash_and_release_locked(nf); in nfsd_file_unhash_and_release_locked()
283 if (!nfsd_file_unhash(nf)) in nfsd_file_unhash_and_release_locked()
286 if (atomic_add_unless(&nf->nf_ref, -1, 1)) in nfsd_file_unhash_and_release_locked()
289 list_add(&nf->nf_lru, dispose); in nfsd_file_unhash_and_release_locked()
294 nfsd_file_put_noref(struct nfsd_file *nf) in nfsd_file_put_noref() argument
297 trace_nfsd_file_put(nf); in nfsd_file_put_noref()
299 count = atomic_dec_return(&nf->nf_ref); in nfsd_file_put_noref()
301 WARN_ON(test_bit(NFSD_FILE_HASHED, &nf->nf_flags)); in nfsd_file_put_noref()
302 nfsd_file_free(nf); in nfsd_file_put_noref()
308 nfsd_file_put(struct nfsd_file *nf) in nfsd_file_put() argument
310 bool is_hashed = test_bit(NFSD_FILE_HASHED, &nf->nf_flags) != 0; in nfsd_file_put()
311 bool unused = !nfsd_file_in_use(nf); in nfsd_file_put()
313 set_bit(NFSD_FILE_REFERENCED, &nf->nf_flags); in nfsd_file_put()
314 if (nfsd_file_put_noref(nf) == 1 && is_hashed && unused) in nfsd_file_put()
319 nfsd_file_get(struct nfsd_file *nf) in nfsd_file_get() argument
321 if (likely(atomic_inc_not_zero(&nf->nf_ref))) in nfsd_file_get()
322 return nf; in nfsd_file_get()
329 struct nfsd_file *nf; in nfsd_file_dispose_list() local
332 nf = list_first_entry(dispose, struct nfsd_file, nf_lru); in nfsd_file_dispose_list()
333 list_del(&nf->nf_lru); in nfsd_file_dispose_list()
334 nfsd_file_put_noref(nf); in nfsd_file_dispose_list()
342 struct nfsd_file *nf; in nfsd_file_dispose_list_sync() local
345 nf = list_first_entry(dispose, struct nfsd_file, nf_lru); in nfsd_file_dispose_list_sync()
346 list_del(&nf->nf_lru); in nfsd_file_dispose_list_sync()
347 if (!atomic_dec_and_test(&nf->nf_ref)) in nfsd_file_dispose_list_sync()
349 if (nfsd_file_free(nf)) in nfsd_file_dispose_list_sync()
366 struct nfsd_file *nf = list_entry(item, struct nfsd_file, nf_lru); in nfsd_file_lru_cb() local
378 if (atomic_read(&nf->nf_ref) > 1) in nfsd_file_lru_cb()
385 if (nfsd_file_check_writeback(nf)) in nfsd_file_lru_cb()
388 if (test_and_clear_bit(NFSD_FILE_REFERENCED, &nf->nf_flags)) in nfsd_file_lru_cb()
391 if (!test_and_clear_bit(NFSD_FILE_HASHED, &nf->nf_flags)) in nfsd_file_lru_cb()
394 list_lru_isolate_move(lru, &nf->nf_lru, head); in nfsd_file_lru_cb()
406 struct nfsd_file *nf = list_first_entry(head, in nfsd_file_lru_dispose() local
408 list_del_init(&nf->nf_lru); in nfsd_file_lru_dispose()
409 spin_lock(&nfsd_file_hashtbl[nf->nf_hashval].nfb_lock); in nfsd_file_lru_dispose()
410 nfsd_file_do_unhash(nf); in nfsd_file_lru_dispose()
411 spin_unlock(&nfsd_file_hashtbl[nf->nf_hashval].nfb_lock); in nfsd_file_lru_dispose()
412 nfsd_file_put_noref(nf); in nfsd_file_lru_dispose()
443 struct nfsd_file *nf; in __nfsd_file_close_inode() local
447 hlist_for_each_entry_safe(nf, tmp, &nfsd_file_hashtbl[hashval].nfb_head, nf_node) { in __nfsd_file_close_inode()
448 if (inode == nf->nf_inode) in __nfsd_file_close_inode()
449 nfsd_file_unhash_and_release_locked(nf, dispose); in __nfsd_file_close_inode()
657 struct nfsd_file *nf; in nfsd_file_cache_purge() local
669 hlist_for_each_entry_safe(nf, next, &nfb->nfb_head, nf_node) { in nfsd_file_cache_purge()
670 if (net && nf->nf_net != net) in nfsd_file_cache_purge()
672 del = nfsd_file_unhash_and_release_locked(nf, &dispose); in nfsd_file_cache_purge()
737 struct nfsd_file *nf; in nfsd_file_find_locked() local
740 hlist_for_each_entry_rcu(nf, &nfsd_file_hashtbl[hashval].nfb_head, in nfsd_file_find_locked()
742 if ((need & nf->nf_may) != need) in nfsd_file_find_locked()
744 if (nf->nf_inode != inode) in nfsd_file_find_locked()
746 if (nf->nf_net != net) in nfsd_file_find_locked()
748 if (!nfsd_match_cred(nf->nf_cred, current_cred())) in nfsd_file_find_locked()
750 if (nfsd_file_get(nf) != NULL) in nfsd_file_find_locked()
751 return nf; in nfsd_file_find_locked()
767 struct nfsd_file *nf; in nfsd_file_is_cached() local
773 hlist_for_each_entry_rcu(nf, &nfsd_file_hashtbl[hashval].nfb_head, in nfsd_file_is_cached()
775 if (inode == nf->nf_inode) { in nfsd_file_is_cached()
791 struct nfsd_file *nf, *new; in nfsd_file_acquire() local
805 nf = nfsd_file_find_locked(inode, may_flags, hashval, net); in nfsd_file_acquire()
807 if (nf) in nfsd_file_acquire()
818 nf = nfsd_file_find_locked(inode, may_flags, hashval, net); in nfsd_file_acquire()
819 if (nf == NULL) in nfsd_file_acquire()
825 wait_on_bit(&nf->nf_flags, NFSD_FILE_PENDING, TASK_UNINTERRUPTIBLE); in nfsd_file_acquire()
828 if (!test_bit(NFSD_FILE_HASHED, &nf->nf_flags)) { in nfsd_file_acquire()
829 nfsd_file_put_noref(nf); in nfsd_file_acquire()
838 if (test_bit(NFSD_FILE_BREAK_READ, &nf->nf_flags) || in nfsd_file_acquire()
839 (test_bit(NFSD_FILE_BREAK_WRITE, &nf->nf_flags) && write)) { in nfsd_file_acquire()
841 file_inode(nf->nf_file), may_flags)); in nfsd_file_acquire()
843 clear_bit(NFSD_FILE_BREAK_READ, &nf->nf_flags); in nfsd_file_acquire()
846 &nf->nf_flags); in nfsd_file_acquire()
852 *pnf = nf; in nfsd_file_acquire()
854 nfsd_file_put(nf); in nfsd_file_acquire()
855 nf = NULL; in nfsd_file_acquire()
858 trace_nfsd_file_acquire(rqstp, hashval, inode, may_flags, nf, status); in nfsd_file_acquire()
861 nf = new; in nfsd_file_acquire()
863 atomic_inc(&nf->nf_ref); in nfsd_file_acquire()
864 __set_bit(NFSD_FILE_HASHED, &nf->nf_flags); in nfsd_file_acquire()
865 __set_bit(NFSD_FILE_PENDING, &nf->nf_flags); in nfsd_file_acquire()
866 list_lru_add(&nfsd_file_lru, &nf->nf_lru); in nfsd_file_acquire()
867 hlist_add_head_rcu(&nf->nf_node, &nfsd_file_hashtbl[hashval].nfb_head); in nfsd_file_acquire()
874 nf->nf_mark = nfsd_file_mark_find_or_create(nf); in nfsd_file_acquire()
875 if (nf->nf_mark) in nfsd_file_acquire()
877 may_flags, &nf->nf_file); in nfsd_file_acquire()
887 do_free = nfsd_file_unhash(nf); in nfsd_file_acquire()
890 nfsd_file_put_noref(nf); in nfsd_file_acquire()
892 clear_bit_unlock(NFSD_FILE_PENDING, &nf->nf_flags); in nfsd_file_acquire()
894 wake_up_bit(&nf->nf_flags, NFSD_FILE_PENDING); in nfsd_file_acquire()