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;