Add ioctls DIOCGSLICEINFO and DIOCSYNCSLICEINFO. The latter isn't

finished or tested.
This commit is contained in:
Bruce Evans 1995-04-24 17:07:08 +00:00
parent 0f1a48177b
commit 48b2a92193
2 changed files with 29 additions and 2 deletions

View File

@ -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 <sys/param.h>
@ -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);

View File

@ -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 <sys/ioccom.h>
#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