md: Clamp to a multiple of the sector size when resizing

We do this when creating md(4) devices, in kern_mdattach_locked(), but
not when resizing the provider.  Apply the same policy when resizing, as
many GEOM classes do not expect to deal with providers for which
pp->mediasize % pp->sectorsize != 0.

Reported by:	syzkaller
MFC after:	1 week
Sponsored by:	The FreeBSD Foundation
This commit is contained in:
Mark Johnston 2021-08-31 15:35:08 -04:00
parent e3bdf3da76
commit 47619b6044

View file

@ -1580,6 +1580,7 @@ mdresize(struct md_s *sc, struct md_req *mdr)
}
sc->mediasize = mdr->md_mediasize;
g_topology_lock();
g_resize_provider(sc->pp, sc->mediasize);
g_topology_unlock();
@ -1787,6 +1788,7 @@ kern_mdresize_locked(struct md_req *mdr)
return (ENOENT);
if (mdr->md_mediasize < sc->sectorsize)
return (EINVAL);
mdr->md_mediasize -= mdr->md_mediasize % sc->sectorsize;
if (mdr->md_mediasize < sc->mediasize &&
!(sc->flags & MD_FORCE) &&
!(mdr->md_options & MD_FORCE))