Acknowledged On Fri, May 30, 2025 at 7:41 AM Liu Kui <kui....@virtuozzo.com> wrote: > > This is an ancient bug that was never tested. For FIEMAP request, > its iochunk.size could be much larger than the size of actual msg > flying around. And its accounting weight should be PCS_CS_HOLE_WEIGHT, > just like WRITE_HOLE or WRITE_ZERO, instead of its iochunk.size. > Otherwise it'll make cs->in_flight overflow, crashing the kernel. > > Fixes: #ASUP-1567 > https://virtuozzo.atlassian.net/browse/ASUP-1567 > > Signed-off-by: Liu Kui <kui....@virtuozzo.com> > --- > fs/fuse/kio/pcs/pcs_map.c | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/fs/fuse/kio/pcs/pcs_map.c b/fs/fuse/kio/pcs/pcs_map.c > index fc707c9dcb65..ce390ab5990c 100644 > --- a/fs/fuse/kio/pcs/pcs_map.c > +++ b/fs/fuse/kio/pcs/pcs_map.c > @@ -1450,7 +1450,8 @@ static void pcs_cs_deaccount(struct pcs_int_request > *ireq, struct pcs_cs * cs, i > spin_lock(&cs->lock); > if (ireq->type == PCS_IREQ_IOCHUNK) { > if (ireq->iochunk.cmd == PCS_REQ_T_WRITE_HOLE || > - ireq->iochunk.cmd == PCS_REQ_T_WRITE_ZERO) > + ireq->iochunk.cmd == PCS_REQ_T_WRITE_ZERO || > + ireq->iochunk.cmd == PCS_REQ_T_FIEMAP) > cost = PCS_CS_HOLE_WEIGHT; > else > cost = (ireq->flags & IREQ_F_RND_WEIGHT) ? 512*1024 : > cong_roundup(ireq->iochunk.size); > @@ -2063,7 +2064,9 @@ static int pcs_cslist_submit_read(struct > pcs_int_request *ireq, struct pcs_cs_li > > sreq->flags &= ~(IREQ_F_RND_WEIGHT | IREQ_F_SEQ); > BUG_ON(sreq->flags & IREQ_F_SEQ_READ); > - if (pcs_flow_sequential(sreq->iochunk.flow)) { > + if (ireq->iochunk.cmd != PCS_REQ_T_READ) { > + weight = PCS_CS_HOLE_WEIGHT; > + } else if (pcs_flow_sequential(sreq->iochunk.flow)) { > sreq->flags |= IREQ_F_SEQ_READ | IREQ_F_SEQ; > atomic_inc(&csl->seq_read_in_flight); > weight = cong_roundup(sreq->iochunk.size); > -- > 2.39.5 (Apple Git-154)
_______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel