aboutsummaryrefslogtreecommitdiff
path: root/sys/geom
diff options
context:
space:
mode:
authorPoul-Henning Kamp <phk@FreeBSD.org>2002-10-20 20:28:24 +0000
committerPoul-Henning Kamp <phk@FreeBSD.org>2002-10-20 20:28:24 +0000
commit3f12caa1802e84dc2234069edb93f1040ca01027 (patch)
tree4be4d44cd73707526477ac8dedf166de6841e46d /sys/geom
parent943305f753597261cb01a76f4876ce5325968867 (diff)
downloadsrc-3f12caa1802e84dc2234069edb93f1040ca01027.tar.gz
src-3f12caa1802e84dc2234069edb93f1040ca01027.zip
Now that the sectorsize and mediasize are properties of the provider,
don't take the detour over the I/O path to discover them using getattr(), we can just pick them out directly. Do note though, that for now they are only valid after the first open of the underlying disk device due compatibility with the old disk_create() API. This will change in the future so they will always be valid. Sponsored by: DARPA & NAI Labs.
Notes
Notes: svn path=/head/; revision=105551
Diffstat (limited to 'sys/geom')
-rw-r--r--sys/geom/bde/g_bde.c12
-rw-r--r--sys/geom/geom_aes.c13
-rw-r--r--sys/geom/geom_bsd.c18
-rw-r--r--sys/geom/geom_ctl.c1
-rw-r--r--sys/geom/geom_dev.c14
-rw-r--r--sys/geom/geom_disk.c12
-rw-r--r--sys/geom/geom_gpt.c4
-rw-r--r--sys/geom/geom_mbr.c8
-rw-r--r--sys/geom/geom_pc98.c16
-rw-r--r--sys/geom/geom_slice.c11
-rw-r--r--sys/geom/geom_sunlabel.c16
11 files changed, 38 insertions, 87 deletions
diff --git a/sys/geom/bde/g_bde.c b/sys/geom/bde/g_bde.c
index 614139c8811c..aaf6323ae5a0 100644
--- a/sys/geom/bde/g_bde.c
+++ b/sys/geom/bde/g_bde.c
@@ -68,10 +68,6 @@ g_bde_start(struct bio *bp)
break;
case BIO_GETATTR:
case BIO_SETATTR:
- if (g_handleattr_off_t(bp, "GEOM::mediasize", sc->mediasize))
- return;
- if (g_handleattr_int(bp, "GEOM::sectorsize", sc->sectorsize))
- return;
g_io_deliver(bp, EOPNOTSUPP);
break;
default:
@@ -213,12 +209,8 @@ g_bde_create(struct g_createargs *ga)
}
g_topology_unlock();
while (1) {
- error = g_getattr("GEOM::sectorsize", cp, &sectorsize);
- if (error)
- break;
- error = g_getattr("GEOM::mediasize", cp, &mediasize);
- if (error)
- break;
+ sectorsize = cp->provider->sectorsize;
+ mediasize = cp->provider->mediasize;
sc = g_malloc(sizeof(struct g_bde_softc), M_WAITOK | M_ZERO);
gp->softc = sc;
sc->geom = gp;
diff --git a/sys/geom/geom_aes.c b/sys/geom/geom_aes.c
index 6aae3474d54c..fae7f3485464 100644
--- a/sys/geom/geom_aes.c
+++ b/sys/geom/geom_aes.c
@@ -229,10 +229,6 @@ g_aes_start(struct bio *bp)
break;
case BIO_GETATTR:
case BIO_SETATTR:
- if (g_handleattr_off_t(bp, "GEOM::mediasize", sc->mediasize))
- return;
- if (g_handleattr_int(bp, "GEOM::sectorsize", sc->sectorsize))
- return;
bp2 = g_clone_bio(bp);
if (bp2 == NULL) {
g_io_deliver(bp, ENOMEM);
@@ -320,12 +316,8 @@ g_aes_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
while (1) {
if (gp->rank != 2)
break;
- error = g_getattr("GEOM::sectorsize", cp, &sectorsize);
- if (error)
- break;
- error = g_getattr("GEOM::mediasize", cp, &mediasize);
- if (error)
- break;
+ sectorsize = cp->provider->sectorsize;
+ mediasize = cp->provider->mediasize;
buf = g_read_data(cp, 0, sectorsize, &error);
if (buf == NULL || error != 0) {
break;
@@ -373,6 +365,7 @@ g_aes_taste(struct g_class *mp, struct g_provider *pp, int flags __unused)
g_topology_lock();
pp = g_new_providerf(gp, gp->name);
pp->mediasize = mediasize - sectorsize;
+ pp->sectorsize = sectorsize;
g_error_provider(pp, 0);
g_topology_unlock();
break;
diff --git a/sys/geom/geom_bsd.c b/sys/geom/geom_bsd.c
index f8688e1d97a7..94461860a162 100644
--- a/sys/geom/geom_bsd.c
+++ b/sys/geom/geom_bsd.c
@@ -319,12 +319,8 @@ g_bsd_modify(struct g_geom *gp, struct disklabel *dl)
/* Get dimensions of our device. */
cp = LIST_FIRST(&gp->consumer);
- error = g_getattr("GEOM::sectorsize", cp, &secsize);
- if (error)
- return (error);
- error = g_getattr("GEOM::mediasize", cp, &mediasize);
- if (error)
- return (error);
+ secsize = cp->provider->sectorsize;
+ mediasize = cp->provider->mediasize;
#ifdef nolonger
/*
@@ -513,11 +509,7 @@ g_bsd_ioctl(void *arg)
KASSERT(gio->cmd == DIOCWDINFO, ("Unknown ioctl in g_bsd_ioctl"));
cp = LIST_FIRST(&gp->consumer);
/* Get sector size, we need it to read data. */
- error = g_getattr("GEOM::sectorsize", cp, &secsize);
- if (error || secsize < 512) {
- g_io_deliver(bp, error);
- return;
- }
+ secsize = cp->provider->sectorsize;
secoff = ms->labeloffset % secsize;
buf = g_read_data(cp, ms->labeloffset - secoff, secsize, &error);
if (buf == NULL || error != 0) {
@@ -703,8 +695,8 @@ g_bsd_taste(struct g_class *mp, struct g_provider *pp, int flags)
break;
/* Get sector size, we need it to read data. */
- error = g_getattr("GEOM::sectorsize", cp, &secsize);
- if (error || secsize < 512)
+ secsize = cp->provider->sectorsize;
+ if (secsize < 512)
break;
/* First look for a label at the start of the second sector. */
diff --git a/sys/geom/geom_ctl.c b/sys/geom/geom_ctl.c
index 3d242960a2e1..1ae88fb562b3 100644
--- a/sys/geom/geom_ctl.c
+++ b/sys/geom/geom_ctl.c
@@ -85,6 +85,7 @@ g_ctl_init2(void *p __unused)
gp->start = g_ctl_start;
gp->access = g_ctl_access;
pp = g_new_providerf(gp, "%s", gp->name);
+ pp->sectorsize = 512;
g_error_provider(pp, 0);
}
diff --git a/sys/geom/geom_dev.c b/sys/geom/geom_dev.c
index b04411167607..bdd667009a9c 100644
--- a/sys/geom/geom_dev.c
+++ b/sys/geom/geom_dev.c
@@ -245,13 +245,13 @@ g_dev_ioctl(dev_t dev, u_long cmd, caddr_t data, int fflag, struct thread *td)
i = IOCPARM_LEN(cmd);
switch (cmd) {
case DIOCGSECTORSIZE:
- error = g_io_getattr("GEOM::sectorsize", cp, &i, data);
- if (error == 0 && *(u_int *)data == 0)
+ *(u_int *)data = cp->provider->sectorsize;
+ if (*(u_int *)data == 0)
error = ENOENT;
break;
case DIOCGMEDIASIZE:
- error = g_io_getattr("GEOM::mediasize", cp, &i, data);
- if (error == 0 && *(off_t *)data == 0)
+ *(off_t *)data = cp->provider->mediasize;
+ if (*(off_t *)data == 0)
error = ENOENT;
break;
case DIOCGFWSECTORS:
@@ -329,15 +329,11 @@ static int
g_dev_psize(dev_t dev)
{
struct g_consumer *cp;
- int i, error;
off_t mediasize;
cp = dev->si_drv2;
- i = sizeof mediasize;
- error = g_io_getattr("GEOM::mediasize", cp, &i, &mediasize);
- if (error)
- return (-1);
+ mediasize = cp->provider->mediasize;
return (mediasize >> DEV_BSHIFT);
}
diff --git a/sys/geom/geom_disk.c b/sys/geom/geom_disk.c
index 5e2f93944a03..bd3bf2ed311d 100644
--- a/sys/geom/geom_disk.c
+++ b/sys/geom/geom_disk.c
@@ -89,6 +89,8 @@ g_disk_access(struct g_provider *pp, int r, int w, int e)
if (error != 0)
printf("Opened disk %s -> %d\n", pp->name, error);
mtx_unlock(&Giant);
+ pp->mediasize = dp->d_mediasize;
+ pp->sectorsize = dp->d_sectorsize;
} else if ((pp->acr + pp->acw + pp->ace) > 0 && (r + w + e) == 0) {
mtx_lock(&Giant);
error = devsw(dev)->d_close(dev, 3, 0, NULL);
@@ -98,8 +100,6 @@ g_disk_access(struct g_provider *pp, int r, int w, int e)
} else {
error = 0;
}
- pp->mediasize = dp->d_mediasize;
- pp->sectorsize = dp->d_sectorsize;
return (error);
}
@@ -166,14 +166,10 @@ g_disk_start(struct bio *bp)
mtx_unlock(&Giant);
break;
case BIO_GETATTR:
- if (g_handleattr_int(bp, "GEOM::sectorsize", dp->d_sectorsize))
- break;
- else if (g_handleattr_int(bp, "GEOM::fwsectors", dp->d_fwsectors))
+ if (g_handleattr_int(bp, "GEOM::fwsectors", dp->d_fwsectors))
break;
else if (g_handleattr_int(bp, "GEOM::fwheads", dp->d_fwheads))
break;
- else if (g_handleattr_off_t(bp, "GEOM::mediasize", dp->d_mediasize))
- break;
else if (g_handleattr_off_t(bp, "GEOM::frontstuff", 0))
break;
else if (!strcmp(bp->bio_attribute, "GEOM::kerneldump"))
@@ -236,6 +232,8 @@ g_disk_create(void *arg)
gp->dumpconf = g_disk_dumpconf;
dev->si_disk->d_softc = gp;
pp = g_new_providerf(gp, "%s", gp->name);
+ pp->mediasize = dev->si_disk->d_mediasize;
+ pp->sectorsize = dev->si_disk->d_sectorsize;
g_error_provider(pp, 0);
}
diff --git a/sys/geom/geom_gpt.c b/sys/geom/geom_gpt.c
index ef23af060f3f..6f90507461d9 100644
--- a/sys/geom/geom_gpt.c
+++ b/sys/geom/geom_gpt.c
@@ -168,8 +168,8 @@ g_gpt_taste(struct g_class *mp, struct g_provider *pp, int insist)
if (gp->rank != 2 && insist == 0)
break;
- error = g_getattr("GEOM::sectorsize", cp, &secsz);
- if (error)
+ secsz = cp->provider->sectorsize;
+ if (secsz < 512)
break;
/* XXX: we need to get the media size as well. */
diff --git a/sys/geom/geom_mbr.c b/sys/geom/geom_mbr.c
index 418fa4df730a..108a013277bb 100644
--- a/sys/geom/geom_mbr.c
+++ b/sys/geom/geom_mbr.c
@@ -192,9 +192,7 @@ g_mbr_taste(struct g_class *mp, struct g_provider *pp, int insist)
error = g_getattr("GEOM::fwsectors", cp, &fwsectors);
if (error)
fwsectors = 17;
- error = g_getattr("GEOM::sectorsize", cp, &sectorsize);
- if (error)
- break;
+ sectorsize = cp->provider->sectorsize;
if (sectorsize != 512)
break;
gsp->frontstuff = sectorsize * fwsectors;
@@ -355,9 +353,7 @@ g_mbrext_taste(struct g_class *mp, struct g_provider *pp, int insist __unused)
error = g_getattr("GEOM::fwsectors", cp, &fwsectors);
if (error)
fwsectors = 17;
- error = g_getattr("GEOM::sectorsize", cp, &sectorsize);
- if (error)
- break;
+ sectorsize = cp->provider->sectorsize;
if (sectorsize != 512)
break;
gsp->frontstuff = sectorsize * fwsectors;
diff --git a/sys/geom/geom_pc98.c b/sys/geom/geom_pc98.c
index a47724f5f54e..6aa466b46b36 100644
--- a/sys/geom/geom_pc98.c
+++ b/sys/geom/geom_pc98.c
@@ -113,18 +113,10 @@ g_pc98_taste(struct g_class *mp, struct g_provider *pp, int flags)
while (1) { /* a trick to allow us to use break */
if (gp->rank != 2 && flags == G_TF_NORMAL)
break;
- error = g_getattr("GEOM::sectorsize", cp, &sectorsize);
- if (error) {
- sectorsize = 512;
- printf("g_pc98_taste: error %d Sectors are %d bytes\n",
- error, sectorsize);
- }
- error = g_getattr("GEOM::mediasize", cp, &mediasize);
- if (error) {
- mediasize = 0;
- printf("g_error %d Mediasize is %jd bytes\n",
- error, (intmax_t)mediasize);
- }
+ sectorsize = cp->provider->sectorsize;
+ if (sectorsize < 512)
+ break;
+ mediasize = cp->provider->mediasize;
error = g_getattr("GEOM::fwsectors", cp, &fwsect);
if (error || fwsect == 0) {
fwsect = 17;
diff --git a/sys/geom/geom_slice.c b/sys/geom/geom_slice.c
index 64745bf00960..35e7896db7ed 100644
--- a/sys/geom/geom_slice.c
+++ b/sys/geom/geom_slice.c
@@ -163,9 +163,6 @@ g_slice_start(struct bio *bp)
/* Give the real method a chance to override */
if (gsp->start(bp))
return;
- if (g_handleattr_off_t(bp, "GEOM::mediasize",
- gsp->slices[index].length))
- return;
if (!strcmp("GEOM::frontstuff", bp->bio_attribute)) {
t = gsp->cfrontstuff;
if (gsp->frontstuff > t)
@@ -335,10 +332,12 @@ g_slice_new(struct g_class *mp, int slices, struct g_provider *pp, struct g_cons
gp->spoiled = g_std_spoiled;
gp->dumpconf = g_slice_dumpconf;
cp = g_new_consumer(gp);
- g_attach(cp, pp);
- error = g_access_rel(cp, 1, 0, 0);
+ error = g_attach(cp, pp);
+ if (error == 0)
+ error = g_access_rel(cp, 1, 0, 0);
if (error) {
- g_detach(cp);
+ if (cp->provider != NULL)
+ g_detach(cp);
g_destroy_consumer(cp);
g_free(gsp->slices);
g_free(gp->softc);
diff --git a/sys/geom/geom_sunlabel.c b/sys/geom/geom_sunlabel.c
index 78d496a9bac0..5c9d6ad123cf 100644
--- a/sys/geom/geom_sunlabel.c
+++ b/sys/geom/geom_sunlabel.c
@@ -110,19 +110,11 @@ g_sunlabel_taste(struct g_class *mp, struct g_provider *pp, int flags)
while (1) { /* a trick to allow us to use break */
if (gp->rank != 2 && flags == G_TF_NORMAL)
break;
- error = g_getattr("GEOM::sectorsize", cp, &sectorsize);
- if (error) {
- sectorsize = 512;
- printf("g_sunlabel_taste: error %d Sectors are %d bytes\n",
- error, sectorsize);
- }
+ sectorsize = cp->provider->sectorsize;
+ if (sectorsize < 512)
+ break;
gsp->frontstuff = 16 * sectorsize;
- error = g_getattr("GEOM::mediasize", cp, &mediasize);
- if (error) {
- mediasize = 0;
- printf("g_error %d Mediasize is %lld bytes\n",
- error, (long long)mediasize);
- }
+ mediasize = cp->provider->mediasize;
buf = g_read_data(cp, 0, sectorsize, &error);
if (buf == NULL || error != 0)
break;