Module Name: src Committed By: bouyer Date: Thu Jun 13 14:47:54 UTC 2024
Modified Files: src/sys/arch/xen/xen: xbdback_xenbus.c Log Message: Get req->handle and req->sector_number from the correct structure for the current opertation. They happen to be at the same offset in all structures so NFC, but better be correct, it may help for future changes. While there KASSERT() that our indirect segments fits in a single page. To generate a diff of this commit: cvs rdiff -u -r1.103 -r1.104 src/sys/arch/xen/xen/xbdback_xenbus.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/xen/xen/xbdback_xenbus.c diff -u src/sys/arch/xen/xen/xbdback_xenbus.c:1.103 src/sys/arch/xen/xen/xbdback_xenbus.c:1.104 --- src/sys/arch/xen/xen/xbdback_xenbus.c:1.103 Sat Feb 25 00:35:28 2023 +++ src/sys/arch/xen/xen/xbdback_xenbus.c Thu Jun 13 14:47:54 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: xbdback_xenbus.c,v 1.103 2023/02/25 00:35:28 riastradh Exp $ */ +/* $NetBSD: xbdback_xenbus.c,v 1.104 2024/06/13 14:47:54 bouyer Exp $ */ /* * Copyright (c) 2006 Manuel Bouyer. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: xbdback_xenbus.c,v 1.103 2023/02/25 00:35:28 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: xbdback_xenbus.c,v 1.104 2024/06/13 14:47:54 bouyer Exp $"); #include <sys/buf.h> #include <sys/condvar.h> @@ -1136,18 +1136,20 @@ xbdback_co_io(struct xbdback_instance *x case XBDIP_NATIVE: reqn = RING_GET_REQUEST(&xbdi->xbdi_ring.ring_n, xbdi->xbdi_ring.ring_n.req_cons); - req->handle = reqn->handle; - req->sector_number = reqn->sector_number; if (reqn->operation == BLKIF_OP_INDIRECT) { rinn = (blkif_request_indirect_t *)reqn; req->operation = rinn->indirect_op; - req->nr_segments = (uint8_t)rinn->nr_segments; - if (req->nr_segments > VBD_MAX_INDIRECT_SEGMENTS) + req->handle = rinn->handle; + if (rinn->nr_segments > VBD_MAX_INDIRECT_SEGMENTS) goto bad_nr_segments; + req->nr_segments = (uint8_t)rinn->nr_segments; + req->sector_number = rinn->sector_number; xbdi->xbdi_in_gntref = rinn->indirect_grefs[0]; /* first_sect and segment grefs fetched later */ } else { + req->handle = reqn->handle; req->nr_segments = reqn->nr_segments; + req->sector_number = reqn->sector_number; if (req->nr_segments > BLKIF_MAX_SEGMENTS_PER_REQUEST) goto bad_nr_segments; for (i = 0; i < req->nr_segments; i++) @@ -1158,18 +1160,20 @@ xbdback_co_io(struct xbdback_instance *x case XBDIP_32: req32 = RING_GET_REQUEST(&xbdi->xbdi_ring.ring_32, xbdi->xbdi_ring.ring_n.req_cons); - req->handle = req32->handle; - req->sector_number = req32->sector_number; if (req32->operation == BLKIF_OP_INDIRECT) { rin32 = (blkif_x86_32_request_indirect_t *)req32; req->operation = rin32->indirect_op; - req->nr_segments = (uint8_t)rin32->nr_segments; - if (req->nr_segments > VBD_MAX_INDIRECT_SEGMENTS) + req->handle = rin32->handle; + if (rin32->nr_segments > VBD_MAX_INDIRECT_SEGMENTS) goto bad_nr_segments; + req->nr_segments = (uint8_t)rin32->nr_segments; + req->sector_number = rin32->sector_number; xbdi->xbdi_in_gntref = rin32->indirect_grefs[0]; /* first_sect and segment grefs fetched later */ } else { + req->handle = req32->handle; req->nr_segments = req32->nr_segments; + req->sector_number = req32->sector_number; if (req->nr_segments > BLKIF_MAX_SEGMENTS_PER_REQUEST) goto bad_nr_segments; for (i = 0; i < req->nr_segments; i++) @@ -1180,17 +1184,20 @@ xbdback_co_io(struct xbdback_instance *x case XBDIP_64: req64 = RING_GET_REQUEST(&xbdi->xbdi_ring.ring_64, xbdi->xbdi_ring.ring_n.req_cons); - req->handle = req64->handle; - req->sector_number = req64->sector_number; if (req64->operation == BLKIF_OP_INDIRECT) { rin64 = (blkif_x86_64_request_indirect_t *)req64; - req->nr_segments = (uint8_t)rin64->nr_segments; - if (req->nr_segments > VBD_MAX_INDIRECT_SEGMENTS) + req->operation = rin64->indirect_op; + req->handle = rin64->handle; + if (rin64->nr_segments > VBD_MAX_INDIRECT_SEGMENTS) goto bad_nr_segments; + req->nr_segments = (uint8_t)rin64->nr_segments; + req->sector_number = rin64->sector_number; xbdi->xbdi_in_gntref = rin64->indirect_grefs[0]; /* first_sect and segment grefs fetched later */ } else { + req->handle = req64->handle; req->nr_segments = req64->nr_segments; + req->sector_number = req64->sector_number; if (req->nr_segments > BLKIF_MAX_SEGMENTS_PER_REQUEST) goto bad_nr_segments; for (i = 0; i < req->nr_segments; i++) @@ -1269,6 +1276,8 @@ xbdback_co_io_gotio(struct xbdback_insta gop.dest.domid = DOMID_SELF; gop.dest.u.gmfn = ma >> PAGE_SHIFT; + KASSERT(gop.dest.offset + gop.len <= PAGE_SIZE); + if (HYPERVISOR_grant_table_op(GNTTABOP_copy, &gop, 1) != 0) { printf("%s: GNTTABOP_copy failed\n", xbdi->xbdi_name); xbdback_send_reply(xbdi, xbdi->xbdi_xen_req.id,