Deleted Added
full compact
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 ---