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