diff options
author | asami <asami@FreeBSD.org> | 1996-01-02 23:32:54 +0000 |
---|---|---|
committer | asami <asami@FreeBSD.org> | 1996-01-02 23:32:54 +0000 |
commit | 23f4e3fcb853691216c79e2e2c178c17d29a8983 (patch) | |
tree | 1c8411743f9147deb478c14ba5710bd6112785f2 /sys/geom/geom_ccd.c | |
parent | 6264b37021141ac291fbe092fea97873e3faebb8 (diff) | |
download | FreeBSD-src-23f4e3fcb853691216c79e2e2c178c17d29a8983.zip FreeBSD-src-23f4e3fcb853691216c79e2e2c178c17d29a8983.tar.gz |
Prepare to add support for parity. Report the post-parity size,
allocate space around parity blocks.
Diffstat (limited to 'sys/geom/geom_ccd.c')
-rw-r--r-- | sys/geom/geom_ccd.c | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/sys/geom/geom_ccd.c b/sys/geom/geom_ccd.c index 40792d3..79f5890 100644 --- a/sys/geom/geom_ccd.c +++ b/sys/geom/geom_ccd.c @@ -1,4 +1,4 @@ -/* $Id$ */ +/* $Id: ccd.c,v 1.3 1995/12/28 00:22:45 asami Exp $ */ /* $NetBSD: ccd.c,v 1.22 1995/12/08 19:13:26 thorpej Exp $ */ @@ -419,7 +419,10 @@ ccdinit(ccd, cpaths, p) for (ci = cs->sc_cinfo; ci < &cs->sc_cinfo[cs->sc_nccdisks]; ci++) ci->ci_size = minsize; - cs->sc_size = cs->sc_nccdisks * minsize; + if (ccd->ccd_flags & CCDF_PARITY) + cs->sc_size = (cs->sc_nccdisks-1) * minsize; + else + cs->sc_size = cs->sc_nccdisks * minsize; } /* @@ -810,8 +813,16 @@ ccdbuffer(cs, bp, bn, addr, bcount) ccdisk = ii->ii_index[0]; cbn = ii->ii_startoff + off; } else { - ccdisk = ii->ii_index[off % ii->ii_ndisk]; - cbn = ii->ii_startoff + off / ii->ii_ndisk; + if (cs->sc_cflags & CCDF_PARITY) { + ccdisk = ii->ii_index[off % (ii->ii_ndisk-1)]; + cbn = ii->ii_startoff + off / (ii->ii_ndisk-1); + if (cbn % ii->ii_ndisk <= ccdisk) + ccdisk++; + } + else { + ccdisk = ii->ii_index[off % ii->ii_ndisk]; + cbn = ii->ii_startoff + off / ii->ii_ndisk; + } } cbn *= cs->sc_ileave; ci = &cs->sc_cinfo[ccdisk]; @@ -1038,6 +1049,11 @@ ccdioctl(dev, cmd, data, flag, p) /* Fill in some important bits. */ ccd.ccd_unit = unit; ccd.ccd_interleave = ccio->ccio_ileave; + if ((ccio->ccio_flags & CCDF_PARITY) && + !(ccio->ccio_flags & CCDF_UNIFORM)) { + printf("ccd%d: parity forces uniform flag\n", unit); + ccio->ccio_flags |= CCDF_UNIFORM; + } ccd.ccd_flags = ccio->ccio_flags & CCDF_USERMASK; /* |