Lines Matching +full:cache +full:- +full:op +full:- +full:block +full:- +full:size

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
60 int ns_svid; /* on-the-wire SVID for this file */
77 struct vnode *vp, int op, struct flock *fl, int flags,
78 int svid, size_t fhlen, void *fh, off_t size, bool_t reclaim);
81 struct vnode *vp, int op, struct flock *fl, int flags,
82 int svid, size_t fhlen, void *fh, off_t size);
85 struct vnode *vp, int op, struct flock *fl, int flags,
86 int svid, size_t fhlen, void *fh, off_t size);
91 rpcvers_t vers, size_t fhlen, void *fh, off_t size,
112 p = td ? td->td_proc : NULL; in nlm_msg()
131 struct nfsmount *nmp = nf->nf_nmp; in nlm_down()
135 mtx_lock(&nmp->nm_mtx); in nlm_down()
136 if (!(nmp->nm_state & NFSSTA_LOCKTIMEO)) { in nlm_down()
137 nmp->nm_state |= NFSSTA_LOCKTIMEO; in nlm_down()
138 mtx_unlock(&nmp->nm_mtx); in nlm_down()
139 vfs_event_signal(&nmp->nm_mountp->mnt_stat.f_fsid, in nlm_down()
142 mtx_unlock(&nmp->nm_mtx); in nlm_down()
145 nf->nf_printed = TRUE; in nlm_down()
146 nlm_msg(td, nmp->nm_mountp->mnt_stat.f_mntfromname, msg, error); in nlm_down()
153 struct nfsmount *nmp = nf->nf_nmp; in nlm_up()
155 if (!nf->nf_printed) in nlm_up()
158 nlm_msg(td, nmp->nm_mountp->mnt_stat.f_mntfromname, msg, 0); in nlm_up()
160 mtx_lock(&nmp->nm_mtx); in nlm_up()
161 if (nmp->nm_state & NFSSTA_LOCKTIMEO) { in nlm_up()
162 nmp->nm_state &= ~NFSSTA_LOCKTIMEO; in nlm_up()
163 mtx_unlock(&nmp->nm_mtx); in nlm_up()
164 vfs_event_signal(&nmp->nm_mountp->mnt_stat.f_fsid, in nlm_up()
167 mtx_unlock(&nmp->nm_mtx); in nlm_up()
190 * nlm_advlock --
191 * NFS advisory byte-level locks.
194 nlm_advlock_internal(struct vnode *vp, void *id, int op, struct flock *fl, in nlm_advlock_internal() argument
199 off_t size; in nlm_advlock_internal() local
221 nmp = VFSTONFS(vp->v_mount); in nlm_advlock_internal()
223 * Push any pending writes to the server and flush our cache in nlm_advlock_internal()
225 * file, we get whatever they wrote and vice-versa. in nlm_advlock_internal()
227 if (op == F_SETLK || op == F_UNLCK) in nlm_advlock_internal()
228 nmp->nm_vinvalbuf(vp, V_SAVE, td, 1); in nlm_advlock_internal()
230 strcpy(servername, nmp->nm_hostname); in nlm_advlock_internal()
231 nmp->nm_getinfo(vp, fh.fh_bytes, &fhlen, &ss, &is_v3, &size, &timo); in nlm_advlock_internal()
238 if (nmp->nm_flag & NFSMNT_SOFT) in nlm_advlock_internal()
239 retries = nmp->nm_retry; in nlm_advlock_internal()
244 * We need to switch to mount-point creds so that we can send in nlm_advlock_internal()
249 cred = td->td_ucred; in nlm_advlock_internal()
250 td->td_ucred = vp->v_mount->mnt_cred; in nlm_advlock_internal()
251 crhold(td->td_ucred); in nlm_advlock_internal()
270 KASSERT(fl->l_start == 0 && fl->l_len == 0, in nlm_advlock_internal()
271 ("F_FLOCK lock requests must be whole-file locks")); in nlm_advlock_internal()
272 if (!ns->ns_ucred) { in nlm_advlock_internal()
277 ns->ns_ucred = crdup(cred); in nlm_advlock_internal()
279 svid = ns->ns_svid; in nlm_advlock_internal()
286 svid = fl->l_pid; in nlm_advlock_internal()
288 svid = ((struct proc *) id)->p_pid; in nlm_advlock_internal()
291 switch(op) { in nlm_advlock_internal()
294 && fl->l_type == F_WRLCK) { in nlm_advlock_internal()
303 * non-blocking and if that fails, we unlock in nlm_advlock_internal()
304 * the file and block. in nlm_advlock_internal()
308 svid, fhlen, &fh.fh_bytes, size, reclaim); in nlm_advlock_internal()
310 fl->l_type = F_UNLCK; in nlm_advlock_internal()
313 svid, fhlen, &fh.fh_bytes, size); in nlm_advlock_internal()
314 fl->l_type = F_WRLCK; in nlm_advlock_internal()
317 if (ns->ns_active) { in nlm_advlock_internal()
318 ns->ns_refs--; in nlm_advlock_internal()
319 ns->ns_active = FALSE; in nlm_advlock_internal()
326 size, reclaim); in nlm_advlock_internal()
331 vp, op, fl, flags, svid, fhlen, &fh.fh_bytes, in nlm_advlock_internal()
332 size, reclaim); in nlm_advlock_internal()
336 if (!ns->ns_active) { in nlm_advlock_internal()
341 * F_FLOCK only supports whole-file in nlm_advlock_internal()
345 ns->ns_refs++; in nlm_advlock_internal()
346 ns->ns_active = TRUE; in nlm_advlock_internal()
354 vp, op, fl, flags, svid, fhlen, &fh.fh_bytes, size); in nlm_advlock_internal()
357 if (ns->ns_active) { in nlm_advlock_internal()
358 ns->ns_refs--; in nlm_advlock_internal()
359 ns->ns_active = FALSE; in nlm_advlock_internal()
367 vp, op, fl, flags, svid, fhlen, &fh.fh_bytes, size); in nlm_advlock_internal()
378 cred1 = td->td_ucred; in nlm_advlock_internal()
379 td->td_ucred = cred; in nlm_advlock_internal()
392 return (nlm_advlock_internal(ap->a_vp, ap->a_id, ap->a_op, ap->a_fl, in nlm_advlock()
393 ap->a_flags, FALSE, TRUE)); in nlm_advlock()
410 if (fl->l_pid > PID_MAX) { in nlm_set_creds_for_lock()
412 * If this was originally a F_FLOCK-style lock, we in nlm_set_creds_for_lock()
420 if (ns->ns_svid == fl->l_pid) { in nlm_set_creds_for_lock()
421 cred = crhold(ns->ns_ucred); in nlm_set_creds_for_lock()
432 p = pfind(fl->l_pid); in nlm_set_creds_for_lock()
434 cred = crhold(p->p_ucred); in nlm_set_creds_for_lock()
444 cred = crhold(td->td_ucred); in nlm_set_creds_for_lock()
447 td->td_ucred = cred; in nlm_set_creds_for_lock()
461 oldcred = td->td_ucred; in nlm_reclaim_free_lock()
467 crfree(td->td_ucred); in nlm_reclaim_free_lock()
468 td->td_ucred = oldcred; in nlm_reclaim_free_lock()
477 nlm_cancel_wait(ap->a_vp); in nlm_reclaim()
478 lf_iteratelocks_vnode(ap->a_vp, nlm_reclaim_free_lock, NULL); in nlm_reclaim()
500 state = nlm_host_get_state(nr->nr_host); in nlm_client_recover_lock()
501 if (nr->nr_state != state) in nlm_client_recover_lock()
508 oldcred = td->td_ucred; in nlm_client_recover_lock()
514 crfree(td->td_ucred); in nlm_client_recover_lock()
515 td->td_ucred = oldcred; in nlm_client_recover_lock()
539 dst->caller_name = src->caller_name; in nlm_convert_to_nlm_lock()
540 dst->fh = src->fh; in nlm_convert_to_nlm_lock()
541 dst->oh = src->oh; in nlm_convert_to_nlm_lock()
542 dst->svid = src->svid; in nlm_convert_to_nlm_lock()
543 dst->l_offset = src->l_offset; in nlm_convert_to_nlm_lock()
544 dst->l_len = src->l_len; in nlm_convert_to_nlm_lock()
551 dst->exclusive = src->exclusive; in nlm_convert_to_nlm4_holder()
552 dst->svid = src->svid; in nlm_convert_to_nlm4_holder()
553 dst->oh = src->oh; in nlm_convert_to_nlm4_holder()
554 dst->l_offset = src->l_offset; in nlm_convert_to_nlm4_holder()
555 dst->l_len = src->l_len; in nlm_convert_to_nlm4_holder()
561 dst->cookie = src->cookie; in nlm_convert_to_nlm4_res()
562 dst->stat.stat = (enum nlm4_stats) src->stat.stat; in nlm_convert_to_nlm4_res()
576 args1.cookie = args->cookie; in nlm_test_rpc()
577 args1.exclusive = args->exclusive; in nlm_test_rpc()
578 nlm_convert_to_nlm_lock(&args1.alock, &args->alock); in nlm_test_rpc()
584 res->cookie = res1.cookie; in nlm_test_rpc()
585 res->stat.stat = (enum nlm4_stats) res1.stat.stat; in nlm_test_rpc()
588 &res->stat.nlm4_testrply_u.holder, in nlm_test_rpc()
607 args1.cookie = args->cookie; in nlm_lock_rpc()
608 args1.block = args->block; in nlm_lock_rpc()
609 args1.exclusive = args->exclusive; in nlm_lock_rpc()
610 nlm_convert_to_nlm_lock(&args1.alock, &args->alock); in nlm_lock_rpc()
611 args1.reclaim = args->reclaim; in nlm_lock_rpc()
612 args1.state = args->state; in nlm_lock_rpc()
636 args1.cookie = args->cookie; in nlm_cancel_rpc()
637 args1.block = args->block; in nlm_cancel_rpc()
638 args1.exclusive = args->exclusive; in nlm_cancel_rpc()
639 nlm_convert_to_nlm_lock(&args1.alock, &args->alock); in nlm_cancel_rpc()
663 args1.cookie = args->cookie; in nlm_unlock_rpc()
664 nlm_convert_to_nlm_lock(&args1.alock, &args->alock); in nlm_unlock_rpc()
695 nlm_record_lock(struct vnode *vp, int op, struct flock *fl, in nlm_record_lock() argument
696 int svid, int sysid, off_t size) in nlm_record_lock() argument
705 a.a_op = op; in nlm_record_lock()
710 newfl.l_start = fl->l_start; in nlm_record_lock()
711 newfl.l_len = fl->l_len; in nlm_record_lock()
712 newfl.l_type = fl->l_type; in nlm_record_lock()
713 newfl.l_whence = fl->l_whence; in nlm_record_lock()
718 error = lf_advlockasync(&a, &vp->v_lockf, size); in nlm_record_lock()
744 * There is no sense in re-trying recording in nlm_record_lock()
754 ("Failed to register NFS lock locally - error=%d", error)); in nlm_record_lock()
760 struct vnode *vp, int op, struct flock *fl, int flags, in nlm_setlock() argument
761 int svid, size_t fhlen, void *fh, off_t size, bool_t reclaim) in nlm_setlock() argument
769 int retry, block, exclusive; in nlm_setlock() local
776 block = (flags & F_WAIT) ? TRUE : FALSE; in nlm_setlock()
777 exclusive = (fl->l_type == F_WRLCK); in nlm_setlock()
779 error = nlm_init_lock(fl, flags, svid, vers, fhlen, fh, size, in nlm_setlock()
783 args.block = block; in nlm_setlock()
794 if (block) in nlm_setlock()
806 if (block) in nlm_setlock()
809 retries--; in nlm_setlock()
820 if (block && res.stat.stat != nlm4_blocked) in nlm_setlock()
839 if (block && res.stat.stat == nlm4_blocked) { in nlm_setlock()
845 * will also re-try every few seconds. in nlm_setlock()
866 cancel.block = block; in nlm_setlock()
917 * recently rebooted - in nlm_setlock()
934 * implementation - in nlm_setlock()
946 nlm_record_lock(vp, op, fl, args.alock.svid, in nlm_setlock()
947 nlm_host_get_sysid(host), size); in nlm_setlock()
958 struct vnode *vp, int op, struct flock *fl, int flags, in nlm_clearlock() argument
959 int svid, size_t fhlen, void *fh, off_t size) in nlm_clearlock() argument
972 error = nlm_init_lock(fl, flags, svid, vers, fhlen, fh, size, in nlm_clearlock()
992 retries--; in nlm_clearlock()
1023 nlm_record_lock(vp, op, fl, args.alock.svid, in nlm_clearlock()
1024 nlm_host_get_sysid(host), size); in nlm_clearlock()
1033 struct vnode *vp, int op, struct flock *fl, int flags, in nlm_getlock() argument
1034 int svid, size_t fhlen, void *fh, off_t size) in nlm_getlock() argument
1050 exclusive = (fl->l_type == F_WRLCK); in nlm_getlock()
1052 error = nlm_init_lock(fl, flags, svid, vers, fhlen, fh, size, in nlm_getlock()
1073 retries--; in nlm_getlock()
1096 fl->l_start = h->l_offset; in nlm_getlock()
1097 fl->l_len = h->l_len; in nlm_getlock()
1098 fl->l_pid = h->svid; in nlm_getlock()
1099 if (h->exclusive) in nlm_getlock()
1100 fl->l_type = F_WRLCK; in nlm_getlock()
1102 fl->l_type = F_RDLCK; in nlm_getlock()
1103 fl->l_whence = SEEK_SET; in nlm_getlock()
1104 fl->l_sysid = 0; in nlm_getlock()
1106 fl->l_type = F_UNLCK; in nlm_getlock()
1158 if (ns->ns_id == id) { in nlm_find_svid()
1159 ns->ns_refs++; in nlm_find_svid()
1168 newns->ns_refs = 1; in nlm_find_svid()
1169 newns->ns_id = id; in nlm_find_svid()
1170 newns->ns_svid = svid; in nlm_find_svid()
1171 newns->ns_ucred = NULL; in nlm_find_svid()
1172 newns->ns_active = FALSE; in nlm_find_svid()
1180 if (ns->ns_id == id) { in nlm_find_svid()
1181 ns->ns_refs++; in nlm_find_svid()
1187 free_unr(nlm_svid_allocator, newns->ns_svid); in nlm_find_svid()
1205 ns->ns_refs--; in nlm_free_svid()
1206 if (!ns->ns_refs) { in nlm_free_svid()
1207 KASSERT(!ns->ns_active, ("Freeing active SVID")); in nlm_free_svid()
1210 free_unr(nlm_svid_allocator, ns->ns_svid); in nlm_free_svid()
1211 if (ns->ns_ucred) in nlm_free_svid()
1212 crfree(ns->ns_ucred); in nlm_free_svid()
1221 rpcvers_t vers, size_t fhlen, void *fh, off_t size, in nlm_init_lock() argument
1227 if (fl->l_whence == SEEK_END) { in nlm_init_lock()
1228 if (size > OFF_MAX in nlm_init_lock()
1229 || (fl->l_start > 0 && size > OFF_MAX - fl->l_start)) in nlm_init_lock()
1231 start = size + fl->l_start; in nlm_init_lock()
1232 } else if (fl->l_whence == SEEK_SET || fl->l_whence == SEEK_CUR) { in nlm_init_lock()
1233 start = fl->l_start; in nlm_init_lock()
1239 if (fl->l_len < 0) { in nlm_init_lock()
1240 len = -fl->l_len; in nlm_init_lock()
1241 start -= len; in nlm_init_lock()
1245 len = fl->l_len; in nlm_init_lock()
1258 getcredhostname(NULL, oh_space + oh_len, 32 - oh_len); in nlm_init_lock()
1262 lock->caller_name = prison0.pr_hostname; in nlm_init_lock()
1263 lock->fh.n_len = fhlen; in nlm_init_lock()
1264 lock->fh.n_bytes = fh; in nlm_init_lock()
1265 lock->oh.n_len = oh_len; in nlm_init_lock()
1266 lock->oh.n_bytes = oh_space; in nlm_init_lock()
1267 lock->svid = svid; in nlm_init_lock()
1268 lock->l_offset = start; in nlm_init_lock()
1269 lock->l_len = len; in nlm_init_lock()