diff options
author | mav <mav@FreeBSD.org> | 2017-03-22 07:53:57 +0000 |
---|---|---|
committer | mav <mav@FreeBSD.org> | 2017-03-22 07:53:57 +0000 |
commit | 4d00009daee2708ebd78ccdab44fdfe86db86f87 (patch) | |
tree | 9f777a577ee7f1c3965ab1f249aaa7bfbcbc074a | |
parent | 115994b5923a32ce8f7eae6210c62b4ef43ad1d3 (diff) | |
download | FreeBSD-src-4d00009daee2708ebd78ccdab44fdfe86db86f87.zip FreeBSD-src-4d00009daee2708ebd78ccdab44fdfe86db86f87.tar.gz |
MFC r314908: When chunking large DIOCGDELETE, do it on stripe edge.
-rw-r--r-- | sys/geom/geom_dev.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/sys/geom/geom_dev.c b/sys/geom/geom_dev.c index d74b92e..0f8cfcc 100644 --- a/sys/geom/geom_dev.c +++ b/sys/geom/geom_dev.c @@ -458,7 +458,7 @@ g_dev_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag, struct thread { struct g_consumer *cp; struct g_provider *pp; - off_t offset, length, chunk; + off_t offset, length, chunk, odd; int i, error; cp = dev->si_drv2; @@ -518,6 +518,13 @@ g_dev_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag, struct thread g_dev_del_max_sectors * cp->provider->sectorsize) { chunk = g_dev_del_max_sectors * cp->provider->sectorsize; + if (cp->provider->stripesize > 0) { + odd = (offset + chunk + + cp->provider->stripeoffset) % + cp->provider->stripesize; + if (chunk > odd) + chunk -= odd; + } } error = g_delete_data(cp, offset, chunk); length -= chunk; |