From 48b2a9219319dfec012b2481ead41bfd5e445227 Mon Sep 17 00:00:00 2001 From: Bruce Evans Date: Mon, 24 Apr 1995 17:07:08 +0000 Subject: [PATCH] Add ioctls DIOCGSLICEINFO and DIOCSYNCSLICEINFO. The latter isn't finished or tested. --- sys/kern/subr_diskslice.c | 25 ++++++++++++++++++++++++- sys/sys/diskslice.h | 6 +++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/sys/kern/subr_diskslice.c b/sys/kern/subr_diskslice.c index eae044bac5c..ba5ae99e8f5 100644 --- a/sys/kern/subr_diskslice.c +++ b/sys/kern/subr_diskslice.c @@ -43,7 +43,7 @@ * from: wd.c,v 1.55 1994/10/22 01:57:12 phk Exp $ * from: @(#)ufs_disksubr.c 7.16 (Berkeley) 5/4/91 * from: ufs_disksubr.c,v 1.8 1994/06/07 01:21:39 phk Exp $ - * $Id: subr_diskslice.c,v 1.8 1995/03/04 11:42:27 bde Exp $ + * $Id: subr_diskslice.c,v 1.9 1995/04/24 06:04:36 bde Exp $ */ #include @@ -281,6 +281,8 @@ dsioctl(dev, cmd, data, flags, ssp, strat, setgeom) d_strategy_t *strat; ds_setgeom_t *setgeom; { + u_char bopenmask; + u_char copenmask; int error; struct disklabel *lp; int old_wlabel; @@ -314,6 +316,10 @@ dsioctl(dev, cmd, data, flags, ssp, strat, setgeom) = &lp->d_partitions[dkpart(dev)]; return (0); + case DIOCGSLICEINFO: + *(struct diskslices *)data = *ssp; + return (0); + case DIOCSBAD: if (slice == WHOLE_DISK_SLICE) return (ENODEV); @@ -355,6 +361,23 @@ dsioctl(dev, cmd, data, flags, ssp, strat, setgeom) set_ds_label(ssp, slice, lp); return (0); + case DIOCSYNCSLICEINFO: + if (slice != WHOLE_DISK_SLICE || dkpart(dev) != RAW_PART) + return (EINVAL); + bopenmask = sp->ds_bopenmask; + copenmask = sp->ds_copenmask; + sp->ds_bopenmask &= ~(1 << RAW_PART); + sp->ds_copenmask &= ~(1 << RAW_PART); + sp->ds_openmask &= ~(1 << RAW_PART); + lp = malloc(sizeof *lp, M_DEVBUF, M_WAITOK); + *lp = *ssp->dss_slices[WHOLE_DISK_SLICE].ds_label; + error = dsopen("SYNCSLICES", dev, 0, &ssp, lp, strat, setgeom); + sp->ds_bopenmask = bopenmask; + sp->ds_copenmask = copenmask; + sp->ds_openmask = bopenmask | copenmask; + free(lp, M_DEVBUF); + return (error); + case DIOCWDINFO: error = dsioctl(dev, DIOCSDINFO, data, flags, ssp, strat, setgeom); diff --git a/sys/sys/diskslice.h b/sys/sys/diskslice.h index 99030e406f9..4dd597bf388 100644 --- a/sys/sys/diskslice.h +++ b/sys/sys/diskslice.h @@ -23,14 +23,18 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: diskslice.h,v 1.4 1995/02/22 21:24:21 bde Exp $ + * $Id: diskslice.h,v 1.5 1995/03/04 11:05:44 bde Exp $ */ #ifndef _SYS_DISKSLICE_H_ #define _SYS_DISKSLICE_H_ +#include + #define BASE_SLICE 2 #define COMPATIBILITY_SLICE 0 +#define DIOCGSLICEINFO _IOR('d', 111, struct diskslices) +#define DIOCSYNCSLICEINFO _IOW('d', 112, int) #define MAX_SLICES 32 #define WHOLE_DISK_SLICE 1