NFS locking question
Kris Kennaway
kris at obsecurity.org
Tue Feb 28 02:21:51 PST 2006
On Tue, Feb 28, 2006 at 11:14:53AM +0100, Patrick M. Hausen wrote:
> Hi, all!
>
> In our local office network we have a rather old FreeBSD 5.2.1
> server acting as an NFS server for several other systems, mostly
> running 6.0.
>
> >From time to time we experience processes on the NFS clients
> hanging in statd "D" with wchan "lockd" when accessing files
> over NFS.
Try the attached patch on the 6.0 machines:
Index: usr.sbin/rpc.lockd/lock_proc.c
===================================================================
RCS file: /home/ncvs/src/usr.sbin/rpc.lockd/lock_proc.c,v
retrieving revision 1.18
retrieving revision 1.17
diff -u -u -r1.18 -r1.17
--- usr.sbin/rpc.lockd/lock_proc.c 3 Feb 2005 22:21:19 -0000 1.18
+++ usr.sbin/rpc.lockd/lock_proc.c 9 Oct 2004 15:36:13 -0000 1.17
@@ -62,8 +62,6 @@
#define CLIENT_CACHE_SIZE 64 /* No. of client sockets cached */
#define CLIENT_CACHE_LIFETIME 120 /* In seconds */
-#define getrpcaddr(rqstp) (struct sockaddr *)(svc_getrpccaller((rqstp)->rq_xprt)->buf)
-
static void log_from_addr(const char *, struct svc_req *);
static void log_netobj(netobj *obj);
static int addrcmp(struct sockaddr *, struct sockaddr *);
@@ -196,7 +194,7 @@
{
CLIENT *client;
struct timeval retry_time, time_now;
- int error, i;
+ int i;
const char *netid;
struct netconfig *nconf;
char host[NI_MAXHOST];
@@ -243,11 +241,9 @@
* Need a host string for clnt_tp_create. Use NI_NUMERICHOST
* to avoid DNS lookups.
*/
- error = getnameinfo(host_addr, host_addr->sa_len, host, sizeof host,
- NULL, 0, NI_NUMERICHOST);
- if (error != 0) {
- syslog(LOG_ERR, "unable to get name string for caller: %s",
- gai_strerror(error));
+ if (getnameinfo(host_addr, host_addr->sa_len, host, sizeof host,
+ NULL, 0, NI_NUMERICHOST) != 0) {
+ syslog(LOG_ERR, "unable to get name string for caller");
return NULL;
}
@@ -566,7 +562,8 @@
res.cookie = arg->cookie;
res.stat.stat = getlock(&arg4, rqstp, LOCK_ASYNC | LOCK_MON);
- transmit_result(NLM_LOCK_RES, &res, getrpcaddr(rqstp));
+ transmit_result(NLM_LOCK_RES, &res,
+ (struct sockaddr *)svc_getcaller(rqstp->rq_xprt));
return (NULL);
}
@@ -620,7 +617,8 @@
* a lock to cancel, so this call always fails.
*/
res.stat.stat = unlock(&arg4, LOCK_CANCEL);
- transmit_result(NLM_CANCEL_RES, &res, getrpcaddr(rqstp));
+ transmit_result(NLM_CANCEL_RES, &res,
+ (struct sockaddr *)svc_getcaller(rqstp->rq_xprt));
return (NULL);
}
@@ -667,7 +665,8 @@
res.stat.stat = unlock(&arg4, 0);
res.cookie = arg->cookie;
- transmit_result(NLM_UNLOCK_RES, &res, getrpcaddr(rqstp));
+ transmit_result(NLM_UNLOCK_RES, &res,
+ (struct sockaddr *)svc_getcaller(rqstp->rq_xprt));
return (NULL);
}
@@ -724,7 +723,8 @@
nlm_granted, NULL, NLM_VERS) == 0 ?
nlm_granted : nlm_denied;
- transmit_result(NLM_GRANTED_RES, &res, getrpcaddr(rqstp));
+ transmit_result(NLM_GRANTED_RES, &res,
+ (struct sockaddr *)svc_getcaller(rqstp->rq_xprt));
return (NULL);
}
@@ -1067,7 +1067,8 @@
res.cookie = arg->cookie;
res.stat.stat = getlock(arg, rqstp, LOCK_MON | LOCK_ASYNC | LOCK_V4);
- transmit4_result(NLM4_LOCK_RES, &res, getrpcaddr(rqstp));
+ transmit4_result(NLM4_LOCK_RES, &res,
+ (struct sockaddr *)svc_getcaller(rqstp->rq_xprt));
return (NULL);
}
@@ -1115,7 +1116,8 @@
* a lock to cancel, so this call always fails.
*/
res.stat.stat = unlock(&arg->alock, LOCK_CANCEL | LOCK_V4);
- transmit4_result(NLM4_CANCEL_RES, &res, getrpcaddr(rqstp));
+ transmit4_result(NLM4_CANCEL_RES, &res,
+ (struct sockaddr *)svc_getcaller(rqstp->rq_xprt));
return (NULL);
}
@@ -1156,7 +1158,8 @@
res.stat.stat = unlock(&arg->alock, LOCK_V4);
res.cookie = arg->cookie;
- transmit4_result(NLM4_UNLOCK_RES, &res, getrpcaddr(rqstp));
+ transmit4_result(NLM4_UNLOCK_RES, &res,
+ (struct sockaddr *)svc_getcaller(rqstp->rq_xprt));
return (NULL);
}
@@ -1212,7 +1215,8 @@
res.stat.stat = lock_answer(arg->alock.svid, &arg->cookie,
nlm4_granted, NULL, NLM_VERS4) == 0 ?
nlm4_granted : nlm4_denied;
- transmit4_result(NLM4_GRANTED_RES, &res, getrpcaddr(rqstp));
+ transmit4_result(NLM4_GRANTED_RES, &res,
+ (struct sockaddr *)svc_getrpccaller(rqstp->rq_xprt)->buf);
return (NULL);
}
Kris
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-stable/attachments/20060228/d5d714f9/attachment-0001.bin
More information about the freebsd-stable
mailing list