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 --- |