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:
Konstantin Belousov 2024-03-02 06:58:57 +02:00
parent beadbca67b
commit 7e4ac11b60

View File

@ -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. */