aboutsummaryrefslogtreecommitdiff
path: root/sys/fs/nfsserver/nfs_nfsdport.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/fs/nfsserver/nfs_nfsdport.c')
-rw-r--r--sys/fs/nfsserver/nfs_nfsdport.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/sys/fs/nfsserver/nfs_nfsdport.c b/sys/fs/nfsserver/nfs_nfsdport.c
index ebc560836205..46be3e051056 100644
--- a/sys/fs/nfsserver/nfs_nfsdport.c
+++ b/sys/fs/nfsserver/nfs_nfsdport.c
@@ -1675,8 +1675,8 @@ out1:
* Link vnode op.
*/
int
-nfsvno_link(struct nameidata *ndp, struct vnode *vp, struct ucred *cred,
- struct thread *p, struct nfsexstuff *exp)
+nfsvno_link(struct nameidata *ndp, struct vnode *vp, nfsquad_t clientid,
+ struct ucred *cred, struct thread *p, struct nfsexstuff *exp)
{
struct vnode *xp;
int error = 0;
@@ -1691,9 +1691,11 @@ nfsvno_link(struct nameidata *ndp, struct vnode *vp, struct ucred *cred,
}
if (!error) {
NFSVOPLOCK(vp, LK_EXCLUSIVE | LK_RETRY);
- if (!VN_IS_DOOMED(vp))
- error = VOP_LINK(ndp->ni_dvp, vp, &ndp->ni_cnd);
- else
+ if (!VN_IS_DOOMED(vp)) {
+ error = nfsrv_checkremove(vp, 0, NULL, clientid, p);
+ if (error == 0)
+ error = VOP_LINK(ndp->ni_dvp, vp, &ndp->ni_cnd);
+ } else
error = EPERM;
if (ndp->ni_dvp == vp) {
vrele(ndp->ni_dvp);