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

Collapse All | Expand All

(-)b/sys/kern/vfs_subr.c (-7 / +14 lines)
Lines 2490-2495 bnoreuselist(struct bufv *bufv, struct bufobj *bo, daddr_t startn, daddr_t endn) Link Here
2490
	for (lblkno = startn;;) {
2490
	for (lblkno = startn;;) {
2491
again:
2491
again:
2492
		bp = BUF_PCTRIE_LOOKUP_GE(&bufv->bv_root, lblkno);
2492
		bp = BUF_PCTRIE_LOOKUP_GE(&bufv->bv_root, lblkno);
2493
		if (bp == NULL)
2494
			bp = BUF_PCTRIE_LOOKUP_GE(&bufv->bv_root, 0);
2493
		if (bp == NULL || bp->b_lblkno >= endn ||
2495
		if (bp == NULL || bp->b_lblkno >= endn ||
2494
		    bp->b_lblkno < startn)
2496
		    bp->b_lblkno < startn)
2495
			break;
2497
			break;
Lines 2629-2636 v_inval_buf_range_locked(struct vnode *vp, struct bufobj *bo, Link Here
2629
	do {
2631
	do {
2630
		bv = clean ? &bo->bo_clean : &bo->bo_dirty;
2632
		bv = clean ? &bo->bo_clean : &bo->bo_dirty;
2631
		bp = BUF_PCTRIE_LOOKUP_GE(&bv->bv_root, startlbn);
2633
		bp = BUF_PCTRIE_LOOKUP_GE(&bv->bv_root, startlbn);
2632
		if (bp == NULL || bp->b_lblkno >= endlbn ||
2634
		if (bp == NULL)
2633
		    bp->b_lblkno < startlbn)
2635
			bp = BUF_PCTRIE_LOOKUP_GE(&bv->bv_root, 0);
2636
		if (bp == NULL || bp->b_lblkno < startlbn)
2634
			continue;
2637
			continue;
2635
		TAILQ_FOREACH_FROM_SAFE(bp, &bv->bv_hd, b_bobufs, nbp) {
2638
		TAILQ_FOREACH_FROM_SAFE(bp, &bv->bv_hd, b_bobufs, nbp) {
2636
			if (bp->b_lblkno >= endlbn)
2639
			if (bp->b_lblkno >= endlbn)
Lines 2710-2721 buf_vlist_find_or_add(struct buf *bp, struct bufobj *bo, b_xflags_t xflags) Link Here
2710
		bv = &bo->bo_clean;
2713
		bv = &bo->bo_clean;
2711
2714
2712
	error = BUF_PCTRIE_INSERT_LOOKUP_LE(&bv->bv_root, bp, &n);
2715
	error = BUF_PCTRIE_INSERT_LOOKUP_LE(&bv->bv_root, bp, &n);
2716
	if (error != EEXIST) {
2717
		if (n == NULL)
2718
			n = BUF_PCTRIE_LOOKUP_LE(&bv->bv_root, ~0L);
2719
		if (n->b_lblkno >= bp->b_lblkno)
2720
			n = NULL;
2721
	}
2713
	if (n == NULL) {
2722
	if (n == NULL) {
2714
		KASSERT(error != EEXIST,
2723
		KASSERT(error != EEXIST,
2715
		    ("buf_vlist_add: EEXIST but no existing buf found: bp %p",
2724
		    ("buf_vlist_add: EEXIST but no existing buf found: bp %p",
2716
		    bp));
2725
		    bp));
2717
	} else {
2726
	} else {
2718
		KASSERT((uint64_t)n->b_lblkno <= (uint64_t)bp->b_lblkno,
2727
		KASSERT(n->b_lblkno <= bp->b_lblkno,
2719
		    ("buf_vlist_add: out of order insert/lookup: bp %p n %p",
2728
		    ("buf_vlist_add: out of order insert/lookup: bp %p n %p",
2720
		    bp, n));
2729
		    bp, n));
2721
		KASSERT((n->b_lblkno == bp->b_lblkno) == (error == EEXIST),
2730
		KASSERT((n->b_lblkno == bp->b_lblkno) == (error == EEXIST),
Lines 2728-2743 buf_vlist_find_or_add(struct buf *bp, struct bufobj *bo, b_xflags_t xflags) Link Here
2728
	/* Keep the list ordered. */
2737
	/* Keep the list ordered. */
2729
	if (n == NULL) {
2738
	if (n == NULL) {
2730
		KASSERT(TAILQ_EMPTY(&bv->bv_hd) ||
2739
		KASSERT(TAILQ_EMPTY(&bv->bv_hd) ||
2731
		    (uint64_t)bp->b_lblkno <
2740
		    bp->b_lblkno < TAILQ_FIRST(&bv->bv_hd)->b_lblkno,
2732
		    (uint64_t)TAILQ_FIRST(&bv->bv_hd)->b_lblkno,
2733
		    ("buf_vlist_add: queue order: "
2741
		    ("buf_vlist_add: queue order: "
2734
		    "%p should be before first %p",
2742
		    "%p should be before first %p",
2735
		    bp, TAILQ_FIRST(&bv->bv_hd)));
2743
		    bp, TAILQ_FIRST(&bv->bv_hd)));
2736
		TAILQ_INSERT_HEAD(&bv->bv_hd, bp, b_bobufs);
2744
		TAILQ_INSERT_HEAD(&bv->bv_hd, bp, b_bobufs);
2737
	} else {
2745
	} else {
2738
		KASSERT(TAILQ_NEXT(n, b_bobufs) == NULL ||
2746
		KASSERT(TAILQ_NEXT(n, b_bobufs) == NULL ||
2739
		    (uint64_t)bp->b_lblkno <
2747
		    bp->b_lblkno < TAILQ_NEXT(n, b_bobufs)->b_lblkno,
2740
		    (uint64_t)TAILQ_NEXT(n, b_bobufs)->b_lblkno,
2741
		    ("buf_vlist_add: queue order: "
2748
		    ("buf_vlist_add: queue order: "
2742
		    "%p should be before next %p",
2749
		    "%p should be before next %p",
2743
		    bp, TAILQ_NEXT(n, b_bobufs)));
2750
		    bp, TAILQ_NEXT(n, b_bobufs)));

Return to bug 282134