Lines 629-641
vop_stdfsync(ap)
Link Here
|
629 |
struct thread *a_td; |
629 |
struct thread *a_td; |
630 |
} */ *ap; |
630 |
} */ *ap; |
631 |
{ |
631 |
{ |
632 |
struct vnode *vp = ap->a_vp; |
632 |
struct vnode *vp; |
633 |
struct buf *bp; |
633 |
struct buf *bp, *nbp; |
634 |
struct bufobj *bo; |
634 |
struct bufobj *bo; |
635 |
struct buf *nbp; |
635 |
struct mount *mp; |
636 |
int error = 0; |
636 |
int error, maxretry; |
637 |
int maxretry = 1000; /* large, arbitrarily chosen */ |
|
|
638 |
|
637 |
|
|
|
638 |
error = 0; |
639 |
maxretry = 10000; /* large, arbitrarily chosen */ |
640 |
vp = ap->a_vp; |
641 |
mp = NULL; |
642 |
if (vp->v_type == VCHR) { |
643 |
VI_LOCK(vp); |
644 |
mp = vp->v_rdev->si_mountpt; |
645 |
VI_UNLOCK(vp); |
646 |
} |
639 |
bo = &vp->v_bufobj; |
647 |
bo = &vp->v_bufobj; |
640 |
BO_LOCK(bo); |
648 |
BO_LOCK(bo); |
641 |
loop1: |
649 |
loop1: |
Lines 678-683
loop2:
Link Here
|
678 |
bremfree(bp); |
686 |
bremfree(bp); |
679 |
bawrite(bp); |
687 |
bawrite(bp); |
680 |
} |
688 |
} |
|
|
689 |
if (maxretry < 1000) |
690 |
pause("dirty", hz < 1000 ? 1 : hz / 1000); |
681 |
BO_LOCK(bo); |
691 |
BO_LOCK(bo); |
682 |
goto loop2; |
692 |
goto loop2; |
683 |
} |
693 |
} |
Lines 698-705
loop2:
Link Here
|
698 |
*/ |
708 |
*/ |
699 |
TAILQ_FOREACH(bp, &bo->bo_dirty.bv_hd, b_bobufs) |
709 |
TAILQ_FOREACH(bp, &bo->bo_dirty.bv_hd, b_bobufs) |
700 |
if ((error = bp->b_error) == 0) |
710 |
if ((error = bp->b_error) == 0) |
701 |
continue; |
711 |
break; |
702 |
if (error == 0 && --maxretry >= 0) |
712 |
if ((mp != NULL && mp->mnt_secondary_writes > 0) || |
|
|
713 |
(error == 0 && --maxretry >= 0)) |
703 |
goto loop1; |
714 |
goto loop1; |
704 |
error = EAGAIN; |
715 |
error = EAGAIN; |
705 |
} |
716 |
} |