Deleted Added
full compact
vfs_cache.c (91690) vfs_cache.c (92130)
1/*
2 * Copyright (c) 1989, 1993, 1995
3 * The Regents of the University of California. All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Poul-Henning Kamp of the FreeBSD Project.
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 20 unchanged lines hidden (view full) ---

29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * SUCH DAMAGE.
35 *
36 * @(#)vfs_cache.c 8.5 (Berkeley) 3/22/95
1/*
2 * Copyright (c) 1989, 1993, 1995
3 * The Regents of the University of California. All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Poul-Henning Kamp of the FreeBSD Project.
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 20 unchanged lines hidden (view full) ---

29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * SUCH DAMAGE.
35 *
36 * @(#)vfs_cache.c 8.5 (Berkeley) 3/22/95
37 * $FreeBSD: head/sys/kern/vfs_cache.c 91690 2002-03-05 15:38:49Z eivind $
37 * $FreeBSD: head/sys/kern/vfs_cache.c 92130 2002-03-12 04:00:11Z jeff $
38 */
39
40#include <sys/param.h>
41#include <sys/systm.h>
42#include <sys/kernel.h>
43#include <sys/lock.h>
44#include <sys/mutex.h>
45#include <sys/sysctl.h>

--- 519 unchanged lines hidden (view full) ---

565
566 error = VOP_ACCESS(dvp, VEXEC, cred, td);
567
568 if (error)
569 return (error);
570
571 error = cache_lookup(dvp, vpp, cnp);
572
38 */
39
40#include <sys/param.h>
41#include <sys/systm.h>
42#include <sys/kernel.h>
43#include <sys/lock.h>
44#include <sys/mutex.h>
45#include <sys/sysctl.h>

--- 519 unchanged lines hidden (view full) ---

