Module Name: src
Committed By: dholland
Date: Mon Apr 11 02:20:00 UTC 2011
Modified Files:
src/sys/kern: vfs_lookup.c
Log Message:
description:
Simplify refcount handling/cleanup in three places.
To generate a diff of this commit:
cvs rdiff -u -r1.169 -r1.170 src/sys/kern/vfs_lookup.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/kern/vfs_lookup.c
diff -u src/sys/kern/vfs_lookup.c:1.169 src/sys/kern/vfs_lookup.c:1.170
--- src/sys/kern/vfs_lookup.c:1.169 Mon Apr 11 02:19:42 2011
+++ src/sys/kern/vfs_lookup.c Mon Apr 11 02:20:00 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: vfs_lookup.c,v 1.169 2011/04/11 02:19:42 dholland Exp $ */
+/* $NetBSD: vfs_lookup.c,v 1.170 2011/04/11 02:20:00 dholland Exp $ */
/*
* Copyright (c) 1982, 1986, 1989, 1993
@@ -37,7 +37,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_lookup.c,v 1.169 2011/04/11 02:19:42 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_lookup.c,v 1.170 2011/04/11 02:20:00 dholland Exp $");
#include "opt_magiclinks.h"
@@ -1228,12 +1228,13 @@
* matches that returned for "/" and loop
* forever. So convert it to the real root.
*/
- if (searchdir == foundobj)
- vrele(foundobj);
- else
- if (searchdir != NULL)
+ if (searchdir != NULL) {
+ if (searchdir == foundobj)
+ vrele(searchdir);
+ else
vput(searchdir);
- searchdir = NULL;
+ searchdir = NULL;
+ }
vput(foundobj);
foundobj = ndp->ni_rootdir;
vref(foundobj);
@@ -1249,6 +1250,15 @@
if (cnp->cn_nameiop != LOOKUP &&
(searchdir == NULL ||
searchdir->v_mount != foundobj->v_mount)) {
+ if (searchdir) {
+ vput(searchdir);
+ }
+ vput(foundobj);
+ foundobj = NULL;
+ ndp->ni_dvp = NULL;
+ ndp->ni_vp = NULL;
+ state->attempt_retry = 1;
+
switch (cnp->cn_nameiop) {
case CREATE:
error = EEXIST;
@@ -1260,14 +1270,6 @@
default:
KASSERT(0);
}
- if (searchdir) {
- vput(searchdir);
- }
- vput(foundobj);
- foundobj = NULL;
- ndp->ni_dvp = NULL;
- ndp->ni_vp = NULL;
- state->attempt_retry = 1;
return (error);
}
@@ -1278,12 +1280,16 @@
if (state->rdonly &&
(cnp->cn_nameiop == DELETE || cnp->cn_nameiop == RENAME)) {
error = EROFS;
- if (foundobj != searchdir) {
- vput(foundobj);
- }
if (searchdir) {
- vput(searchdir);
+ if (foundobj != searchdir) {
+ vput(searchdir);
+ } else {
+ vrele(searchdir);
+ }
+ searchdir = NULL;
}
+ vput(foundobj);
+ foundobj = NULL;
ndp->ni_dvp = NULL;
ndp->ni_vp = NULL;
state->attempt_retry = 1;