summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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 614139c..aaf6323 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 6aae347..fae7f34 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 f8688e1..9446186 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 3d24296..1ae88fb 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 b044111..bdd6670 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 5e2f939..bd3bf2e 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 ef23af0..6f90507 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 418fa4d..108a013 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 a47724f..6aa466b 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 64745bf..35e7896 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 78d496a..5c9d6ad 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;
OpenPOWER on IntegriCloud