- break;
- }
- {
- struct buf *bp;
- struct disklabel *dlp;
-
- *lp = *(struct disklabel *)data;
- bp = geteblk(lp->d_secsize);
- bp->b_dev = makedev(major(dev), hpminor(hpunit(dev), 0));
- bp->b_blkno = LABELSECTOR;
- bp->b_bcount = lp->d_secsize;
- bp->b_flags = B_READ;
- dlp = (struct disklabel *)(bp->b_un.b_addr + LABELOFFSET);
- hpstrategy(bp);
- biowait(bp);
- if (bp->b_flags & B_ERROR) {
- error = u.u_error; /* XXX */
- u.u_error = 0;
- goto bad;
- }
- *dlp = *lp;
- bp->b_flags = B_WRITE;
- hpstrategy(bp);
- biowait(bp);
- if (bp->b_flags & B_ERROR) {
- error = u.u_error; /* XXX */
- u.u_error = 0;
- }
-bad:
- brelse(bp);
+ else if ((error = setdisklabel(lp, (struct disklabel *)data,
+ (sc->sc_state == OPENRAW) ? 0 : sc->sc_openpart)) == 0) {
+ sc->sc_state = OPEN;
+ error = writedisklabel(dev, hpstrategy, lp);