565
566 error = VOP_ACCESS(dvp, VEXEC, cred, td);
567
568 if (error)
569 return (error);
570
571 error = cache_lookup(dvp, vpp, cnp);
572
573#ifdef LOOKUP_SHARED
574 if (!error) {
575 /* We do this because the rest of the system now expects to get
576 * a shared lock, which is later upgraded if LOCKSHARED is not
577 * set. We have so many cases here because of bugs that yield
578 * inconsistant lock states. This all badly needs to be fixed
579 */
580 error = VOP_CACHEDLOOKUP(dvp, vpp, cnp);
581 if (!error) {
582 int flock;
583
584 flock = VOP_ISLOCKED(*vpp, td);
585 if (flock != LK_EXCLUSIVE) {
586 if (flock == 0) {
587 if ((flags & ISLASTCN) &&
588 (flags & LOCKSHARED))
589 VOP_LOCK(*vpp, LK_SHARED, td);
590 else
591 VOP_LOCK(*vpp, LK_EXCLUSIVE, td);
592 }
593 } else if ((flags & ISLASTCN) && (flags & LOCKSHARED))
594 VOP_LOCK(*vpp, LK_DOWNGRADE, td);
595 }
596 return (error);
597 }
598#else
573 if (!error)
574 return (VOP_CACHEDLOOKUP(dvp, vpp, cnp));
599 if (!error)
600 return (VOP_CACHEDLOOKUP(dvp, vpp, cnp));
601#endif
575
576 if (error == ENOENT)
577 return (error);
578
579 vp = *vpp;
580 vpid = vp->v_id;
581 cnp->cn_flags &= ~PDIRUNLOCK;
582 if (dvp == vp) { /* lookup on "." */
583 VREF(vp);
584 error = 0;
585 } else if (flags & ISDOTDOT) {
586 VOP_UNLOCK(dvp, 0, td);
587 cnp->cn_flags |= PDIRUNLOCK;
602
603 if (error == ENOENT)
604 return (error);
605
606 vp = *vpp;
607 vpid = vp->v_id;
608 cnp->cn_flags &= ~PDIRUNLOCK;
609 if (dvp == vp) { /* lookup on "." */
610 VREF(vp);
611 error = 0;
612 } else if (flags & ISDOTDOT) {
613 VOP_UNLOCK(dvp, 0, td);
614 cnp->cn_flags |= PDIRUNLOCK;
615#ifdef LOOKUP_SHARED
616 if ((flags & ISLASTCN) && (flags & LOCKSHARED))
617 error = vget(vp, LK_SHARED, td);
618 else
619 error = vget(vp, LK_EXCLUSIVE, td);
620#else
588 error = vget(vp, LK_EXCLUSIVE, td);
621 error = vget(vp, LK_EXCLUSIVE, td);
622#endif
623
589 if (!error && lockparent && (flags & ISLASTCN)) {
590 if ((error = vn_lock(dvp, LK_EXCLUSIVE, td)) == 0)
591 cnp->cn_flags &= ~PDIRUNLOCK;
592 }
593 } else {
624 if (!error && lockparent && (flags & ISLASTCN)) {
625 if ((error = vn_lock(dvp, LK_EXCLUSIVE, td)) == 0)
626 cnp->cn_flags &= ~PDIRUNLOCK;
627 }
628 } else {
629#ifdef LOOKUP_SHARED
630 if ((flags & ISLASTCN) && (flags & LOCKSHARED))
631 error = vget(vp, LK_SHARED, td);
632 else
633 error = vget(vp, LK_EXCLUSIVE, td);
634#else
594 error = vget(vp, LK_EXCLUSIVE, td);
635 error = vget(vp, LK_EXCLUSIVE, td);
636#endif
595 if (!lockparent || error || !(flags & ISLASTCN)) {
596 VOP_UNLOCK(dvp, 0, td);
597 cnp->cn_flags |= PDIRUNLOCK;
598 }
599 }
600 /*
601 * Check that the capability number did not change
602 * while we were waiting for the lock.

--- 8 unchanged lines hidden (view full) ---

611 }
612 }
613 if (cnp->cn_flags & PDIRUNLOCK) {
614 error = vn_lock(dvp, LK_EXCLUSIVE, td);
615 if (error)
616 return (error);
617 cnp->cn_flags &= ~PDIRUNLOCK;
618 }
637 if (!lockparent || error || !(flags & ISLASTCN)) {
638 VOP_UNLOCK(dvp, 0, td);
639 cnp->cn_flags |= PDIRUNLOCK;
640 }
641 }
642 /*
643 * Check that the capability number did not change
644 * while we were waiting for the lock.

--- 8 unchanged lines hidden (view full) ---

653 }
654 }
655 if (cnp->cn_flags & PDIRUNLOCK) {
656 error = vn_lock(dvp, LK_EXCLUSIVE, td);
657 if (error)
658 return (error);
659 cnp->cn_flags &= ~PDIRUNLOCK;
660 }
661#ifdef LOOKUP_SHARED
662 error = VOP_CACHEDLOOKUP(dvp, vpp, cnp);
663
664 if (!error) {
665 int flock = 0;
666
667 flock = VOP_ISLOCKED(*vpp, td);
668 if (flock != LK_EXCLUSIVE) {
669 if (flock == 0) {
670 if ((flags & ISLASTCN) && (flags & LOCKSHARED))
671 VOP_LOCK(*vpp, LK_SHARED, td);
672 else
673 VOP_LOCK(*vpp, LK_EXCLUSIVE, td);
674 }
675 } else if ((flags & ISLASTCN) && (flags & LOCKSHARED))
676 VOP_LOCK(*vpp, LK_DOWNGRADE, td);
677 }
678
679 return (error);
680#else
619 return (VOP_CACHEDLOOKUP(dvp, vpp, cnp));
681 return (VOP_CACHEDLOOKUP(dvp, vpp, cnp));
682#endif
620}
621
622
623#ifndef _SYS_SYSPROTO_H_
624struct __getcwd_args {
625 u_char *buf;
626 u_int buflen;
627};

--- 212 unchanged lines hidden ---
683}
684
685
686#ifndef _SYS_SYSPROTO_H_
687struct __getcwd_args {
688 u_char *buf;
689 u_int buflen;
690};

--- 212 unchanged lines hidden ---