diff options
author | imp <imp@FreeBSD.org> | 1999-02-26 05:34:16 +0000 |
---|---|---|
committer | imp <imp@FreeBSD.org> | 1999-02-26 05:34:16 +0000 |
commit | b4c5cb05603484a51d90037ef2c7bb6d35115c2b (patch) | |
tree | 88362d61a3396da108fc00f5c16fe2784708d102 /sys/ufs/ufs | |
parent | f508af76207faff73c41e390b94663e30c6ad40a (diff) | |
download | FreeBSD-src-b4c5cb05603484a51d90037ef2c7bb6d35115c2b.zip FreeBSD-src-b4c5cb05603484a51d90037ef2c7bb6d35115c2b.tar.gz |
Fix last commit based on feedback from Guido, Bruce and Terry.
Specifically, the test was in the wrong place, lacked a cast, didn't
unlock the node, and exited to bad rather than abortit. Now we don't
allow renaming of a file with LINK_MAX references. Move the test to
earlier in the code as it is closer to where ip is obtained, as that
is the style of the rest of the function.
Didn't fix the problems bruce pointed out in the rename man page to
include EMLINK, nor address his complaints about how the whole idea of
incrementing the link count during a rename is potentially asking for
trouble.
Also didn't try to correct potential problem Terry pointed out with
decrements not being similarly protected against underflow.
Diffstat (limited to 'sys/ufs/ufs')
-rw-r--r-- | sys/ufs/ufs/ufs_vnops.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/sys/ufs/ufs/ufs_vnops.c b/sys/ufs/ufs/ufs_vnops.c index 7169e65..98a8ccb 100644 --- a/sys/ufs/ufs/ufs_vnops.c +++ b/sys/ufs/ufs/ufs_vnops.c @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)ufs_vnops.c 8.27 (Berkeley) 5/27/95 - * $Id: ufs_vnops.c,v 1.108 1999/02/25 05:35:53 dillon Exp $ + * $Id: ufs_vnops.c,v 1.109 1999/02/25 09:52:46 imp Exp $ */ #include "opt_quota.h" @@ -978,6 +978,11 @@ abortit: goto abortit; dp = VTOI(fdvp); ip = VTOI(fvp); + if ((nlink_t) ip->i_nlink >= LINK_MAX) { + VOP_UNLOCK(fvp, 0, p); + error = EMLINK; + goto abortit; + } if ((ip->i_flags & (NOUNLINK | IMMUTABLE | APPEND)) || (dp->i_flags & APPEND)) { VOP_UNLOCK(fvp, 0, p); @@ -1017,10 +1022,6 @@ abortit: * completing our work, the link count * may be wrong, but correctable. */ - if (ip->i_nlink >= LINK_MAX) { - error = EMLINK; - goto bad; - } ip->i_effnlink++; ip->i_nlink++; ip->i_flag |= IN_CHANGE; |