Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/vfs_bio.c
Show First 20 Lines • Show All 3,882 Lines • ▼ Show 20 Lines | getblkx(struct vnode *vp, daddr_t blkno, daddr_t dblkno, int size, int slpflag, | ||||
if (!unmapped_buf_allowed) | if (!unmapped_buf_allowed) | ||||
flags &= ~(GB_UNMAPPED | GB_KVAALLOC); | flags &= ~(GB_UNMAPPED | GB_KVAALLOC); | ||||
bo = &vp->v_bufobj; | bo = &vp->v_bufobj; | ||||
d_blkno = dblkno; | d_blkno = dblkno; | ||||
/* Attempt lockless lookup first. */ | /* Attempt lockless lookup first. */ | ||||
bp = gbincore_unlocked(bo, blkno); | bp = gbincore_unlocked(bo, blkno); | ||||
if (bp == NULL) | if (bp == NULL) { | ||||
/* | |||||
* With GB_NOCREAT we must be sure about not finding the buffer | |||||
* as it may have been reassigned during unlocked lookup. | |||||
*/ | |||||
if ((flags & GB_NOCREAT) != 0) | |||||
goto loop; | |||||
goto newbuf_unlocked; | goto newbuf_unlocked; | ||||
} | |||||
error = BUF_TIMELOCK(bp, LK_EXCLUSIVE | LK_NOWAIT, NULL, "getblku", 0, | error = BUF_TIMELOCK(bp, LK_EXCLUSIVE | LK_NOWAIT, NULL, "getblku", 0, | ||||
0); | 0); | ||||
if (error != 0) | if (error != 0) | ||||
goto loop; | goto loop; | ||||
/* Verify buf identify has not changed since lookup. */ | /* Verify buf identify has not changed since lookup. */ | ||||
if (bp->b_bufobj == bo && bp->b_lblkno == blkno) | if (bp->b_bufobj == bo && bp->b_lblkno == blkno) | ||||
▲ Show 20 Lines • Show All 1,607 Lines • Show Last 20 Lines |