vfs_export.c (47964) | vfs_export.c (48225) |
---|---|
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.201 1999/06/15 23:37:25 mckusick Exp $ | 39 * $Id: vfs_subr.c,v 1.202 1999/06/16 23:27:32 mckusick Exp $ |
40 */ 41 42/* 43 * External virtual filesystem routines 44 */ 45#include "opt_ddb.h" 46 47#include <sys/param.h> --- 75 unchanged lines hidden (view full) --- 123/* 124 * The workitem queue. 125 */ 126#define SYNCER_MAXDELAY 32 127static int syncer_maxdelay = SYNCER_MAXDELAY; /* maximum delay time */ 128time_t syncdelay = 30; /* max time to delay syncing data */ 129time_t filedelay = 30; /* time to delay syncing files */ 130SYSCTL_INT(_kern, OID_AUTO, filedelay, CTLFLAG_RW, &filedelay, 0, ""); | 40 */ 41 42/* 43 * External virtual filesystem routines 44 */ 45#include "opt_ddb.h" 46 47#include <sys/param.h> --- 75 unchanged lines hidden (view full) --- 123/* 124 * The workitem queue. 125 */ 126#define SYNCER_MAXDELAY 32 127static int syncer_maxdelay = SYNCER_MAXDELAY; /* maximum delay time */ 128time_t syncdelay = 30; /* max time to delay syncing data */ 129time_t filedelay = 30; /* time to delay syncing files */ 130SYSCTL_INT(_kern, OID_AUTO, filedelay, CTLFLAG_RW, &filedelay, 0, ""); |
131time_t dirdelay = 15; /* time to delay syncing directories */ | 131time_t dirdelay = 29; /* time to delay syncing directories */ |
132SYSCTL_INT(_kern, OID_AUTO, dirdelay, CTLFLAG_RW, &dirdelay, 0, ""); | 132SYSCTL_INT(_kern, OID_AUTO, dirdelay, CTLFLAG_RW, &dirdelay, 0, ""); |
133time_t metadelay = 10; /* time to delay syncing metadata */ | 133time_t metadelay = 28; /* time to delay syncing metadata */ |
134SYSCTL_INT(_kern, OID_AUTO, metadelay, CTLFLAG_RW, &metadelay, 0, ""); 135static int rushjob; /* number of slots to run ASAP */ 136static int stat_rush_requests; /* number of times I/O speeded up */ 137SYSCTL_INT(_debug, OID_AUTO, rush_requests, CTLFLAG_RW, &stat_rush_requests, 0, ""); 138 139static int syncer_delayno = 0; 140static long syncer_mask; 141LIST_HEAD(synclist, vnode); --- 475 unchanged lines hidden (view full) --- 617 blist = TAILQ_FIRST(&vp->v_cleanblkhd); 618 if (!blist) 619 blist = TAILQ_FIRST(&vp->v_dirtyblkhd); 620 if (!blist) 621 break; 622 623 for (bp = blist; bp; bp = nbp) { 624 nbp = TAILQ_NEXT(bp, b_vnbufs); | 134SYSCTL_INT(_kern, OID_AUTO, metadelay, CTLFLAG_RW, &metadelay, 0, ""); 135static int rushjob; /* number of slots to run ASAP */ 136static int stat_rush_requests; /* number of times I/O speeded up */ 137SYSCTL_INT(_debug, OID_AUTO, rush_requests, CTLFLAG_RW, &stat_rush_requests, 0, ""); 138 139static int syncer_delayno = 0; 140static long syncer_mask; 141LIST_HEAD(synclist, vnode); --- 475 unchanged lines hidden (view full) --- 617 blist = TAILQ_FIRST(&vp->v_cleanblkhd); 618 if (!blist) 619 blist = TAILQ_FIRST(&vp->v_dirtyblkhd); 620 if (!blist) 621 break; 622 623 for (bp = blist; bp; bp = nbp) { 624 nbp = TAILQ_NEXT(bp, b_vnbufs); |
625 if (bp->b_flags & B_BUSY) { 626 bp->b_flags |= B_WANTED; 627 error = tsleep((caddr_t) bp, 628 slpflag | (PRIBIO + 4), "vinvalbuf", 629 slptimeo); 630 if (error) { 631 splx(s); 632 return (error); 633 } 634 break; | 625 if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT)) { 626 error = BUF_TIMELOCK(bp, 627 LK_EXCLUSIVE | LK_SLEEPFAIL, 628 "vinvalbuf", slpflag, slptimeo); 629 if (error == ENOLCK) 630 break; 631 splx(s); 632 return (error); |
635 } 636 /* 637 * XXX Since there are no node locks for NFS, I 638 * believe there is a slight chance that a delayed 639 * write will occur while sleeping just above, so 640 * check for it. Note that vfs_bio_awrite expects 641 * buffers to reside on a queue, while VOP_BWRITE and 642 * brelse do not. 643 */ 644 if (((bp->b_flags & (B_DELWRI | B_INVAL)) == B_DELWRI) && 645 (flags & V_SAVE)) { 646 647 if (bp->b_vp == vp) { 648 if (bp->b_flags & B_CLUSTEROK) { | 633 } 634 /* 635 * XXX Since there are no node locks for NFS, I 636 * believe there is a slight chance that a delayed 637 * write will occur while sleeping just above, so 638 * check for it. Note that vfs_bio_awrite expects 639 * buffers to reside on a queue, while VOP_BWRITE and 640 * brelse do not. 641 */ 642 if (((bp->b_flags & (B_DELWRI | B_INVAL)) == B_DELWRI) && 643 (flags & V_SAVE)) { 644 645 if (bp->b_vp == vp) { 646 if (bp->b_flags & B_CLUSTEROK) { |
647 BUF_UNLOCK(bp); |
|
649 vfs_bio_awrite(bp); 650 } else { 651 bremfree(bp); | 648 vfs_bio_awrite(bp); 649 } else { 650 bremfree(bp); |
652 bp->b_flags |= (B_BUSY | B_ASYNC); | 651 bp->b_flags |= B_ASYNC; |
653 VOP_BWRITE(bp->b_vp, bp); 654 } 655 } else { 656 bremfree(bp); | 652 VOP_BWRITE(bp->b_vp, bp); 653 } 654 } else { 655 bremfree(bp); |
657 bp->b_flags |= B_BUSY; | |
658 (void) VOP_BWRITE(bp->b_vp, bp); 659 } 660 break; 661 } 662 bremfree(bp); | 656 (void) VOP_BWRITE(bp->b_vp, bp); 657 } 658 break; 659 } 660 bremfree(bp); |
663 bp->b_flags |= (B_INVAL | B_NOCACHE | B_RELBUF | B_BUSY); | 661 bp->b_flags |= (B_INVAL | B_NOCACHE | B_RELBUF); |
664 bp->b_flags &= ~B_ASYNC; 665 brelse(bp); 666 } 667 } 668 669 while (vp->v_numoutput > 0) { 670 vp->v_flag |= VBWAIT; 671 tsleep(&vp->v_numoutput, PVM, "vnvlbv", 0); --- 43 unchanged lines hidden (view full) --- 715 s = splbio(); 716restart: 717 anyfreed = 1; 718 for (;anyfreed;) { 719 anyfreed = 0; 720 for (bp = TAILQ_FIRST(&vp->v_cleanblkhd); bp; bp = nbp) { 721 nbp = TAILQ_NEXT(bp, b_vnbufs); 722 if (bp->b_lblkno >= trunclbn) { | 662 bp->b_flags &= ~B_ASYNC; 663 brelse(bp); 664 } 665 } 666 667 while (vp->v_numoutput > 0) { 668 vp->v_flag |= VBWAIT; 669 tsleep(&vp->v_numoutput, PVM, "vnvlbv", 0); --- 43 unchanged lines hidden (view full) --- 713 s = splbio(); 714restart: 715 anyfreed = 1; 716 for (;anyfreed;) { 717 anyfreed = 0; 718 for (bp = TAILQ_FIRST(&vp->v_cleanblkhd); bp; bp = nbp) { 719 nbp = TAILQ_NEXT(bp, b_vnbufs); 720 if (bp->b_lblkno >= trunclbn) { |
723 if (bp->b_flags & B_BUSY) { 724 bp->b_flags |= B_WANTED; 725 tsleep(bp, PRIBIO + 4, "vtrb1", 0); | 721 if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT)) { 722 BUF_LOCK(bp, LK_EXCLUSIVE|LK_SLEEPFAIL); |
726 goto restart; 727 } else { 728 bremfree(bp); | 723 goto restart; 724 } else { 725 bremfree(bp); |
729 bp->b_flags |= (B_BUSY | B_INVAL | B_RELBUF); | 726 bp->b_flags |= (B_INVAL | B_RELBUF); |
730 bp->b_flags &= ~B_ASYNC; 731 brelse(bp); 732 anyfreed = 1; 733 } 734 if (nbp && (((nbp->b_xflags & B_VNCLEAN) == 0)|| 735 (nbp->b_vp != vp) || 736 (nbp->b_flags & B_DELWRI))) { 737 goto restart; 738 } 739 } 740 } 741 742 for (bp = TAILQ_FIRST(&vp->v_dirtyblkhd); bp; bp = nbp) { 743 nbp = TAILQ_NEXT(bp, b_vnbufs); 744 if (bp->b_lblkno >= trunclbn) { | 727 bp->b_flags &= ~B_ASYNC; 728 brelse(bp); 729 anyfreed = 1; 730 } 731 if (nbp && (((nbp->b_xflags & B_VNCLEAN) == 0)|| 732 (nbp->b_vp != vp) || 733 (nbp->b_flags & B_DELWRI))) { 734 goto restart; 735 } 736 } 737 } 738 739 for (bp = TAILQ_FIRST(&vp->v_dirtyblkhd); bp; bp = nbp) { 740 nbp = TAILQ_NEXT(bp, b_vnbufs); 741 if (bp->b_lblkno >= trunclbn) { |
745 if (bp->b_flags & B_BUSY) { 746 bp->b_flags |= B_WANTED; 747 tsleep(bp, PRIBIO + 4, "vtrb2", 0); | 742 if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT)) { 743 BUF_LOCK(bp, LK_EXCLUSIVE|LK_SLEEPFAIL); |
748 goto restart; 749 } else { 750 bremfree(bp); | 744 goto restart; 745 } else { 746 bremfree(bp); |
751 bp->b_flags |= (B_BUSY | B_INVAL | B_RELBUF); | 747 bp->b_flags |= (B_INVAL | B_RELBUF); |
752 bp->b_flags &= ~B_ASYNC; 753 brelse(bp); 754 anyfreed = 1; 755 } 756 if (nbp && (((nbp->b_xflags & B_VNDIRTY) == 0)|| 757 (nbp->b_vp != vp) || 758 (nbp->b_flags & B_DELWRI) == 0)) { 759 goto restart; 760 } 761 } 762 } 763 } 764 765 if (length > 0) { 766restartsync: 767 for (bp = TAILQ_FIRST(&vp->v_dirtyblkhd); bp; bp = nbp) { 768 nbp = TAILQ_NEXT(bp, b_vnbufs); 769 if ((bp->b_flags & B_DELWRI) && (bp->b_lblkno < 0)) { | 748 bp->b_flags &= ~B_ASYNC; 749 brelse(bp); 750 anyfreed = 1; 751 } 752 if (nbp && (((nbp->b_xflags & B_VNDIRTY) == 0)|| 753 (nbp->b_vp != vp) || 754 (nbp->b_flags & B_DELWRI) == 0)) { 755 goto restart; 756 } 757 } 758 } 759 } 760 761 if (length > 0) { 762restartsync: 763 for (bp = TAILQ_FIRST(&vp->v_dirtyblkhd); bp; bp = nbp) { 764 nbp = TAILQ_NEXT(bp, b_vnbufs); 765 if ((bp->b_flags & B_DELWRI) && (bp->b_lblkno < 0)) { |
770 if (bp->b_flags & B_BUSY) { 771 bp->b_flags |= B_WANTED; 772 tsleep(bp, PRIBIO, "vtrb3", 0); | 766 if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT)) { 767 BUF_LOCK(bp, LK_EXCLUSIVE|LK_SLEEPFAIL); 768 goto restart; |
773 } else { 774 bremfree(bp); | 769 } else { 770 bremfree(bp); |
775 bp->b_flags |= B_BUSY; | |
776 if (bp->b_vp == vp) { 777 bp->b_flags |= B_ASYNC; 778 } else { 779 bp->b_flags &= ~B_ASYNC; 780 } 781 VOP_BWRITE(bp->b_vp, bp); 782 } 783 goto restartsync; --- 2165 unchanged lines hidden --- | 771 if (bp->b_vp == vp) { 772 bp->b_flags |= B_ASYNC; 773 } else { 774 bp->b_flags &= ~B_ASYNC; 775 } 776 VOP_BWRITE(bp->b_vp, bp); 777 } 778 goto restartsync; --- 2165 unchanged lines hidden --- |