summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2020-10-19 16:05:50 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2020-10-27 06:25:17 +0100
commitdebc0aed8b9bef9996b8ec0ae7a70b0b41912e27 (patch)
tree36d7688f6e2d5085f792879a6c79ef35ed39dcbf
parentNVD(4): Fix NULL pointer access in nvd_sync() (diff)
downloadrtems-libbsd-debc0aed8b9bef9996b8ec0ae7a70b0b41912e27.tar.bz2
NVD(4): Fix logical block count calculation
Close #4165.
-rw-r--r--rtemsbsd/sys/dev/nvd/nvd.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/rtemsbsd/sys/dev/nvd/nvd.c b/rtemsbsd/sys/dev/nvd/nvd.c
index 85069e3c..4a8e8ac1 100644
--- a/rtemsbsd/sys/dev/nvd/nvd.c
+++ b/rtemsbsd/sys/dev/nvd/nvd.c
@@ -165,10 +165,9 @@ nvd_completion(void *arg, const struct nvme_completion *status)
static int
nvd_request(struct nvd_disk *ndisk, rtems_blkdev_request *req,
- uint32_t media_blocks_per_block)
+ uint32_t media_block_size)
{
uint32_t i;
- uint32_t lb_count;
uint32_t bufnum;
BSD_ASSERT(req->req == RTEMS_BLKDEV_REQ_READ ||
@@ -179,13 +178,15 @@ nvd_request(struct nvd_disk *ndisk, rtems_blkdev_request *req,
req->status = RTEMS_SUCCESSFUL;
bufnum = req->bufnum;
req->bufnum |= bufnum << NVD_BUFNUM_SHIFT;
- lb_count = media_blocks_per_block * ndisk->lb_per_media_block;
for (i = 0; i < bufnum; ++i) {
rtems_blkdev_sg_buffer *sg;
+ uint32_t lb_count;
int error;
sg = &req->bufs[i];
+ lb_count = (sg->length / media_block_size) *
+ ndisk->lb_per_media_block;
if (req->req == RTEMS_BLKDEV_REQ_READ) {
error = nvme_ns_cmd_read(ndisk->ns, sg->buffer,
@@ -240,7 +241,7 @@ nvd_ioctl(rtems_disk_device *dd, uint32_t req, void *arg)
ndisk = rtems_disk_get_driver_data(dd);
if (req == RTEMS_BLKIO_REQUEST) {
- return (nvd_request(ndisk, arg, dd->media_blocks_per_block));
+ return (nvd_request(ndisk, arg, dd->media_block_size));
}
if (req == RTEMS_BLKDEV_REQ_SYNC) {