vfs_export.c (34690) | vfs_export.c (34694) |
---|---|
1/* 2 * Copyright (c) 1989, 1993 3 * The Regents of the University of California. All rights reserved. 4 * (c) UNIX System Laboratories, Inc. 5 * All or some portions of this file are derived from material licensed 6 * to the University of California by American Telephone and Telegraph 7 * Co. or Unix System Laboratories, Inc. and are reproduced herein with 8 * the permission of UNIX System Laboratories, Inc. --- 22 unchanged lines hidden (view full) --- 31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 36 * SUCH DAMAGE. 37 * 38 * @(#)vfs_subr.c 8.31 (Berkeley) 5/26/95 | 1/* 2 * Copyright (c) 1989, 1993 3 * The Regents of the University of California. All rights reserved. 4 * (c) UNIX System Laboratories, Inc. 5 * All or some portions of this file are derived from material licensed 6 * to the University of California by American Telephone and Telegraph 7 * Co. or Unix System Laboratories, Inc. and are reproduced herein with 8 * the permission of UNIX System Laboratories, Inc. --- 22 unchanged lines hidden (view full) --- 31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 36 * SUCH DAMAGE. 37 * 38 * @(#)vfs_subr.c 8.31 (Berkeley) 5/26/95 |
39 * $Id: vfs_subr.c,v 1.143 1998/03/17 06:30:52 dyson Exp $ | 39 * $Id: vfs_subr.c,v 1.144 1998/03/19 18:46:58 dyson Exp $ |
40 */ 41 42/* 43 * External virtual filesystem routines 44 */ 45#include "opt_ddb.h" 46#include "opt_devfs.h" 47 --- 548 unchanged lines hidden (view full) --- 596 597 for (bp = blist; bp; bp = nbp) { 598 nbp = bp->b_vnbufs.le_next; 599 if ((flags & V_SAVEMETA) && bp->b_lblkno < 0) 600 continue; 601 if (bp->b_flags & B_BUSY) { 602 bp->b_flags |= B_WANTED; 603 error = tsleep((caddr_t) bp, | 40 */ 41 42/* 43 * External virtual filesystem routines 44 */ 45#include "opt_ddb.h" 46#include "opt_devfs.h" 47 --- 548 unchanged lines hidden (view full) --- 596 597 for (bp = blist; bp; bp = nbp) { 598 nbp = bp->b_vnbufs.le_next; 599 if ((flags & V_SAVEMETA) && bp->b_lblkno < 0) 600 continue; 601 if (bp->b_flags & B_BUSY) { 602 bp->b_flags |= B_WANTED; 603 error = tsleep((caddr_t) bp, |
604 slpflag | (PRIBIO + 1), "vinvalbuf", | 604 slpflag | (PRIBIO + 4), "vinvalbuf", |
605 slptimeo); 606 if (error) { 607 splx(s); 608 return (error); 609 } 610 break; 611 } | 605 slptimeo); 606 if (error) { 607 splx(s); 608 return (error); 609 } 610 break; 611 } |
612 bremfree(bp); 613 bp->b_flags |= B_BUSY; | |
614 /* 615 * XXX Since there are no node locks for NFS, I 616 * believe there is a slight chance that a delayed 617 * write will occur while sleeping just above, so | 612 /* 613 * XXX Since there are no node locks for NFS, I 614 * believe there is a slight chance that a delayed 615 * write will occur while sleeping just above, so |
618 * check for it. | 616 * check for it. Note that vfs_bio_awrite expects 617 * buffers to reside on a queue, while VOP_BWRITE and 618 * brelse do not. |
619 */ | 619 */ |
620 if ((bp->b_flags & B_DELWRI) && (flags & V_SAVE)) { | 620 if (((bp->b_flags & (B_DELWRI | B_INVAL)) == B_DELWRI) && 621 (flags & V_SAVE)) { 622 |
621 if (bp->b_vp == vp) { 622 if (bp->b_flags & B_CLUSTEROK) { 623 vfs_bio_awrite(bp); 624 } else { | 623 if (bp->b_vp == vp) { 624 if (bp->b_flags & B_CLUSTEROK) { 625 vfs_bio_awrite(bp); 626 } else { |
625 bp->b_flags |= B_ASYNC; | 627 bremfree(bp); 628 bp->b_flags |= (B_BUSY | B_ASYNC); |
626 VOP_BWRITE(bp); 627 } 628 } else { | 629 VOP_BWRITE(bp); 630 } 631 } else { |
632 bremfree(bp); 633 bp->b_flags |= B_BUSY; |
|
629 (void) VOP_BWRITE(bp); 630 } 631 break; 632 } | 634 (void) VOP_BWRITE(bp); 635 } 636 break; 637 } |
633 bp->b_flags |= (B_INVAL|B_NOCACHE|B_RELBUF); | 638 bremfree(bp); 639 bp->b_flags |= (B_INVAL | B_NOCACHE | B_RELBUF | B_BUSY); |
634 bp->b_flags &= ~B_ASYNC; 635 brelse(bp); 636 } 637 } 638 639 while (vp->v_numoutput > 0) { 640 vp->v_flag |= VBWAIT; 641 tsleep(&vp->v_numoutput, PVM, "vnvlbv", 0); --- 32 unchanged lines hidden (view full) --- 674 register struct vnode *vp; 675 struct ucred *cred; 676 struct proc *p; 677 off_t length; 678 int blksize; 679{ 680 register struct buf *bp; 681 struct buf *nbp, *blist; | 640 bp->b_flags &= ~B_ASYNC; 641 brelse(bp); 642 } 643 } 644 645 while (vp->v_numoutput > 0) { 646 vp->v_flag |= VBWAIT; 647 tsleep(&vp->v_numoutput, PVM, "vnvlbv", 0); --- 32 unchanged lines hidden (view full) --- 680 register struct vnode *vp; 681 struct ucred *cred; 682 struct proc *p; 683 off_t length; 684 int blksize; 685{ 686 register struct buf *bp; 687 struct buf *nbp, *blist; |
682 int s, error, anyfreed, anymetadirty; | 688 int s, error, anyfreed; |
683 vm_object_t object; 684 int trunclbn; 685 686 /* 687 * Round up to the *next* lbn. 688 */ 689 trunclbn = (length + blksize - 1) / blksize; | 689 vm_object_t object; 690 int trunclbn; 691 692 /* 693 * Round up to the *next* lbn. 694 */ 695 trunclbn = (length + blksize - 1) / blksize; |
690 anymetadirty = 0; | |
691 692 s = splbio(); 693restart: 694 anyfreed = 1; 695 for (;anyfreed;) { 696 anyfreed = 0; 697 for ( bp = LIST_FIRST(&vp->v_cleanblkhd); bp; bp = nbp) { 698 699 nbp = LIST_NEXT(bp, b_vnbufs); 700 701 if (bp->b_lblkno >= trunclbn) { 702 if (bp->b_flags & B_BUSY) { 703 bp->b_flags |= B_WANTED; | 696 697 s = splbio(); 698restart: 699 anyfreed = 1; 700 for (;anyfreed;) { 701 anyfreed = 0; 702 for ( bp = LIST_FIRST(&vp->v_cleanblkhd); bp; bp = nbp) { 703 704 nbp = LIST_NEXT(bp, b_vnbufs); 705 706 if (bp->b_lblkno >= trunclbn) { 707 if (bp->b_flags & B_BUSY) { 708 bp->b_flags |= B_WANTED; |
704 tsleep((caddr_t) bp, PRIBIO, "vtrb1", 0); 705 nbp = bp; | 709 tsleep(bp, PRIBIO + 4, "vtrb1", 0); 710 goto restart; |
706 } else { 707 bremfree(bp); | 711 } else { 712 bremfree(bp); |
708 bp->b_flags |= (B_BUSY|B_INVAL|B_NOCACHE|B_RELBUF); | 713 bp->b_flags |= (B_BUSY | B_INVAL | B_RELBUF); |
709 bp->b_flags &= ~B_ASYNC; 710 brelse(bp); 711 anyfreed = 1; 712 } 713 if (nbp && | 714 bp->b_flags &= ~B_ASYNC; 715 brelse(bp); 716 anyfreed = 1; 717 } 718 if (nbp && |
714 ((LIST_NEXT(nbp, b_vnbufs) == NOLIST) || (nbp->b_vp != vp) || | 719 ((LIST_NEXT(nbp, b_vnbufs) == NOLIST) || 720 (nbp->b_vp != vp) || |
715 (nbp->b_flags & B_DELWRI))) { 716 goto restart; 717 } 718 } 719 } 720 721 for (bp = LIST_FIRST(&vp->v_dirtyblkhd); bp; bp = nbp) { 722 723 nbp = LIST_NEXT(bp, b_vnbufs); 724 725 if (bp->b_lblkno >= trunclbn) { 726 if (bp->b_flags & B_BUSY) { 727 bp->b_flags |= B_WANTED; | 721 (nbp->b_flags & B_DELWRI))) { 722 goto restart; 723 } 724 } 725 } 726 727 for (bp = LIST_FIRST(&vp->v_dirtyblkhd); bp; bp = nbp) { 728 729 nbp = LIST_NEXT(bp, b_vnbufs); 730 731 if (bp->b_lblkno >= trunclbn) { 732 if (bp->b_flags & B_BUSY) { 733 bp->b_flags |= B_WANTED; |
728 tsleep((caddr_t) bp, PRIBIO, "vtrb2", 0); 729 nbp = bp; | 734 tsleep(bp, PRIBIO + 4, "vtrb2", 0); 735 goto restart; |
730 } else { 731 bremfree(bp); | 736 } else { 737 bremfree(bp); |
732 bp->b_flags |= (B_BUSY|B_INVAL|B_NOCACHE|B_RELBUF); | 738 bp->b_flags |= (B_BUSY | B_INVAL | B_RELBUF); |
733 bp->b_flags &= ~B_ASYNC; 734 brelse(bp); 735 anyfreed = 1; 736 } 737 if (nbp && | 739 bp->b_flags &= ~B_ASYNC; 740 brelse(bp); 741 anyfreed = 1; 742 } 743 if (nbp && |
738 ((LIST_NEXT(nbp, b_vnbufs) == NOLIST) || (nbp->b_vp != vp) || | 744 ((LIST_NEXT(nbp, b_vnbufs) == NOLIST) || 745 (nbp->b_vp != vp) || |
739 (nbp->b_flags & B_DELWRI) == 0)) { 740 goto restart; 741 } | 746 (nbp->b_flags & B_DELWRI) == 0)) { 747 goto restart; 748 } |
742 } else if (bp->b_lblkno < 0) { 743 anymetadirty++; | |
744 } 745 } 746 } 747 | 749 } 750 } 751 } 752 |
748rescan: 749 if ((length > 0) && anymetadirty) { | 753 if (length > 0) { 754restartsync: |
750 for (bp = LIST_FIRST(&vp->v_dirtyblkhd); bp; bp = nbp) { 751 752 nbp = LIST_NEXT(bp, b_vnbufs); 753 754 if ((bp->b_flags & B_DELWRI) && (bp->b_lblkno < 0)) { 755 if (bp->b_flags & B_BUSY) { 756 bp->b_flags |= B_WANTED; | 755 for (bp = LIST_FIRST(&vp->v_dirtyblkhd); bp; bp = nbp) { 756 757 nbp = LIST_NEXT(bp, b_vnbufs); 758 759 if ((bp->b_flags & B_DELWRI) && (bp->b_lblkno < 0)) { 760 if (bp->b_flags & B_BUSY) { 761 bp->b_flags |= B_WANTED; |
757 tsleep((caddr_t) bp, PRIBIO, "vtrb3", 0); 758 nbp = bp; 759 continue; | 762 tsleep(bp, PRIBIO, "vtrb3", 0); |
760 } else { 761 bremfree(bp); | 763 } else { 764 bremfree(bp); |
762 bp->b_flags |= B_ASYNC | B_BUSY; | 765 bp->b_flags |= B_BUSY; 766 if (bp->b_vp == vp) { 767 bp->b_flags |= B_ASYNC; 768 } else { 769 bp->b_flags &= ~B_ASYNC; 770 } |
763 VOP_BWRITE(bp); | 771 VOP_BWRITE(bp); |
764 goto rescan; | |
765 } | 772 } |
773 goto restartsync; |
|
766 } | 774 } |
775 |
|
767 } 768 } 769 770 while (vp->v_numoutput > 0) { 771 vp->v_flag |= VBWAIT; 772 tsleep(&vp->v_numoutput, PVM, "vbtrunc", 0); 773 } 774 | 776 } 777 } 778 779 while (vp->v_numoutput > 0) { 780 vp->v_flag |= VBWAIT; 781 tsleep(&vp->v_numoutput, PVM, "vbtrunc", 0); 782 } 783 |
775 | |
776 splx(s); 777 778 vnode_pager_setsize(vp, length); 779 780 return (0); 781} 782 783/* --- 2012 unchanged lines hidden --- | 784 splx(s); 785 786 vnode_pager_setsize(vp, length); 787 788 return (0); 789} 790 791/* --- 2012 unchanged lines hidden --- |