diff options
author | rmacklem <rmacklem@FreeBSD.org> | 2011-08-02 11:28:42 +0000 |
---|---|---|
committer | rmacklem <rmacklem@FreeBSD.org> | 2011-08-02 11:28:42 +0000 |
commit | afa0f6e53c883c2b17ed113f86d0c4bc14584a62 (patch) | |
tree | 3dfc99a733203a34c082a3b8d3b6ad3bd587824b /sys/fs/nfsclient/nfsnode.h | |
parent | 9a3c5b3af4f421934c726d220efd030e2c18fa45 (diff) | |
download | FreeBSD-src-afa0f6e53c883c2b17ed113f86d0c4bc14584a62.zip FreeBSD-src-afa0f6e53c883c2b17ed113f86d0c4bc14584a62.tar.gz |
Fix a LOR in the NFS client which could cause a deadlock.
This was reported to the mailing list freebsd-net@freebsd.org
on July 21, 2011 under the subject "LOR with nfsclient sillyrename".
The LOR occurred when nfs_inactive() called vrele(sp->s_dvp)
while holding the vnode lock on the file in s_dvp. This patch
modifies the client so that it performs the vrele(sp->s_dvp)
as a separate task to avoid the LOR. This fix was discussed
with jhb@ and kib@, who both proposed variations of it.
Tested by: pho, jlott at averesystems.com
Submitted by: jhb (earlier version)
Reviewed by: kib
Approved by: re (kib)
MFC after: 2 weeks
Diffstat (limited to 'sys/fs/nfsclient/nfsnode.h')
-rw-r--r-- | sys/fs/nfsclient/nfsnode.h | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/sys/fs/nfsclient/nfsnode.h b/sys/fs/nfsclient/nfsnode.h index 1d1c89c..c29805d 100644 --- a/sys/fs/nfsclient/nfsnode.h +++ b/sys/fs/nfsclient/nfsnode.h @@ -35,11 +35,14 @@ #ifndef _NFSCLIENT_NFSNODE_H_ #define _NFSCLIENT_NFSNODE_H_ +#include <sys/_task.h> + /* * Silly rename structure that hangs off the nfsnode until the name * can be removed by nfs_inactive() */ struct sillyrename { + struct task s_task; struct ucred *s_cred; struct vnode *s_dvp; long s_namlen; |