diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2016-01-27 22:52:20 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2016-01-27 22:52:20 +0000 |
commit | 752d00608cb24d3c902d6890efe6964247c2532c (patch) | |
tree | d95f1229e13deff9a13cff3acee802c25b074b1d /sys/kern/vfs_cluster.c | |
parent | 21cf1fd41cf067f0eee07541daf280d2b60d1aa5 (diff) | |
parent | 50c99f32a97246578fc05f69bef518ff68349d68 (diff) |
Notes
Diffstat (limited to 'sys/kern/vfs_cluster.c')
-rw-r--r-- | sys/kern/vfs_cluster.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/sys/kern/vfs_cluster.c b/sys/kern/vfs_cluster.c index 476b28a01533..9871a505631d 100644 --- a/sys/kern/vfs_cluster.c +++ b/sys/kern/vfs_cluster.c @@ -119,6 +119,8 @@ cluster_read(struct vnode *vp, u_quad_t filesize, daddr_t lblkno, long size, * get the requested block */ *bpp = reqbp = bp = getblk(vp, lblkno, size, 0, 0, gbflags); + if (bp == NULL) + return (EBUSY); origblkno = lblkno; /* @@ -295,10 +297,18 @@ cluster_read(struct vnode *vp, u_quad_t filesize, daddr_t lblkno, long size, curthread->td_ru.ru_inblock++; } - if (reqbp) - return (bufwait(reqbp)); - else - return (error); + if (reqbp) { + /* + * Like bread, always brelse() the buffer when + * returning an error. + */ + error = bufwait(reqbp); + if (error != 0) { + brelse(reqbp); + *bpp = NULL; + } + } + return (error); } /* |