summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorjeff <jeff@FreeBSD.org>2003-08-31 08:50:11 +0000
committerjeff <jeff@FreeBSD.org>2003-08-31 08:50:11 +0000
commit86f70ead2114c0de8a016de4bb047d9ad8aeaf69 (patch)
tree8f00b473657a626826ca739d2ef725324497092d /sys
parentd4a07597ca9fdc4cbb2b3a8176ec14dca7b7f96e (diff)
downloadFreeBSD-src-86f70ead2114c0de8a016de4bb047d9ad8aeaf69.zip
FreeBSD-src-86f70ead2114c0de8a016de4bb047d9ad8aeaf69.tar.gz
- Define a new flag for getblk(): GB_NOCREAT. This flag causes getblk() to
bail out if the buffer is not already present. - The buffer returned by incore() is not locked and should not be sent to brelse(). Use getblk() with the new GB_NOCREAT flag to preserve the desired semantics.
Diffstat (limited to 'sys')
-rw-r--r--sys/kern/vfs_bio.c8
-rw-r--r--sys/sys/buf.h1
-rw-r--r--sys/ufs/ffs/ffs_softdep.c8
3 files changed, 14 insertions, 3 deletions
diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c
index bea2269..021458c 100644
--- a/sys/kern/vfs_bio.c
+++ b/sys/kern/vfs_bio.c
@@ -2537,6 +2537,14 @@ loop:
* buffer is also considered valid (not marked B_INVAL).
*/
VI_UNLOCK(vp);
+ /*
+ * If the user does not want us to create the buffer, bail out
+ * here.
+ */
+ if (flags & GB_NOCREAT) {
+ splx(s);
+ return NULL;
+ }
if (vn_isdisk(vp, NULL))
bsize = DEV_BSIZE;
else if (vp->v_mountedhere)
diff --git a/sys/sys/buf.h b/sys/sys/buf.h
index 3965764..78ef55b 100644
--- a/sys/sys/buf.h
+++ b/sys/sys/buf.h
@@ -461,6 +461,7 @@ buf_countdeps(struct buf *bp, int i)
* Flags for getblk's last parameter.
*/
#define GB_LOCK_NOWAIT 0x0001 /* Fail if we block on a buf lock. */
+#define GB_NOCREAT 0x0002 /* Don't create a buf if not found. */
#ifdef _KERNEL
extern int nbuf; /* The number of buffer headers */
diff --git a/sys/ufs/ffs/ffs_softdep.c b/sys/ufs/ffs/ffs_softdep.c
index 429f98f..6ea776a 100644
--- a/sys/ufs/ffs/ffs_softdep.c
+++ b/sys/ufs/ffs/ffs_softdep.c
@@ -2563,10 +2563,10 @@ indir_trunc(freeblks, dbn, level, lbn, countp)
* a complete copy of the indirect block in memory for our use.
* Otherwise we have to read the blocks in from the disk.
*/
+ bp = getblk(freeblks->fb_devvp, dbn, (int)fs->fs_bsize, 0, 0,
+ GB_NOCREAT);
ACQUIRE_LOCK(&lk);
- /* XXX Buf not locked! */
- if ((bp = incore(freeblks->fb_devvp, dbn)) != NULL &&
- (wk = LIST_FIRST(&bp->b_dep)) != NULL) {
+ if (bp != NULL && (wk = LIST_FIRST(&bp->b_dep)) != NULL) {
if (wk->wk_type != D_INDIRDEP ||
(indirdep = WK_INDIRDEP(wk))->ir_savebp != bp ||
(indirdep->ir_state & GOINGAWAY) == 0) {
@@ -2582,6 +2582,8 @@ indir_trunc(freeblks, dbn, level, lbn, countp)
VFSTOUFS(freeblks->fb_mnt)->um_numindirdeps -= 1;
FREE_LOCK(&lk);
} else {
+ if (bp)
+ brelse(bp);
FREE_LOCK(&lk);
error = bread(freeblks->fb_devvp, dbn, (int)fs->fs_bsize,
NOCRED, &bp);
OpenPOWER on IntegriCloud