Module Name:    src
Committed By:   hannken
Date:           Fri Mar 16 08:39:54 UTC 2012

Modified Files:
        src/sys/ufs/ext2fs: ext2fs_lookup.c
        src/sys/ufs/ufs: ufs_lookup.c

Log Message:
Fix last commit that broke lookup for dot with op DELETE.

Reviewed by: David Holland <[email protected]>


To generate a diff of this commit:
cvs rdiff -u -r1.68 -r1.69 src/sys/ufs/ext2fs/ext2fs_lookup.c
cvs rdiff -u -r1.112 -r1.113 src/sys/ufs/ufs/ufs_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/ufs/ext2fs/ext2fs_lookup.c
diff -u src/sys/ufs/ext2fs/ext2fs_lookup.c:1.68 src/sys/ufs/ext2fs/ext2fs_lookup.c:1.69
--- src/sys/ufs/ext2fs/ext2fs_lookup.c:1.68	Tue Mar 13 18:41:03 2012
+++ src/sys/ufs/ext2fs/ext2fs_lookup.c	Fri Mar 16 08:39:54 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: ext2fs_lookup.c,v 1.68 2012/03/13 18:41:03 elad Exp $	*/
+/*	$NetBSD: ext2fs_lookup.c,v 1.69 2012/03/16 08:39:54 hannken Exp $	*/
 
 /*
  * Modified for NetBSD 1.2E
@@ -48,7 +48,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ext2fs_lookup.c,v 1.68 2012/03/13 18:41:03 elad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ext2fs_lookup.c,v 1.69 2012/03/16 08:39:54 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -586,18 +586,26 @@ found:
 			results->ulr_count = 0;
 		else
 			results->ulr_count = results->ulr_offset - prevoff;
-		if (flags & ISDOTDOT)
-			VOP_UNLOCK(vdp); /* race to get the inode */
-		error = VFS_VGET(vdp->v_mount, foundino, &tdp);
-		if (flags & ISDOTDOT)
-			vn_lock(vdp, LK_EXCLUSIVE | LK_RETRY);
-		if (error)
-			return (error);
+		if (dp->i_number == foundino) {
+			vref(vdp);
+			tdp = vdp;
+		} else {
+			if (flags & ISDOTDOT)
+				VOP_UNLOCK(vdp); /* race to get the inode */
+			error = VFS_VGET(vdp->v_mount, foundino, &tdp);
+			if (flags & ISDOTDOT)
+				vn_lock(vdp, LK_EXCLUSIVE | LK_RETRY);
+			if (error)
+				return (error);
+		}
 		/*
 		 * Write access to directory required to delete files.
 		 */
 		if ((error = VOP_ACCESS(vdp, VWRITE, cred)) != 0) {
-			vput(tdp);
+			if (dp->i_number == foundino)
+				vrele(tdp);
+			else
+				vput(tdp);
 			return (error);
 		}
 		/*
@@ -611,15 +619,13 @@ found:
 			    tdp, vdp, genfs_can_sticky(cred, dp->i_uid,
 			    VTOI(tdp)->i_uid));
 			if (error) {
-				vput(tdp);
+				if (dp->i_number == foundino)
+					vrele(tdp);
+				else
+					vput(tdp);
 				return (EPERM);
 			}
 		}
-		if (dp->i_number == foundino) {
-			vref(vdp);
-			*vpp = vdp;
-			return (0);
-		}
 		*vpp = tdp;
 		return (0);
 	}

Index: src/sys/ufs/ufs/ufs_lookup.c
diff -u src/sys/ufs/ufs/ufs_lookup.c:1.112 src/sys/ufs/ufs/ufs_lookup.c:1.113
--- src/sys/ufs/ufs/ufs_lookup.c:1.112	Tue Mar 13 18:41:14 2012
+++ src/sys/ufs/ufs/ufs_lookup.c	Fri Mar 16 08:39:54 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: ufs_lookup.c,v 1.112 2012/03/13 18:41:14 elad Exp $	*/
+/*	$NetBSD: ufs_lookup.c,v 1.113 2012/03/16 08:39:54 hannken Exp $	*/
 
 /*
  * Copyright (c) 1989, 1993
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ufs_lookup.c,v 1.112 2012/03/13 18:41:14 elad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ufs_lookup.c,v 1.113 2012/03/16 08:39:54 hannken Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_ffs.h"
@@ -532,19 +532,27 @@ found:
 			results->ulr_count = 0;
 		else
 			results->ulr_count = results->ulr_offset - prevoff;
-		if (flags & ISDOTDOT)
-			VOP_UNLOCK(vdp); /* race to get the inode */
-		error = VFS_VGET(vdp->v_mount, foundino, &tdp);
-		if (flags & ISDOTDOT)
-			vn_lock(vdp, LK_EXCLUSIVE | LK_RETRY);
-		if (error)
-			goto out;
+		if (dp->i_number == foundino) {
+			vref(vdp);
+			tdp = vdp;
+		} else {
+			if (flags & ISDOTDOT)
+				VOP_UNLOCK(vdp); /* race to get the inode */
+			error = VFS_VGET(vdp->v_mount, foundino, &tdp);
+			if (flags & ISDOTDOT)
+				vn_lock(vdp, LK_EXCLUSIVE | LK_RETRY);
+			if (error)
+				goto out;
+		}
 		/*
 		 * Write access to directory required to delete files.
 		 */
 		error = VOP_ACCESS(vdp, VWRITE, cred);
 		if (error) {
-			vput(tdp);
+			if (dp->i_number == foundino)
+				vrele(tdp);
+			else
+				vput(tdp);
 			goto out;
 		}
 		/*
@@ -558,17 +566,14 @@ found:
 			    tdp, vdp, genfs_can_sticky(cred, dp->i_uid,
 			    VTOI(tdp)->i_uid));
 			if (error) {
-				vput(tdp);
+				if (dp->i_number == foundino)
+					vrele(tdp);
+				else
+					vput(tdp);
 				error = EPERM;
 				goto out;
 			}
 		}
-		if (dp->i_number == foundino) {
-			vref(vdp);
-			*vpp = vdp;
-			error = 0;
-			goto out;
-		}
 		*vpp = tdp;
 		error = 0;
 		goto out;

Reply via email to