mirror of
https://github.com/freebsd/freebsd-src.git
synced 2024-12-04 05:58:57 +00:00
getblkx(9): be more tolerant but also strict with the buffer size checks
It is possible that on-disk filesystem format causes allocation of buffers of size larger than maxbcachebuf. Currently, getblkx() and indirectly bufkva_alloc() panic in that situation. It is more useful to return an error instead, allowing the system to continue running. PR: 277414 Reported by: Robert Morris <rtm@lcs.mit.edu> MFC after: 1 week Sponsored by: The FreeBSD Foundation
This commit is contained in:
parent
beadbca67b
commit
7e4ac11b60
@ -3985,9 +3985,11 @@ getblkx(struct vnode *vp, daddr_t blkno, daddr_t dblkno, int size, int slpflag,
|
||||
("GB_KVAALLOC only makes sense with GB_UNMAPPED"));
|
||||
if (vp->v_type != VCHR)
|
||||
ASSERT_VOP_LOCKED(vp, "getblk");
|
||||
if (size > maxbcachebuf)
|
||||
panic("getblk: size(%d) > maxbcachebuf(%d)\n", size,
|
||||
if (size > maxbcachebuf) {
|
||||
printf("getblkx: size(%d) > maxbcachebuf(%d)\n", size,
|
||||
maxbcachebuf);
|
||||
return (EIO);
|
||||
}
|
||||
if (!unmapped_buf_allowed)
|
||||
flags &= ~(GB_UNMAPPED | GB_KVAALLOC);
|
||||
|
||||
@ -4161,6 +4163,12 @@ newbuf_unlocked:
|
||||
vmio = vp->v_object != NULL;
|
||||
if (vmio) {
|
||||
maxsize = size + (offset & PAGE_MASK);
|
||||
if (maxsize > maxbcachebuf) {
|
||||
printf(
|
||||
"getblkx: maxsize(%d) > maxbcachebuf(%d)\n",
|
||||
maxsize, maxbcachebuf);
|
||||
return (EIO);
|
||||
}
|
||||
} else {
|
||||
maxsize = size;
|
||||
/* Do not allow non-VMIO notmapped buffers. */
|
||||
|
Loading…
Reference in New Issue
Block a user