diff --git a/sys/geom/part/g_part_bsd64.c b/sys/geom/part/g_part_bsd64.c
index bc0112fbb7ed..52971b3913cf 100644
--- a/sys/geom/part/g_part_bsd64.c
+++ b/sys/geom/part/g_part_bsd64.c
@@ -473,18 +473,22 @@ g_part_bsd64_probe(struct g_part_table *table, struct g_consumer *cp)
{
struct g_provider *pp;
uint32_t v;
+ off_t secstart, secend;
int error;
u_char *buf;
pp = cp->provider;
if (pp->mediasize < 2 * PALIGN_SIZE)
return (ENOSPC);
- v = rounddown2(pp->sectorsize + offsetof(struct disklabel64, d_magic),
- pp->sectorsize);
- buf = g_read_data(cp, 0, v, &error);
+ secstart = rounddown2(offsetof(struct disklabel64, d_magic),
+ pp->sectorsize);
+ secend = roundup2(offsetof(struct disklabel64, d_magic) +
+ sizeof(((struct disklabel64 *)0)->d_magic),
+ pp->sectorsize);
+ buf = g_read_data(cp, secstart, secend - secstart, &error);
if (buf == NULL)
return (error);
- v = le32dec(buf + offsetof(struct disklabel64, d_magic));
+ v = le32dec(buf + (offsetof(struct disklabel64, d_magic) - secstart));
g_free(buf);
return (v == DISKMAGIC64 ? G_PART_PROBE_PRI_HIGH: ENXIO);
}