View | Details | Raw Unified | Return to bug 225423 | Differences between
and this patch

Collapse All | Expand All

(-)sys/kern/vfs_default.c (-7 / +18 lines)
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
		}

Return to bug 225423