Hi!

I've made a draft patch to support dumping against > 2Gi blocks
for backends like nvme(4) or virtio(4).

Does it look reasonable to you?

Thanks,
rin

On 2025/04/12 16:30, Michael van Elst wrote:
Module Name:    src
Committed By:   mlelstv
Date:           Sat Apr 12 07:30:01 UTC 2025

Modified Files:
        src/sys/dev: ld.c

Log Message:
ld sc_dump backend takes an 'int' as disk address, fail when the
disk address is outside the possible range of an int.


To generate a diff of this commit:
cvs rdiff -u -r1.114 -r1.115 src/sys/dev/ld.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/dev/ld.c
diff -u src/sys/dev/ld.c:1.114 src/sys/dev/ld.c:1.115
--- src/sys/dev/ld.c:1.114      Wed Mar  5 00:41:17 2025
+++ src/sys/dev/ld.c    Sat Apr 12 07:30:01 2025
@@ -1,4 +1,4 @@
-/*     $NetBSD: ld.c,v 1.114 2025/03/05 00:41:17 jakllsch Exp $        */
+/*     $NetBSD: ld.c,v 1.115 2025/04/12 07:30:01 mlelstv Exp $ */
/*-
   * Copyright (c) 1998, 2000 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
   */
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ld.c,v 1.114 2025/03/05 00:41:17 jakllsch Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ld.c,v 1.115 2025/04/12 07:30:01 mlelstv Exp $");
#include <sys/param.h>
  #include <sys/systm.h>
@@ -603,6 +603,12 @@ ld_dumpblocks(device_t dev, void *va, da
        if (sc->sc_dump == NULL)
                return (ENODEV);
+ /*
+        * sc_dump takes only an 'int' as a disk address
+        */
+       if (blkno < 0 || blkno + nblk - 1 > INT_MAX)
+               return (EIO);
+
        return (*sc->sc_dump)(sc, va, blkno, nblk);
  }
From 853041872113cb0ce7b8676b0e080f19948ec125 Mon Sep 17 00:00:00 2001
From: Rin Okuyama <rokuyama...@gmail.com>
Date: Sat, 12 Apr 2025 17:55:12 +0900
Subject: [PATCH] ld(4): Convert blkno argument for sc_dump() to daddr_t

Introduce LDF_BLOCK32 sc_flags to indicate the backend only support
32-bit block address at the same time.

Now, it should be possible to dump against > 2Gi blocks for backends
without LDF_BLOCK32 flag bit.

Compile-test only (for amd64/ALL).
---
 sys/arch/usermode/dev/ld_thunkbus.c | 4 ++--
 sys/dev/ata/ld_ataraid.c            | 5 ++---
 sys/dev/i2o/ld_iop.c                | 4 ++--
 sys/dev/ic/ld_aac.c                 | 4 ++--
 sys/dev/ic/ld_cac.c                 | 6 +++---
 sys/dev/ic/ld_icp.c                 | 5 +++--
 sys/dev/ic/ld_mlx.c                 | 5 +++--
 sys/dev/ic/ld_nvme.c                | 4 ++--
 sys/dev/ld.c                        | 6 ++++--
 sys/dev/ldvar.h                     | 3 ++-
 sys/dev/pci/ld_amr.c                | 5 +++--
 sys/dev/pci/ld_twa.c                | 4 ++--
 sys/dev/pci/ld_twe.c                | 6 +++---
 sys/dev/pci/ld_virtio.c             | 6 +++---
 sys/dev/sdmmc/ld_sdmmc.c            | 6 +++---
 15 files changed, 39 insertions(+), 34 deletions(-)

diff --git a/sys/arch/usermode/dev/ld_thunkbus.c 
b/sys/arch/usermode/dev/ld_thunkbus.c
index f1d366b2e1e..2509b0d0d39 100644
--- a/sys/arch/usermode/dev/ld_thunkbus.c
+++ b/sys/arch/usermode/dev/ld_thunkbus.c
@@ -48,7 +48,7 @@ static int    ld_thunkbus_match(device_t, cfdata_t, void *);
 static void    ld_thunkbus_attach(device_t, device_t, void *);
 
 static int     ld_thunkbus_ldstart(struct ld_softc *, struct buf *);
