Date: Sat, 16 Aug 2008 02:48:45 GMT From: "Richard S. Conto" <Richard.Conto@gmail.com> To: freebsd-gnats-submit@FreeBSD.org Subject: kern/126561: NLM (rpclockd) RPC UNLOCK failure (stalls Mac OS X Finder, iTunes, etc?) Message-ID: <200808160248.m7G2mjrj076952@www.freebsd.org> Resent-Message-ID: <200808160250.m7G2o1Ed057095@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 126561 >Category: kern >Synopsis: NLM (rpclockd) RPC UNLOCK failure (stalls Mac OS X Finder, iTunes, etc?) >Confidential: no >Severity: critical >Priority: high >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Sat Aug 16 02:50:01 UTC 2008 >Closed-Date: >Last-Modified: >Originator: Richard S. Conto >Release: 7.0 >Organization: (un)employed at Home >Environment: FreeBSD toolbox.family 7.0-STABLE FreeBSD 7.0-STABLE #0: Fri Aug 15 21:06:19 EDT 2008 rsc@toolbox.family:/usr/src/sys/i386/compile/TOOLBOX i386 >Description: Attempts to remove a lock (UNLOCK) a file mounted on a FreeBSD 7.0 server fail, with repeated messages from the NFS client such as "host:/filesystem not responding" or "nfs server host:/filesystem: lockd not responding" If the client is Mac OS X 10.5.x, this can cause the `Finder' to hang when viewing a folder (directory) mounted on a FreeBSD 7.0 NFS server. This can also cause `iTunes' to hang if it's folder is located on a FreeBSD 7.0 NFS server. Using "wireshark" to monitor the NLM exchange between the FreeBSD 7.0 NFS server and the client, it is clear that when the client use a NLM RPC UNLOCK call, no response is issued by the NFS server. >How-To-Repeat: Requirements: FreeBSD 7.0 NFS server, "rpc_lockd_enable=YES" in /etc/rc.conf Mac OS X 10.5 with NFS mounts specified using the "Directory Utility" .. if possible, test the Mac OS X configuration against an "old" (prior to 8/1/2008) version of FreeBSD 7.0, then upgrade to current. Use `Finder' to open a NFS mounted directory/folder owned by the user. NOTE: This leaves the `Finder' in a slightly unstable state, unable to "logout" or "shutdown". Use a Force-Quit to kill the finder. >Fix: The MINIMAL fix is a simple one-line patch. However, I have a more extensive patch that includes instrumentation to be included since the existing debugging instrumentation is incomplete. *** nlm_prot_server.c Tue Aug 5 06:35:51 2008 --- nlm_prot_server.c.new Fri Aug 15 22:43:00 2008 *************** *** 611,616 **** --- 611,618 ---- char dummy; if (nlm_do_unlock(argp, &res4, rqstp, &rpc)) + return (FALSE) + if (rpc) { nlm4_unlock_res_4(&res4, &dummy, rpc, NULL, nlm_zero_tv); CLNT_RELEASE(rpc); Patch attached with submission follows: Only in src/sys/nlm/: #nlm.h# Only in src/sys/nlm/: TAGS diff -r -c -b -w src/sys/nlm/nlm_prot_impl.c dist/src/sys/nlm/nlm_prot_impl.c *** src/sys/nlm/nlm_prot_impl.c Fri Aug 15 12:05:11 2008 --- dist/src/sys/nlm/nlm_prot_impl.c Tue Aug 5 06:35:51 2008 *************** *** 75,94 **** */ #define NLM_IDLE_PERIOD 5 - - /* - * We can't hold onto RPC handles for too long - the async - * call/reply protocol used by some NLM clients makes it hard - * to tell when they change port numbers (e.g. after a - * reboot). Note that if a client reboots while it isn't - * holding any locks, it won't bother to notify us. We - * expire the RPC handles after two minutes. - */ - - #define NLM_RPC_CREATE_HOLD_TIME 120 - - #define NLM_RPC_TIMEOUT 25 - /* * Support for sysctl vfs.nlm.sysid */ --- 75,80 ---- *************** *** 114,120 **** * Debug level passed in from userland. We also support a sysctl hook * so that it can be changed on a live system. */ ! int nlm_debug_level; SYSCTL_INT(_debug, OID_AUTO, nlm_debug, CTLFLAG_RW, &nlm_debug_level, 0, ""); /* --- 100,106 ---- * Debug level passed in from userland. We also support a sysctl hook * so that it can be changed on a live system. */ ! static int nlm_debug_level; SYSCTL_INT(_debug, OID_AUTO, nlm_debug, CTLFLAG_RW, &nlm_debug_level, 0, ""); /* *************** *** 122,131 **** * value of time_uptime after which we are serving requests normally. */ static time_t nlm_grace_threshold; ! static unsigned int nlm_idle_timeout = NLM_IDLE_TIMEOUT; ! static unsigned int nlm_idle_period = NLM_IDLE_PERIOD; ! static unsigned int nlm_rpc_create_hold_time = NLM_RPC_CREATE_HOLD_TIME; ! static unsigned int nlm_rpc_timeout = NLM_RPC_TIMEOUT; /* * We check for idle hosts if time_uptime is greater than * nlm_next_idle_check, --- 108,114 ---- * value of time_uptime after which we are serving requests normally. */ static time_t nlm_grace_threshold; ! /* * We check for idle hosts if time_uptime is greater than * nlm_next_idle_check, *************** *** 147,168 **** #endif /* - * SYSCTL's in alphabetic order. - */ - - SYSCTL_UINT(_vfs_nlm, OID_AUTO, rpc_timeout, CTLFLAG_RW, &nlm_rpc_timeout, 0, ""); - SYSCTL_UINT(_vfs_nlm, OID_AUTO, rpc_create_hold_time, CTLFLAG_RW, - &nlm_rpc_create_hold_time, 0, ""); - SYSCTL_UINT(_vfs_nlm, OID_AUTO, next_idle_check, CTLFLAG_RD, - &nlm_next_idle_check, 0, "NLM idle host check"); - SYSCTL_UINT(_vfs_nlm, OID_AUTO, idle_timeout, CTLFLAG_RW, - &nlm_idle_timeout, 0, ""); - SYSCTL_UINT(_vfs_nlm, OID_AUTO, idle_period, CTLFLAG_RW, &nlm_idle_period, 0, ""); - SYSCTL_UINT(_vfs_nlm, OID_AUTO, grace_threshold, CTLFLAG_RD, - &nlm_grace_threshold, 0, "NLM grace handling period"); - - - /* * An RPC client handle that can be used to communicate with the local * NSM. */ --- 130,135 ---- *************** *** 261,268 **** static struct nlm_host_list nlm_hosts; /* (g) */ static uint32_t nlm_next_sysid = 1; /* (g) */ - static void nlm_host_get(struct nlm_host *); - static void nlm_host_unmonitor(struct nlm_host *); /**********************************************************************/ --- 228,233 ---- *************** *** 370,376 **** /* * Use the default timeout. */ ! timo.tv_sec = nlm_rpc_timeout; timo.tv_usec = 0; again: uaddr = NULL; --- 335,341 ---- /* * Use the default timeout. */ ! timo.tv_sec = 25; timo.tv_usec = 0; again: uaddr = NULL; *************** *** 429,437 **** (xdrproc_t) xdr_u_short, &port, timo); if (stat == RPC_SUCCESS) { - if (nlm_debug_level >= 1) - printf("NLM: Using RPC port %u\n", port); - switch (ss.ss_family) { case AF_INET: ((struct sockaddr_in *)&ss)->sin_port = --- 394,399 ---- *************** *** 623,632 **** TAILQ_REMOVE(&nlm_hosts, host, nh_link); mtx_unlock(&nlm_global_lock); - if (nlm_debug_level >= 4) - printf ("NLM: destroy host %s (sysid %d)\n", - host->nh_caller_name, host->nh_sysid); - if (host->nh_rpc) CLNT_RELEASE(host->nh_rpc); mtx_destroy(&host->nh_lock); --- 585,590 ---- *************** *** 668,674 **** static void nlm_host_notify(struct nlm_host *host, int newstate) { - unsigned int count; struct nlm_async_lock *af; if (newstate) { --- 626,631 ---- *************** *** 681,687 **** /* * Cancel any pending async locks for this host. */ - count = 0; mtx_lock(&host->nh_lock); while ((af = TAILQ_FIRST(&host->nh_pending)) != NULL) { /* --- 638,643 ---- *************** *** 689,704 **** * nh_pending and free it. */ nlm_cancel_async_lock(af); - count ++; } mtx_unlock(&host->nh_lock); nlm_free_finished_locks(host); - if ((count > 0) && (nlm_debug_level >= 4)) { - printf ("NLM: host %s (sysid %d) - %d pending locks cleared", - host->nh_caller_name, host->nh_sysid, count); - } - /* * The host just rebooted - trash its locks. */ --- 645,654 ---- *************** *** 714,720 **** && host->nh_monstate != NLM_RECOVERING && lf_countlocks(NLM_SYSID_CLIENT | host->nh_sysid) > 0) { host->nh_monstate = NLM_RECOVERING; ! nlm_host_get(host); kthread_create(nlm_client_recovery_start, host, NULL, 0, 0, "NFS lock recovery for %s", host->nh_caller_name); } --- 664,670 ---- && host->nh_monstate != NLM_RECOVERING && lf_countlocks(NLM_SYSID_CLIENT | host->nh_sysid) > 0) { host->nh_monstate = NLM_RECOVERING; ! refcount_acquire(&host->nh_refs); kthread_create(nlm_client_recovery_start, host, NULL, 0, 0, "NFS lock recovery for %s", host->nh_caller_name); } *************** *** 785,817 **** oid = SYSCTL_ADD_NODE(&host->nh_sysctl, SYSCTL_STATIC_CHILDREN(_vfs_nlm_sysid), OID_AUTO, host->nh_sysid_string, CTLFLAG_RD, NULL, ""); - SYSCTL_ADD_STRING(&host->nh_sysctl, SYSCTL_CHILDREN(oid), OID_AUTO, "hostname", CTLFLAG_RD, host->nh_caller_name, 0, ""); - SYSCTL_ADD_INT(&host->nh_sysctl, SYSCTL_CHILDREN(oid), OID_AUTO, "version", CTLFLAG_RD, &host->nh_vers, 0, ""); - SYSCTL_ADD_INT(&host->nh_sysctl, SYSCTL_CHILDREN(oid), OID_AUTO, ! "monitored", CTLFLAG_RD, &host->nh_monstate, 0, "Local monitoring state"); ! ! SYSCTL_ADD_INT(&host->nh_sysctl, SYSCTL_CHILDREN(oid), OID_AUTO, ! "state", CTLFLAG_RD, &host->nh_state, 0, "Last seen state"); ! SYSCTL_ADD_PROC(&host->nh_sysctl, SYSCTL_CHILDREN(oid), OID_AUTO, "lock_count", CTLTYPE_INT | CTLFLAG_RD, host, 0, nlm_host_lock_count_sysctl, "I", ""); - SYSCTL_ADD_PROC(&host->nh_sysctl, SYSCTL_CHILDREN(oid), OID_AUTO, "client_lock_count", CTLTYPE_INT | CTLFLAG_RD, host, 0, nlm_host_client_lock_count_sysctl, "I", ""); - SYSCTL_ADD_UINT(&host->nh_sysctl, SYSCTL_CHILDREN(oid), OID_AUTO, - "idle_timeout", CTLFLAG_RD, &host->nh_idle_timeout, 0, ""); - - SYSCTL_ADD_UINT(&host->nh_sysctl, SYSCTL_CHILDREN(oid), OID_AUTO, - "create_time", CTLFLAG_RD, &host->nh_rpc_create_time, 0, ""); - mtx_lock(&nlm_global_lock); return (host); --- 735,753 ---- oid = SYSCTL_ADD_NODE(&host->nh_sysctl, SYSCTL_STATIC_CHILDREN(_vfs_nlm_sysid), OID_AUTO, host->nh_sysid_string, CTLFLAG_RD, NULL, ""); SYSCTL_ADD_STRING(&host->nh_sysctl, SYSCTL_CHILDREN(oid), OID_AUTO, "hostname", CTLFLAG_RD, host->nh_caller_name, 0, ""); SYSCTL_ADD_INT(&host->nh_sysctl, SYSCTL_CHILDREN(oid), OID_AUTO, "version", CTLFLAG_RD, &host->nh_vers, 0, ""); SYSCTL_ADD_INT(&host->nh_sysctl, SYSCTL_CHILDREN(oid), OID_AUTO, ! "monitored", CTLFLAG_RD, &host->nh_monstate, 0, ""); SYSCTL_ADD_PROC(&host->nh_sysctl, SYSCTL_CHILDREN(oid), OID_AUTO, "lock_count", CTLTYPE_INT | CTLFLAG_RD, host, 0, nlm_host_lock_count_sysctl, "I", ""); SYSCTL_ADD_PROC(&host->nh_sysctl, SYSCTL_CHILDREN(oid), OID_AUTO, "client_lock_count", CTLTYPE_INT | CTLFLAG_RD, host, 0, nlm_host_client_lock_count_sysctl, "I", ""); mtx_lock(&nlm_global_lock); return (host); *************** *** 866,872 **** if (time_uptime <= nlm_next_idle_check) return; ! nlm_next_idle_check = time_uptime + nlm_idle_period; TAILQ_FOREACH(host, &nlm_hosts, nh_link) { if (host->nh_monstate == NLM_MONITORED --- 802,808 ---- if (time_uptime <= nlm_next_idle_check) return; ! nlm_next_idle_check = time_uptime + NLM_IDLE_PERIOD; TAILQ_FOREACH(host, &nlm_hosts, nh_link) { if (host->nh_monstate == NLM_MONITORED *************** *** 876,882 **** || lf_countlocks(NLM_SYSID_CLIENT + host->nh_sysid)) { host->nh_idle_timeout = ! time_uptime + nlm_idle_timeout; mtx_lock(&nlm_global_lock); continue; } --- 812,818 ---- || lf_countlocks(NLM_SYSID_CLIENT + host->nh_sysid)) { host->nh_idle_timeout = ! time_uptime + NLM_IDLE_TIMEOUT; mtx_lock(&nlm_global_lock); continue; } *************** *** 917,925 **** return (NULL); } } ! nlm_host_get(host); ! host->nh_idle_timeout = time_uptime + nlm_idle_timeout; /* * If we have an address for the host, record it so that we --- 853,861 ---- return (NULL); } } ! refcount_acquire(&host->nh_refs); ! host->nh_idle_timeout = time_uptime + NLM_IDLE_TIMEOUT; /* * If we have an address for the host, record it so that we *************** *** 1015,1023 **** memcpy(&host->nh_addr, addr, addr->sa_len); host->nh_vers = vers; } ! nlm_host_get(host); ! host->nh_idle_timeout = time_uptime + nlm_idle_timeout; nlm_check_idle(); --- 951,959 ---- memcpy(&host->nh_addr, addr, addr->sa_len); host->nh_vers = vers; } ! refcount_acquire(&host->nh_refs); ! host->nh_idle_timeout = time_uptime + NLM_IDLE_TIMEOUT; nlm_check_idle(); *************** *** 1037,1043 **** TAILQ_FOREACH(host, &nlm_hosts, nh_link) { if (host->nh_sysid == sysid) { ! nlm_host_get(host); return (host); } } --- 973,979 ---- TAILQ_FOREACH(host, &nlm_hosts, nh_link) { if (host->nh_sysid == sysid) { ! refcount_acquire(&host->nh_refs); return (host); } } *************** *** 1045,1084 **** return (NULL); } - /* - * nlm_host_get() - * - * Update refcount in HOST. - * - * Inverse of nlm_host_release() - */ - - static void nlm_host_get(struct nlm_host *host) - { - if (nlm_debug_level >= 6) - printf("nlm_host_get(): host %s (sysid %d)\n", - host->nh_caller_name, host->nh_sysid); - - refcount_acquire(&host->nh_refs); - - return; - } - - - /* - * nlm_host_release() - * - * Update refcount of HOST, destroy if refcount goes to 0. - * - * inverse of nlm_host_get() - */ - void nlm_host_release(struct nlm_host *host) { - if (nlm_debug_level >= 6) - printf("nlm_host_release(): host %s (sysid %d)\n", - host->nh_caller_name, host->nh_sysid); - if (refcount_release(&host->nh_refs)) { /* * Free the host --- 981,988 ---- *************** *** 1113,1119 **** smmonid.my_id.my_vers = NLM_SM; smmonid.my_id.my_proc = NLM_SM_NOTIFY; ! timo.tv_sec = nlm_rpc_timeout; timo.tv_usec = 0; stat = CLNT_CALL(nlm_nsm, SM_UNMON, (xdrproc_t) xdr_mon, &smmonid, --- 1017,1023 ---- smmonid.my_id.my_vers = NLM_SM; smmonid.my_id.my_proc = NLM_SM_NOTIFY; ! timo.tv_sec = 25; timo.tv_usec = 0; stat = CLNT_CALL(nlm_nsm, SM_UNMON, (xdrproc_t) xdr_mon, &smmonid, *************** *** 1180,1186 **** smmon.mon_id.my_id.my_proc = NLM_SM_NOTIFY; memcpy(smmon.priv, &host->nh_sysid, sizeof(host->nh_sysid)); ! timo.tv_sec = nlm_rpc_timeout; timo.tv_usec = 0; stat = CLNT_CALL(nlm_nsm, SM_MON, (xdrproc_t) xdr_mon, &smmon, --- 1084,1090 ---- smmon.mon_id.my_id.my_proc = NLM_SM_NOTIFY; memcpy(smmon.priv, &host->nh_sysid, sizeof(host->nh_sysid)); ! timo.tv_sec = 25; timo.tv_usec = 0; stat = CLNT_CALL(nlm_nsm, SM_MON, (xdrproc_t) xdr_mon, &smmon, *************** *** 1221,1227 **** * holding any locks, it won't bother to notify us. We * expire the RPC handles after two minutes. */ ! if (host->nh_rpc && time_uptime > host->nh_rpc_create_time + nlm_rpc_create_hold_time) { client = host->nh_rpc; host->nh_rpc = NULL; mtx_unlock(&host->nh_lock); --- 1125,1131 ---- * holding any locks, it won't bother to notify us. We * expire the RPC handles after two minutes. */ ! if (host->nh_rpc && time_uptime > host->nh_rpc_create_time + 2*60) { client = host->nh_rpc; host->nh_rpc = NULL; mtx_unlock(&host->nh_lock); *************** *** 1252,1262 **** CLNT_ACQUIRE(client); mtx_unlock(&host->nh_lock); - if (nlm_debug_level >= 4) { - printf ("NLM: caller = %s (sysid %d), client %p\n", - host->nh_caller_name, host->nh_sysid, client); - } - return (client); } --- 1156,1161 ---- *************** *** 1560,1566 **** memset(&id, 0, sizeof(id)); id.my_name = "NFS NLM"; ! timo.tv_sec = nlm_rpc_timeout; timo.tv_usec = 0; stat = CLNT_CALL(nlm_nsm, SM_UNMON_ALL, (xdrproc_t) xdr_my_id, &id, --- 1459,1465 ---- memset(&id, 0, sizeof(id)); id.my_name = "NFS NLM"; ! timo.tv_sec = 25; timo.tv_usec = 0; stat = CLNT_CALL(nlm_nsm, SM_UNMON_ALL, (xdrproc_t) xdr_my_id, &id, *************** *** 1578,1584 **** if (nlm_debug_level >= 1) printf("NLM: local NSM state is %d\n", smstat.state); - nlm_nsm_state = smstat.state; old_nfs_advlock = nfs_advlock_p; --- 1477,1482 ---- *************** *** 1682,1688 **** nlm_debug_level = uap->debug_level; nlm_grace_threshold = time_uptime + uap->grace_period; ! nlm_next_idle_check = time_uptime + nlm_idle_period; return nlm_server_main(uap->addr_count, uap->addrs); } --- 1580,1586 ---- nlm_debug_level = uap->debug_level; nlm_grace_threshold = time_uptime + uap->grace_period; ! nlm_next_idle_check = time_uptime + NLM_IDLE_PERIOD; return nlm_server_main(uap->addr_count, uap->addrs); } *************** *** 1735,1815 **** vs->vs_mp = vfs_getvfs(&fhp->fh_fsid); if (!vs->vs_mp) { - printf ("NLM: file handle fsid %x:%x STALE, caller = %s (sysid %d)\n", - fhp->fh_fsid.val[0], fhp->fh_fsid.val[1], host->nh_caller_name, - host->nh_sysid); return (ESTALE); } - - if (nlm_debug_level >= 5) { - printf ("NLM: file handle fsid %x:%x - vfs (name='%s', type=%d), caller = %s (sysid %d)\n", - fhp->fh_fsid.val[0], fhp->fh_fsid.val[1], - vs->vs_mp->mnt_vfc->vfc_name, - vs->vs_mp->mnt_vfc->vfc_typenum, - host->nh_caller_name, host->nh_sysid); - } - vs->vs_vfslocked = VFS_LOCK_GIANT(vs->vs_mp); error = VFS_CHECKEXP(vs->vs_mp, (struct sockaddr *)&host->nh_addr, &exflags, &credanon); ! if (error) { ! printf ("NLM: file handle fsid %x:%x VFS_CHECKEXP() failed, error %d, " ! "caller = %s (sysid %d)\n", ! fhp->fh_fsid.val[0], fhp->fh_fsid.val[1], error, ! host->nh_caller_name, host->nh_sysid); goto out; - } if (exflags & MNT_EXRDONLY || (vs->vs_mp->mnt_flag & MNT_RDONLY)) { - printf ("NLM: file handle fsid %x:%x RDONLY, caller = %s (sysid %d)\n", - fhp->fh_fsid.val[0], fhp->fh_fsid.val[1], - host->nh_caller_name, host->nh_sysid); error = EROFS; goto out; } error = VFS_FHTOVP(vs->vs_mp, &fhp->fh_fid, &vs->vs_vp); ! if (error) { ! printf ("NLM: file handle fsid %x:%x VFS_FHTOVP() failed %d, caller = %s (sysid %d)\n", ! fhp->fh_fsid.val[0], fhp->fh_fsid.val[1], error, ! host->nh_caller_name, host->nh_sysid); goto out; - } - vs->vs_vnlocked = TRUE; cred = crget(); freecred = TRUE; if (!svc_getcred(rqstp, cred, NULL)) { error = EINVAL; - printf ("nlm_get_vfs_state(): file handle fsid %x:%x - svc_getcred() failed, " - "caller %s (sysid %d)\n", fhp->fh_fsid.val[0], fhp->fh_fsid.val[1], - host->nh_caller_name, host->nh_sysid); goto out; } if (cred->cr_uid == 0 || (exflags & MNT_EXPORTANON)) { crfree(cred); cred = credanon; freecred = FALSE; - printf("nlm_get_vfs_state(): file handle fsid %x:%x - `cred' becomes anonymous, " - "caller = %s (sysid %d)\n", fhp->fh_fsid.val[0], fhp->fh_fsid.val[1], - host->nh_caller_name, host->nh_sysid); } /* * Check cred. */ error = VOP_ACCESS(vs->vs_vp, VWRITE, cred, curthread); ! if (error) { ! printf("nlm_get_vfs_state(): file handle fsid %x:%x, " ! "VOP_ACCESS(..,VWRITE, {uid=%u,ruid=%u,cvuid=%u,...}, ...) " ! "failed %d, caller = %s (sysid %d)\n", ! fhp->fh_fsid.val[0], fhp->fh_fsid.val[1], cred->cr_uid, ! cred->cr_ruid, cred->cr_svuid, error, host->nh_caller_name, ! host->nh_sysid); goto out; - } #if __FreeBSD_version < 800011 VOP_UNLOCK(vs->vs_vp, 0, curthread); --- 1633,1675 ---- vs->vs_mp = vfs_getvfs(&fhp->fh_fsid); if (!vs->vs_mp) { return (ESTALE); } vs->vs_vfslocked = VFS_LOCK_GIANT(vs->vs_mp); error = VFS_CHECKEXP(vs->vs_mp, (struct sockaddr *)&host->nh_addr, &exflags, &credanon); ! if (error) goto out; if (exflags & MNT_EXRDONLY || (vs->vs_mp->mnt_flag & MNT_RDONLY)) { error = EROFS; goto out; } error = VFS_FHTOVP(vs->vs_mp, &fhp->fh_fid, &vs->vs_vp); ! if (error) goto out; vs->vs_vnlocked = TRUE; cred = crget(); freecred = TRUE; if (!svc_getcred(rqstp, cred, NULL)) { error = EINVAL; goto out; } if (cred->cr_uid == 0 || (exflags & MNT_EXPORTANON)) { crfree(cred); cred = credanon; freecred = FALSE; } /* * Check cred. */ error = VOP_ACCESS(vs->vs_vp, VWRITE, cred, curthread); ! if (error) goto out; #if __FreeBSD_version < 800011 VOP_UNLOCK(vs->vs_vp, 0, curthread); *************** *** 1822,1834 **** if (freecred) crfree(cred); - if (error && nlm_debug_level >= 4) - { - printf ("nlm_get_vfs_state(): caller = %s (sysid %d), fsid %x:%x, error=%d\n", - host->nh_caller_name, host->nh_sysid, - fhp->fh_fsid.val[0], fhp->fh_fsid.val[1], error); - } - return (error); } --- 1682,1687 ---- *************** *** 1880,1886 **** } if (nlm_debug_level >= 3) ! printf("nlm_do_test(): caller_name = %s (sysid %d)\n", host->nh_caller_name, host->nh_sysid); nlm_free_finished_locks(host); --- 1733,1739 ---- } if (nlm_debug_level >= 3) ! printf("nlm_do_test(): caller_name = %s (sysid = %d)\n", host->nh_caller_name, host->nh_sysid); nlm_free_finished_locks(host); *************** *** 1949,1960 **** } out: - if ((result->stat.stat != nlm4_granted) && (nlm_debug_level >= 4)) { - printf ("nlm_do_test(): NLM status %d, host %s (sysid %d)\n", - result->stat.stat, host->nh_caller_name, - host->nh_sysid); - } - nlm_release_vfs_state(&vs); if (rpcp) *rpcp = nlm_host_get_rpc(host); --- 1802,1807 ---- *************** *** 1983,1989 **** } if (nlm_debug_level >= 3) ! printf("nlm_do_lock(): caller_name = %s (sysid %d)\n", host->nh_caller_name, host->nh_sysid); if (monitor && host->nh_state && argp->state --- 1830,1836 ---- } if (nlm_debug_level >= 3) ! printf("nlm_do_lock(): caller_name = %s (sysid = %d)\n", host->nh_caller_name, host->nh_sysid); if (monitor && host->nh_state && argp->state *************** *** 2138,2150 **** } out: - if ((result->stat.stat != nlm4_granted) && (nlm_debug_level >= 4)) { - printf ("nlm_do_lock(): NLM status %d, host %s (sysid %d)\n", - result->stat.stat, host->nh_caller_name, - host->nh_sysid); - - } - nlm_release_vfs_state(&vs); if (rpcp) *rpcp = nlm_host_get_rpc(host); --- 1985,1990 ---- *************** *** 2174,2180 **** } if (nlm_debug_level >= 3) ! printf("nlm_do_cancel(): caller_name = %s (sysid %d)\n", host->nh_caller_name, host->nh_sysid); nlm_free_finished_locks(host); --- 2014,2020 ---- } if (nlm_debug_level >= 3) ! printf("nlm_do_cancel(): caller_name = %s (sysid = %d)\n", host->nh_caller_name, host->nh_sysid); nlm_free_finished_locks(host); *************** *** 2236,2247 **** mtx_unlock(&host->nh_lock); out: - if ((result->stat.stat != nlm4_granted) && (nlm_debug_level >= 4)) { - printf ("nlm_do_cancel(): NLM status %d, host %s (sysid %d)\n", - result->stat.stat, host->nh_caller_name, - host->nh_sysid); - } - nlm_release_vfs_state(&vs); if (rpcp) *rpcp = nlm_host_get_rpc(host); --- 2076,2081 ---- *************** *** 2270,2276 **** } if (nlm_debug_level >= 3) ! printf("nlm_do_unlock(): caller_name = %s (sysid %d)\n", host->nh_caller_name, host->nh_sysid); nlm_free_finished_locks(host); --- 2104,2110 ---- } if (nlm_debug_level >= 3) ! printf("nlm_do_unlock(): caller_name = %s (sysid = %d)\n", host->nh_caller_name, host->nh_sysid); nlm_free_finished_locks(host); *************** *** 2305,2326 **** result->stat.stat = nlm4_granted; out: - if ((result->stat.stat != nlm4_granted) && (nlm_debug_level >= 4)) { - printf ("nlm_do_unlock(): NLM status %d, host %s (sysid %d)\n", - result->stat.stat, host->nh_caller_name, - host->nh_sysid); - } - nlm_release_vfs_state(&vs); if (rpcp) *rpcp = nlm_host_get_rpc(host); - nlm_host_release(host); - return (0); } - int nlm_do_granted(nlm4_testargs *argp, nlm4_res *result, struct svc_req *rqstp, --- 2139,2151 ---- *************** *** 2339,2348 **** return (ENOMEM); } - if (nlm_debug_level >= 3) - printf("nlm_do_granted(): caller_name = %s (sysid %d)\n", - host->nh_caller_name, host->nh_sysid); - nlm_copy_netobj(&result->cookie, &argp->cookie, M_RPC); result->stat.stat = nlm4_denied; --- 2164,2169 ---- *************** *** 2372,2392 **** void nlm_do_free_all(nlm4_notify *argp) { - unsigned int count = 0; struct nlm_host *host, *thost; TAILQ_FOREACH_SAFE(host, &nlm_hosts, nh_link, thost) { ! if (!strcmp(host->nh_caller_name, argp->name)) { nlm_host_notify(host, argp->state); - count ++; } } - if ((count > 0) && (nlm_debug_level >= 3)) - printf("nlm_do_free_all(): %d hosts freed\n", count); - - } - /* * Kernel module glue */ --- 2193,2206 ---- void nlm_do_free_all(nlm4_notify *argp) { struct nlm_host *host, *thost; TAILQ_FOREACH_SAFE(host, &nlm_hosts, nh_link, thost) { ! if (!strcmp(host->nh_caller_name, argp->name)) nlm_host_notify(host, argp->state); } } /* * Kernel module glue */ Only in src/sys/nlm/: nlm_prot_impl.c~ diff -r -c -b -w src/sys/nlm/nlm_prot_server.c dist/src/sys/nlm/nlm_prot_server.c *** src/sys/nlm/nlm_prot_server.c Fri Aug 15 20:43:43 2008 --- dist/src/sys/nlm/nlm_prot_server.c Tue Aug 5 06:35:51 2008 *************** *** 46,53 **** * Convert between various versions of the protocol structures. */ - extern int nlm_debug_level; - static void nlm_convert_to_nlm4_lock(struct nlm4_lock *dst, struct nlm_lock *src) { --- 46,51 ---- *************** *** 236,251 **** nlm_testres res; CLIENT *rpc; char dummy; - static char func[] = "nlm_test_msg_1_svc()"; - - if (nlm_debug_level >= 7) - printf("%s: entered\n", func); args4.cookie = argp->cookie; args4.exclusive = argp->exclusive; nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock); ! if (!nlm_do_test(&args4, &res4, rqstp, &rpc)) { res.cookie = res4.cookie; res.stat.stat = nlm_convert_to_nlm_stats(res4.stat.stat); if (res.stat.stat == nlm_denied) --- 234,247 ---- nlm_testres res; CLIENT *rpc; char dummy; args4.cookie = argp->cookie; args4.exclusive = argp->exclusive; nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock); ! if (nlm_do_test(&args4, &res4, rqstp, &rpc)) ! return (FALSE); ! res.cookie = res4.cookie; res.stat.stat = nlm_convert_to_nlm_stats(res4.stat.stat); if (res.stat.stat == nlm_denied) *************** *** 256,272 **** if (rpc) { nlm_test_res_1(&res, &dummy, rpc, NULL, nlm_zero_tv); CLNT_RELEASE(rpc); - if (nlm_debug_level >= 7) - printf("%s: resp\n", func); - } - else if (nlm_debug_level >= 7) { - printf("%s: drop (no client)\n", func); - } - } - else if (nlm_debug_level >= 7) { - printf("%s: drop (error)\n", func); } - xdr_free((xdrproc_t) xdr_nlm_testres, &res); return (FALSE); --- 252,258 ---- *************** *** 280,286 **** nlm_res res; CLIENT *rpc; char dummy; - static char func[] = "nlm_lock_msg_1_svc()"; args4.cookie = argp->cookie; args4.block = argp->block; --- 266,271 ---- *************** *** 289,314 **** args4.reclaim = argp->reclaim; args4.state = argp->state; ! if (nlm_debug_level >= 7) ! printf("%s: entered\n", func); - if (!nlm_do_lock(&args4, &res4, rqstp, TRUE, &rpc)) { nlm_convert_to_nlm_res(&res, &res4); if (rpc) { nlm_lock_res_1(&res, &dummy, rpc, NULL, nlm_zero_tv); CLNT_RELEASE(rpc); - if (nlm_debug_level >= 7) - printf("%s: resp\n", func); - } - else if (nlm_debug_level >= 7) { - printf("%s: drop (no client)\n", func); - } } - else if (nlm_debug_level >= 7) { - printf("%s: drop (error)\n", func); - } - xdr_free((xdrproc_t) xdr_nlm_res, &res); return (FALSE); --- 274,288 ---- args4.reclaim = argp->reclaim; args4.state = argp->state; ! if (nlm_do_lock(&args4, &res4, rqstp, TRUE, &rpc)) ! return (FALSE); nlm_convert_to_nlm_res(&res, &res4); if (rpc) { nlm_lock_res_1(&res, &dummy, rpc, NULL, nlm_zero_tv); CLNT_RELEASE(rpc); } xdr_free((xdrproc_t) xdr_nlm_res, &res); return (FALSE); *************** *** 322,354 **** nlm_res res; CLIENT *rpc; char dummy; - static char func[] = "nlm_cancel_msg_1_svc()"; args4.cookie = argp->cookie; args4.block = argp->block; args4.exclusive = argp->exclusive; nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock); ! if (nlm_debug_level >= 7) ! printf("%s: entered\n", func); - if (!nlm_do_cancel(&args4, &res4, rqstp, &rpc)) { nlm_convert_to_nlm_res(&res, &res4); if (rpc) { nlm_cancel_res_1(&res, &dummy, rpc, NULL, nlm_zero_tv); CLNT_RELEASE(rpc); - if (nlm_debug_level >= 7) - printf("%s: resp\n", func); } - else if (nlm_debug_level >= 7) { - printf("%s: drop (no client)\n", func); - } - } - else if (nlm_debug_level >= 7) { - printf("%s: drop (error)\n", func); - } - xdr_free((xdrproc_t) xdr_nlm_res, &res); return (FALSE); --- 296,316 ---- nlm_res res; CLIENT *rpc; char dummy; args4.cookie = argp->cookie; args4.block = argp->block; args4.exclusive = argp->exclusive; nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock); ! if (nlm_do_cancel(&args4, &res4, rqstp, &rpc)) ! return (FALSE); nlm_convert_to_nlm_res(&res, &res4); if (rpc) { nlm_cancel_res_1(&res, &dummy, rpc, NULL, nlm_zero_tv); CLNT_RELEASE(rpc); } xdr_free((xdrproc_t) xdr_nlm_res, &res); return (FALSE); *************** *** 362,393 **** nlm_res res; CLIENT *rpc; char dummy; - static char func[] = "nlm_unlock_msg_1_svc()"; args4.cookie = argp->cookie; nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock); ! if (nlm_debug_level >= 7) ! printf("%s: entered\n", func); - if (!nlm_do_unlock(&args4, &res4, rqstp, &rpc)) { nlm_convert_to_nlm_res(&res, &res4); if (rpc) { nlm_unlock_res_1(&res, &dummy, rpc, NULL, nlm_zero_tv); CLNT_RELEASE(rpc); - - if (nlm_debug_level >= 7) - printf("%s: resp\n", func); - } - else if (nlm_debug_level >= 7) { - printf("%s: drop (no client)\n", func); } - } - else if (nlm_debug_level >= 7) { - printf("%s: drop (error)\n", func); - } - xdr_free((xdrproc_t) xdr_nlm_res, &res); return (FALSE); --- 324,342 ---- nlm_res res; CLIENT *rpc; char dummy; args4.cookie = argp->cookie; nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock); ! if (nlm_do_unlock(&args4, &res4, rqstp, &rpc)) ! return (FALSE); nlm_convert_to_nlm_res(&res, &res4); if (rpc) { nlm_unlock_res_1(&res, &dummy, rpc, NULL, nlm_zero_tv); CLNT_RELEASE(rpc); } xdr_free((xdrproc_t) xdr_nlm_res, &res); return (FALSE); *************** *** 401,433 **** nlm_res res; CLIENT *rpc; char dummy; - static char func[] = "nlm_granted_msg_1_svc()"; args4.cookie = argp->cookie; args4.exclusive = argp->exclusive; nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock); ! if (nlm_debug_level >= 7) ! printf("%s: entered\n", func); - if (!nlm_do_granted(&args4, &res4, rqstp, &rpc)) { nlm_convert_to_nlm_res(&res, &res4); if (rpc) { nlm_granted_res_1(&res, &dummy, rpc, NULL, nlm_zero_tv); CLNT_RELEASE(rpc); - if (nlm_debug_level >= 7) - printf("%s: resp\n", func); - } - else if (nlm_debug_level >= 7) { - printf("%s: drop (no client)\n", func); - } - } - else if (nlm_debug_level >= 7) { - printf("%s: drop (error)\n", func); } - - xdr_free((xdrproc_t) xdr_nlm_res, &res); return (FALSE); --- 350,369 ---- nlm_res res; CLIENT *rpc; char dummy; args4.cookie = argp->cookie; args4.exclusive = argp->exclusive; nlm_convert_to_nlm4_lock(&args4.alock, &argp->alock); ! if (nlm_do_granted(&args4, &res4, rqstp, &rpc)) ! return (FALSE); nlm_convert_to_nlm_res(&res, &res4); if (rpc) { nlm_granted_res_1(&res, &dummy, rpc, NULL, nlm_zero_tv); CLNT_RELEASE(rpc); } xdr_free((xdrproc_t) xdr_nlm_res, &res); return (FALSE); *************** *** 637,662 **** nlm4_res res4; CLIENT *rpc; char dummy; - char func[] = "nlm4_lock_msg_4_svc()"; ! if (nlm_debug_level >= 7) ! printf("%s: entered\n", func); ! ! if (!nlm_do_lock(argp, &res4, rqstp, TRUE, &rpc)) { if (rpc) { nlm4_lock_res_4(&res4, &dummy, rpc, NULL, nlm_zero_tv); CLNT_RELEASE(rpc); - if (nlm_debug_level >= 7) - printf("%s: resp\n", func); - } - else if (nlm_debug_level >= 7) { - printf("%s: drop (no client)\n", func); - } - } - else if (nlm_debug_level >= 7) { - printf("%s: drop (error)\n", func); } - xdr_free((xdrproc_t) xdr_nlm4_res, &res4); return (FALSE); --- 573,585 ---- nlm4_res res4; CLIENT *rpc; char dummy; ! if (nlm_do_lock(argp, &res4, rqstp, TRUE, &rpc)) ! return (FALSE); if (rpc) { nlm4_lock_res_4(&res4, &dummy, rpc, NULL, nlm_zero_tv); CLNT_RELEASE(rpc); } xdr_free((xdrproc_t) xdr_nlm4_res, &res4); return (FALSE); *************** *** 668,694 **** nlm4_res res4; CLIENT *rpc; char dummy; - static char func[] = "nlm4_camcel_msg_4_svc()"; - - if (nlm_debug_level >= 7) - printf("%s: entered\n", func); ! if (!nlm_do_cancel(argp, &res4, rqstp, &rpc)) { if (rpc) { nlm4_cancel_res_4(&res4, &dummy, rpc, NULL, nlm_zero_tv); CLNT_RELEASE(rpc); - if (nlm_debug_level >= 7) - printf("%s: resp\n", func); - } - else if (nlm_debug_level >= 7) { - printf("%s: drop (no client)\n", func); } - } - else if (nlm_debug_level >= 7) { - printf("%s: drop (error)\n", func); - } - - xdr_free((xdrproc_t) xdr_nlm4_res, &res4); return (FALSE); --- 591,603 ---- nlm4_res res4; CLIENT *rpc; char dummy; ! if (nlm_do_cancel(argp, &res4, rqstp, &rpc)) ! return (FALSE); if (rpc) { nlm4_cancel_res_4(&res4, &dummy, rpc, NULL, nlm_zero_tv); CLNT_RELEASE(rpc); } xdr_free((xdrproc_t) xdr_nlm4_res, &res4); return (FALSE); *************** *** 700,726 **** nlm4_res res4; CLIENT *rpc; char dummy; - static char func[] = "nlm4_unlock_msg_4_svc()"; - - if (nlm_debug_level >= 7) - printf("%s: entered\n", func); ! if (!nlm_do_unlock(argp, &res4, rqstp, &rpc)) { if (rpc) { nlm4_unlock_res_4(&res4, &dummy, rpc, NULL, nlm_zero_tv); CLNT_RELEASE(rpc); - - if (nlm_debug_level >= 7) - printf("%s: resp\n", func); - } - else if (nlm_debug_level >= 7) { - printf("%s: drop (no client)\n", func); } - } - else if (nlm_debug_level >= 7) { - printf("%s: drop (error)\n", func); - } - xdr_free((xdrproc_t) xdr_nlm4_res, &res4); return (FALSE); --- 609,620 ---- nlm4_res res4; CLIENT *rpc; char dummy; ! if (nlm_do_unlock(argp, &res4, rqstp, &rpc)) if (rpc) { nlm4_unlock_res_4(&res4, &dummy, rpc, NULL, nlm_zero_tv); CLNT_RELEASE(rpc); } xdr_free((xdrproc_t) xdr_nlm4_res, &res4); return (FALSE); *************** *** 732,757 **** nlm4_res res4; CLIENT *rpc; char dummy; - static char func[] = "nlm4_granted_msg_4_svc()"; ! if (nlm_debug_level >= 7) ! printf("%s: entered\n", func); ! ! if (!nlm_do_granted(argp, &res4, rqstp, &rpc)) { if (rpc) { nlm4_granted_res_4(&res4, &dummy, rpc, NULL, nlm_zero_tv); CLNT_RELEASE(rpc); - if (nlm_debug_level >= 7) - printf("%s: resp\n", func); - } - else if (nlm_debug_level >= 7) { - printf("%s: drop (no client)\n", func); } - } - else if (nlm_debug_level >= 7) { - printf("%s: drop (error)\n", func); - } - xdr_free((xdrproc_t) xdr_nlm4_res, &res4); return (FALSE); --- 626,638 ---- nlm4_res res4; CLIENT *rpc; char dummy; ! if (nlm_do_granted(argp, &res4, rqstp, &rpc)) ! return (FALSE); if (rpc) { nlm4_granted_res_4(&res4, &dummy, rpc, NULL, nlm_zero_tv); CLNT_RELEASE(rpc); } xdr_free((xdrproc_t) xdr_nlm4_res, &res4); return (FALSE); Only in src/sys/nlm/: nlm_prot_server.c~ >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200808160248.m7G2mjrj076952>