-static int     ld_thunkbus_lddump(struct ld_softc *, void *, int, int);
+static int     ld_thunkbus_lddump(struct ld_softc *, void *, daddr_t, int);
 static int     ld_thunkbus_ioctl(struct ld_softc *, u_long, void *, int32_t, 
bool);
 
 //#define LD_USE_AIO
@@ -304,7 +304,7 @@ ld_thunkbus_complete(void *arg)
 
 
 static int
-ld_thunkbus_lddump(struct ld_softc *ld, void *data, int blkno, int blkcnt)
+ld_thunkbus_lddump(struct ld_softc *ld, void *data, daddr_t blkno, int blkcnt)
 {
        struct ld_thunkbus_softc *sc = (struct ld_thunkbus_softc *)ld;
        ssize_t len;
diff --git a/sys/dev/ata/ld_ataraid.c b/sys/dev/ata/ld_ataraid.c
index 6c2e95e02dc..07003469380 100644
--- a/sys/dev/ata/ld_ataraid.c
+++ b/sys/dev/ata/ld_ataraid.c
@@ -101,7 +101,7 @@ struct ld_ataraid_softc {
 static int     ld_ataraid_match(device_t, cfdata_t, void *);
 static void    ld_ataraid_attach(device_t, device_t, void *);
 
-static int     ld_ataraid_dump(struct ld_softc *, void *, int, int);
+static int     ld_ataraid_dump(struct ld_softc *, void *, daddr_t, int);
 static int     ld_ataraid_ioctl(struct ld_softc *, u_long, void *, int32_t,
     bool);
 
@@ -581,8 +581,7 @@ out:
 }
 
 static int
-ld_ataraid_dump(struct ld_softc *sc, void *data,
-    int blkno, int blkcnt)
+ld_ataraid_dump(struct ld_softc *sc, void *data, daddr_t blkno, int blkcnt)
 {
 
        return (EIO);
diff --git a/sys/dev/i2o/ld_iop.c b/sys/dev/i2o/ld_iop.c
index fd8259cd801..d577f6a48da 100644
--- a/sys/dev/i2o/ld_iop.c
+++ b/sys/dev/i2o/ld_iop.c
@@ -72,7 +72,7 @@ struct ld_iop_softc {
 static void    ld_iop_adjqparam(device_t, int);
 static void    ld_iop_attach(device_t, device_t, void *);
 static int     ld_iop_detach(device_t, int);
-static int     ld_iop_dump(struct ld_softc *, void *, int, int);
+static int     ld_iop_dump(struct ld_softc *, void *, daddr_t, int);
 static int     ld_iop_flush(struct ld_softc *, bool);
 static int     ld_iop_ioctl(struct ld_softc *, u_long, void *, int32_t, bool);
 static void    ld_iop_intr(device_t, struct iop_msg *, void *);
@@ -401,7 +401,7 @@ ld_iop_start(struct ld_softc *ld, struct buf *bp)
 }
 
 static int
-ld_iop_dump(struct ld_softc *ld, void *data, int blkno, int blkcnt)
+ld_iop_dump(struct ld_softc *ld, void *data, daddr_t blkno, int blkcnt)
 {
        struct iop_msg *im;
        struct iop_softc *iop;
diff --git a/sys/dev/ic/ld_aac.c b/sys/dev/ic/ld_aac.c
index 863960df90b..10ea0382831 100644
--- a/sys/dev/ic/ld_aac.c
+++ b/sys/dev/ic/ld_aac.c
@@ -61,7 +61,7 @@ static void   ld_aac_attach(device_t, device_t, void *);
 static void    ld_aac_intr(struct aac_ccb *);
 static int     ld_aac_dobio(struct ld_aac_softc *, void *, int, daddr_t, int,
                             struct buf *);
-static int     ld_aac_dump(struct ld_softc *, void *, int, int);
+static int     ld_aac_dump(struct ld_softc *, void *, daddr_t, int);
 static int     ld_aac_match(device_t, cfdata_t, void *);
 static int     ld_aac_start(struct ld_softc *, struct buf *);
 
@@ -357,7 +357,7 @@ ld_aac_intr(struct aac_ccb *ac)
 }
 
 static int
-ld_aac_dump(struct ld_softc *ld, void *data, int blkno, int blkcnt)
+ld_aac_dump(struct ld_softc *ld, void *data, daddr_t blkno, int blkcnt)
 {
 
        return (ld_aac_dobio((struct ld_aac_softc *)ld, data,
diff --git a/sys/dev/ic/ld_cac.c b/sys/dev/ic/ld_cac.c
index afe672e8ebe..1d819c3d27a 100644
--- a/sys/dev/ic/ld_cac.c
+++ b/sys/dev/ic/ld_cac.c
@@ -65,7 +65,7 @@ struct ld_cac_softc {
 
 void   ld_cac_attach(device_t, device_t, void *);
 void   ld_cac_done(device_t, void *, int);
-int    ld_cac_dump(struct ld_softc *, void *, int, int);
+int    ld_cac_dump(struct ld_softc *, void *, daddr_t, int);
 int    ld_cac_match(device_t, cfdata_t, void *);
 int    ld_cac_start(struct ld_softc *, struct buf *);
 
@@ -131,7 +131,7 @@ ld_cac_attach(device_t parent, device_t self, void *aux)
        aprint_normal(": %s array\n", type);
 
        /* XXX We should verify this... */
-       ld->sc_flags = LDF_ENABLED | LDF_MPSAFE;
+       ld->sc_flags = LDF_ENABLED | LDF_MPSAFE | LDF_BLOCK32;
        ldattach(ld, BUFQ_DISK_DEFAULT_STRAT);
 }
 
@@ -163,7 +163,7 @@ ld_cac_start(struct ld_softc *ld, struct buf *bp)
 }
 
 int
-ld_cac_dump(struct ld_softc *ld, void *data, int blkno, int blkcnt)
+ld_cac_dump(struct ld_softc *ld, void *data, daddr_t blkno, int blkcnt)
 {
        struct ld_cac_softc *sc;
 
diff --git a/sys/dev/ic/ld_icp.c b/sys/dev/ic/ld_icp.c
index b6fed708692..42aac57c40f 100644
--- a/sys/dev/ic/ld_icp.c
+++ b/sys/dev/ic/ld_icp.c
@@ -64,7 +64,7 @@ static void   ld_icp_attach(device_t, device_t, void *);
 static int     ld_icp_detach(device_t, int);
 static int     ld_icp_dobio(struct ld_icp_softc *, void *, int, int, int,
                     struct buf *);
-static int     ld_icp_dump(struct ld_softc *, void *, int, int);
+static int     ld_icp_dump(struct ld_softc *, void *, daddr_t, int);
 static int     ld_icp_flush(struct ld_softc *, bool);
 static int     ld_icp_ioctl(struct ld_softc *, u_long, void *, int32_t, bool);
 static void    ld_icp_intr(struct icp_ccb *);
@@ -161,6 +161,7 @@ ld_icp_attach(device_t parent, device_t self, void *aux)
        aprint_normal("status: %s\n", str);
 
  out:
+       ld->sc_flags |= LDF_BLOCK32;
        ldattach(ld, BUFQ_DISK_DEFAULT_STRAT);
 }
 
@@ -249,7 +250,7 @@ ld_icp_start(struct ld_softc *ld, struct buf *bp)
 }
 
 static int
-ld_icp_dump(struct ld_softc *ld, void *data, int blkno, int blkcnt)
+ld_icp_dump(struct ld_softc *ld, void *data, daddr_t blkno, int blkcnt)
 {
 
        return (ld_icp_dobio((struct ld_icp_softc *)ld, data,
diff --git a/sys/dev/ic/ld_mlx.c b/sys/dev/ic/ld_mlx.c
index 302141444c5..dab60d7647b 100644
--- a/sys/dev/ic/ld_mlx.c
+++ b/sys/dev/ic/ld_mlx.c
@@ -66,7 +66,7 @@ static void   ld_mlx_attach(device_t, device_t, void *);
 static int     ld_mlx_detach(device_t, int);
 static int     ld_mlx_dobio(struct ld_mlx_softc *, void *, int, int, int,
                             struct buf *);
-static int     ld_mlx_dump(struct ld_softc *, void *, int, int);
+static int     ld_mlx_dump(struct ld_softc *, void *, daddr_t, int);
 static void    ld_mlx_handler(struct mlx_ccb *);
 static int     ld_mlx_match(device_t, cfdata_t, void *);
 static int     ld_mlx_start(struct ld_softc *, struct buf *);
@@ -123,6 +123,7 @@ ld_mlx_attach(device_t parent, device_t self, void *aux)
                statestr = "state unknown";
                break;
        }
+       ld->sc_flags |= LDF_BLOCK32;
 
        if (ms->ms_raidlevel == MLX_SYS_DRV_JBOD)
                aprint_normal(": JBOD, %s\n", statestr);
@@ -244,7 +245,7 @@ ld_mlx_handler(struct mlx_ccb *mc)
 }
 
 static int
-ld_mlx_dump(struct ld_softc *ld, void *data, int blkno, int blkcnt)
+ld_mlx_dump(struct ld_softc *ld, void *data, daddr_t blkno, int blkcnt)
 {
 
        return (ld_mlx_dobio((struct ld_mlx_softc *)ld, data,
diff --git a/sys/dev/ic/ld_nvme.c b/sys/dev/ic/ld_nvme.c
index c02b2ffac92..1ee1d41f244 100644
--- a/sys/dev/ic/ld_nvme.c
+++ b/sys/dev/ic/ld_nvme.c
@@ -59,7 +59,7 @@ CFATTACH_DECL_NEW(ld_nvme, sizeof(struct ld_nvme_softc),
     ld_nvme_match, ld_nvme_attach, ld_nvme_detach, NULL);
 
 static int     ld_nvme_start(struct ld_softc *, struct buf *);
-static int     ld_nvme_dump(struct ld_softc *, void *, int, int);
+static int     ld_nvme_dump(struct ld_softc *, void *, daddr_t, int);
 static int     ld_nvme_flush(struct ld_softc *, bool);
 static int     ld_nvme_getcache(struct ld_softc *, int *);
 static int     ld_nvme_ioctl(struct ld_softc *, u_long, void *, int32_t, bool);
@@ -147,7 +147,7 @@ ld_nvme_start(struct ld_softc *ld, struct buf *bp)
 }
 
 static int
-ld_nvme_dump(struct ld_softc *ld, void *data, int blkno, int blkcnt)
+ld_nvme_dump(struct ld_softc *ld, void *data, daddr_t blkno, int blkcnt)
 {
        struct ld_nvme_softc *sc = device_private(ld->sc_dv);
 
diff --git a/sys/dev/ld.c b/sys/dev/ld.c
index 31fd854e0b1..c35c457b4f7 100644
--- a/sys/dev/ld.c
+++ b/sys/dev/ld.c
@@ -604,9 +604,11 @@ ld_dumpblocks(device_t dev, void *va, daddr_t blkno, int 
nblk)
                return (ENODEV);
 
        /*
-        * sc_dump takes only an 'int' as a disk address
+        * Minimum consistency check; sc_dump() should check
+        * device-dependent constraints if necessary.
         */
-       if (blkno < 0 || blkno + nblk - 1 > INT_MAX)
+       if (blkno < 0 ||
+           ((sc->sc_flags & LDF_BLOCK32) != 0 && blkno + nblk > UINT32_MAX))
                return (EIO);
 
        return (*sc->sc_dump)(sc, va, blkno, nblk);
diff --git a/sys/dev/ldvar.h b/sys/dev/ldvar.h
index d5275d3d7be..609f281917f 100644
--- a/sys/dev/ldvar.h
+++ b/sys/dev/ldvar.h
@@ -61,7 +61,7 @@ struct ld_softc {
        int             sc_maxqueuecnt; /* maximum h/w queue depth */
        char            *sc_typename;   /* inquiry data */
 
-       int             (*sc_dump)(struct ld_softc *, void *, int, int);
+       int             (*sc_dump)(struct ld_softc *, void *, daddr_t, int);
        int             (*sc_ioctl)(struct ld_softc *, u_long, void *, int32_t, 
bool);
        int             (*sc_start)(struct ld_softc *, struct buf *);
        int             (*sc_discard)(struct ld_softc *, struct buf *);
@@ -73,6 +73,7 @@ struct ld_softc {
 #define        LDF_NO_RND      0x040           /* do not attach rnd source */
 #define        LDF_MPSAFE      0x080           /* backend is MPSAFE */
 #define        LDF_SUSPEND     0x100           /* disk is suspended until 
resume */
+#define        LDF_BLOCK32     0x200           /* 32-bit block addressing */
 
 int    ldadjqparam(struct ld_softc *, int);
 void   ldattach(struct ld_softc *, const char *);
diff --git a/sys/dev/pci/ld_amr.c b/sys/dev/pci/ld_amr.c
index e6694739ed8..4183eeb248c 100644
--- a/sys/dev/pci/ld_amr.c
+++ b/sys/dev/pci/ld_amr.c
@@ -65,7 +65,7 @@ struct ld_amr_softc {
 
 static int     ld_amr_dobio(struct ld_amr_softc *, void *, int, int, int,
                             struct buf *);
-static int     ld_amr_dump(struct ld_softc *, void *, int, int);
+static int     ld_amr_dump(struct ld_softc *, void *, daddr_t, int);
 static void    ld_amr_handler(struct amr_ccb *);
 static int     ld_amr_start(struct ld_softc *, struct buf *);
 
@@ -106,6 +106,7 @@ ld_amr_attach(device_t parent, device_t self, void *aux)
            &happy);
        if (happy)
                ld->sc_flags = LDF_ENABLED;
+       ld->sc_flags |= LDF_BLOCK32;
        aprint_normal(": RAID %d, %s\n",
            amr->amr_drive[sc->sc_hwunit].al_properties & AMR_DRV_RAID_MASK,
            statestr);
@@ -195,7 +196,7 @@ ld_amr_handler(struct amr_ccb *ac)
 }
 
 static int
-ld_amr_dump(struct ld_softc *ld, void *data, int blkno, int blkcnt)
+ld_amr_dump(struct ld_softc *ld, void *data, daddr_t blkno, int blkcnt)
 {
        struct ld_amr_softc *sc;
 
diff --git a/sys/dev/pci/ld_twa.c b/sys/dev/pci/ld_twa.c
index f3b44c4d433..b3b079ccda6 100644
--- a/sys/dev/pci/ld_twa.c
+++ b/sys/dev/pci/ld_twa.c
@@ -75,7 +75,7 @@ static void   ld_twa_attach(device_t, device_t, void *);
 static int     ld_twa_detach(device_t, int);
 static int     ld_twa_dobio(struct ld_twa_softc *, void *, size_t, daddr_t,
                             struct buf *);
-static int     ld_twa_dump(struct ld_softc *, void *, int, int);
+static int     ld_twa_dump(struct ld_softc *, void *, daddr_t, int);
 static int     ld_twa_flush(struct ld_softc *, bool);
 static int     ld_twa_ioctl(struct ld_softc *, u_long, void *, int32_t, bool);
 static void    ld_twa_handler(struct twa_request *);
@@ -221,7 +221,7 @@ ld_twa_handler(struct twa_request *tr)
 }
 
 static int
-ld_twa_dump(struct ld_softc *ld, void *data, int blkno, int blkcnt)
+ld_twa_dump(struct ld_softc *ld, void *data, daddr_t blkno, int blkcnt)
 {
 
 #if 0
diff --git a/sys/dev/pci/ld_twe.c b/sys/dev/pci/ld_twe.c
index dc4e0f3e8f1..cc548f388ba 100644
--- a/sys/dev/pci/ld_twe.c
+++ b/sys/dev/pci/ld_twe.c
@@ -65,7 +65,7 @@ static void   ld_twe_attach(device_t, device_t, void *);
 static int     ld_twe_detach(device_t, int);
 static int     ld_twe_dobio(struct ld_twe_softc *, void *, int, int, int,
                             struct buf *);
-static int     ld_twe_dump(struct ld_softc *, void *, int, int);
+static int     ld_twe_dump(struct ld_softc *, void *, daddr_t, int);
 static int     ld_twe_flush(struct ld_softc *, bool);
 static int     ld_twe_ioctl(struct ld_softc *, u_long, void *, int32_t, bool);
 static void    ld_twe_handler(struct twe_ccb *, int);
@@ -106,7 +106,7 @@ ld_twe_attach(device_t parent, device_t self, void *aux)
        twe_register_callbacks(twe, twea->twea_unit, &ld_twe_callbacks);
 
        sc->sc_hwunit = twea->twea_unit;
-       ld->sc_flags = LDF_ENABLED;
+       ld->sc_flags = LDF_ENABLED | LDF_BLOCK32;
        ld->sc_maxxfer = twe_get_maxxfer(twe_get_maxsegs());
        ld->sc_secperunit = td->td_size;
        ld->sc_secsize = TWE_SECTOR_SIZE;
@@ -259,7 +259,7 @@ ld_twe_handler(struct twe_ccb *ccb, int error)
 }
 
 static int
-ld_twe_dump(struct ld_softc *ld, void *data, int blkno, int blkcnt)
+ld_twe_dump(struct ld_softc *ld, void *data, daddr_t blkno, int blkcnt)
 {
 
        return (ld_twe_dobio((struct ld_twe_softc *)ld, data,
diff --git a/sys/dev/pci/ld_virtio.c b/sys/dev/pci/ld_virtio.c
index bddab19c749..47059091ef6 100644
--- a/sys/dev/pci/ld_virtio.c
+++ b/sys/dev/pci/ld_virtio.c
@@ -210,7 +210,7 @@ ld_virtio_match(device_t parent, cfdata_t match, void *aux)
 }
 
 static int ld_virtio_vq_done(struct virtqueue *);
-static int ld_virtio_dump(struct ld_softc *, void *, int, int);
+static int ld_virtio_dump(struct ld_softc *, void *, daddr_t, int);
 static int ld_virtio_start(struct ld_softc *, struct buf *);
 static int ld_virtio_ioctl(struct ld_softc *, u_long, void *, int32_t, bool);
 static int ld_virtio_info(struct ld_softc *, bool);
@@ -749,7 +749,7 @@ again:
 }
 
 static int
-ld_virtio_dump(struct ld_softc *ld, void *data, int blkno, int blkcnt)
+ld_virtio_dump(struct ld_softc *ld, void *data, daddr_t blkno, int blkcnt)
 {
        struct ld_virtio_softc *sc = device_private(ld->sc_dv);
        struct virtio_softc *vsc = sc->sc_virtio;
@@ -789,7 +789,7 @@ ld_virtio_dump(struct ld_softc *ld, void *data, int blkno, 
int blkcnt)
        vr->vr_hdr.type   = virtio_rw32(vsc, VIRTIO_BLK_T_OUT);
        vr->vr_hdr.ioprio = virtio_rw32(vsc, 0);
        vr->vr_hdr.sector = virtio_rw64(vsc,
-                       (daddr_t) blkno * ld->sc_secsize /
+                       blkno * ld->sc_secsize /
                        VIRTIO_BLK_BSIZE);
 
        bus_dmamap_sync(virtio_dmat(vsc), vr->vr_cmdsts,
diff --git a/sys/dev/sdmmc/ld_sdmmc.c b/sys/dev/sdmmc/ld_sdmmc.c
index 2046973cc7f..99c35d929c5 100644
--- a/sys/dev/sdmmc/ld_sdmmc.c
+++ b/sys/dev/sdmmc/ld_sdmmc.c
@@ -111,7 +111,7 @@ static int ld_sdmmc_match(device_t, cfdata_t, void *);
 static void ld_sdmmc_attach(device_t, device_t, void *);
 static int ld_sdmmc_detach(device_t, int);
 
-static int ld_sdmmc_dump(struct ld_softc *, void *, int, int);
+static int ld_sdmmc_dump(struct ld_softc *, void *, daddr_t, int);
 static int ld_sdmmc_start(struct ld_softc *, struct buf *);
 static void ld_sdmmc_restart(void *);
 static int ld_sdmmc_discard(struct ld_softc *, struct buf *);
@@ -289,7 +289,7 @@ ld_sdmmc_attach(device_t parent, device_t self, void *aux)
        sc->sc_hwunit = 0;      /* always 0? */
        sc->sc_sf = sa->sf;
 
-       ld->sc_flags = LDF_ENABLED | LDF_MPSAFE;
+       ld->sc_flags = LDF_ENABLED | LDF_MPSAFE | LDF_BLOCK32;
        ld->sc_secperunit = sc->sc_sf->csd.capacity;
        ld->sc_secsize = SDMMC_SECTOR_SIZE;
        ld->sc_maxxfer = MAXPHYS;
@@ -510,7 +510,7 @@ done_locked:
 }
 
 static int
-ld_sdmmc_dump(struct ld_softc *ld, void *data, int blkno, int blkcnt)
+ld_sdmmc_dump(struct ld_softc *ld, void *data, daddr_t blkno, int blkcnt)
 {
        struct ld_sdmmc_softc *sc = device_private(ld->sc_dv);
 
-- 
2.46.1

Reply via email to