root/sys/dev/raid/vinum/vinumio.h
/*-
 * Copyright (c) 1997, 1998
 *      Nan Yang Computer Services Limited.  All rights reserved.
 *
 *  This software is distributed under the so-called ``Berkeley
 *  License'':
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *      This product includes software developed by Nan Yang Computer
 *      Services Limited.
 * 4. Neither the name of the Company nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * This software is provided ``as is'', and any express or implied
 * warranties, including, but not limited to, the implied warranties of
 * merchantability and fitness for a particular purpose are disclaimed.
 * In no event shall the company or contributors be liable for any
 * direct, indirect, incidental, special, exemplary, or consequential
 * damages (including, but not limited to, procurement of substitute
 * goods or services; loss of use, data, or profits; or business
 * interruption) however caused and on any theory of liability, whether
 * in contract, strict liability, or tort (including negligence or
 * otherwise) arising in any way out of the use of this software, even if
 * advised of the possibility of such damage.
 */

#include <sys/ioccom.h>

#define L 'F'                   /* ID letter of our ioctls */

#ifdef VINUMDEBUG
#define MAX_IOCTL_REPLY 1024
#else
#define MAX_IOCTL_REPLY 256
#endif

#ifdef VINUMDEBUG
struct debuginfo {
        int changeit;
        int param;
};

#endif

enum objecttype {
        drive_object,
        sd_object,
        plex_object,
        volume_object,
        invalid_object
};

/*
 * The state to set with VINUM_SETSTATE.  Since each object has a
 * different set of states, we need to translate later.
 */
enum objectstate {
        object_down,
        object_initializing,
        object_initialized,
        object_up
};

/*
 * This structure is used for modifying objects
 * (VINUM_SETSTATE, VINUM_REMOVE, VINUM_RESETSTATS, VINUM_ATTACH,
 * VINUM_DETACH, VINUM_REPLACE
 */
struct vinum_ioctl_msg {
        int index;
        enum objecttype type;
        enum objectstate state; /* state to set (VINUM_SETSTATE) */
        enum parityop op;       /* for parity ops */
        int force;              /* do it even if it doesn't make sense */
        int recurse;            /* recurse (VINUM_REMOVE) */
        int verify;             /* verify (initsd, rebuildparity) */
        int otherobject;        /* superordinate object (attach),
                                 * replacement object (replace)   */
        int rename;             /* rename object (attach) */
        int64_t offset;         /* offset of subdisk (for attach) */
        int blocksize;          /* size of block to revive (bytes) */
};

/*
 * VINUM_CREATE returns a buffer of this kind
 */
struct _ioctl_reply {
        int error;
        char msg[MAX_IOCTL_REPLY];
};

struct vinum_rename_msg {
    int index;
    int recurse;                /* rename subordinate objects too */
    enum objecttype type;
    char newname[MAXNAME];      /* new name to give to object */
};

/*
 * Ioctl requests.
 * Size of buffer, including continuations
 */
#define BUFSIZE         1024

/* configure vinum */
#define VINUM_CREATE            _IOC(IOC_IN | IOC_OUT, L, 64, BUFSIZE)

/* get global config */
#define VINUM_GETCONFIG         _IOR(L, 65, struct _vinum_conf)

/* get drive config */
#define VINUM_DRIVECONFIG       _IOWR(L, 66, struct drive)

/* get subdisk config */
#define VINUM_SDCONFIG          _IOWR(L, 67, struct sd)

/* get plex config */
#define VINUM_PLEXCONFIG        _IOWR(L, 68, struct plex)

/* get volume config */
#define VINUM_VOLCONFIG         _IOWR(L, 69, struct volume)

/* get sd config for plex (plex, sdno) */
#define VINUM_PLEXSDCONFIG      _IOWR(L, 70, struct sd)

/* get freelist element (drive, fe) */
#define VINUM_GETFREELIST       _IOWR(L, 71, struct drive_freelist)

/* write config to disk */
#define VINUM_SAVECONFIG        _IOW(L, 72, int)

/* trash config on disk */
#define VINUM_RESETCONFIG       _IOC(0, L, 73, 0)

/* read config from disk */
#define VINUM_INIT              _IOC(0, L, 74, 0)

#ifdef VINUMDEBUG

/* call the debugger from ioctl () */
#define VINUM_DEBUG             _IOWR(L, 75, struct debuginfo)

#endif

/*
 * Start an object.  Pass two integers:
 * msg [0] index in vinum_conf.<object>
 * msg [1] type of object (see below)
 *
 * Return ioctl_reply
 */
/* start an object */
#define VINUM_SETSTATE          _IOC(IOC_IN | IOC_OUT, L, 76, MAX_IOCTL_REPLY)

/* release locks and write config to disk */
#define VINUM_RELEASECONFIG     _IOC(0, L, 77, 0)

/* start a configuration operation */
#define VINUM_STARTCONFIG       _IOW(L, 78, int)

/* get memory usage summary */
#define VINUM_MEMINFO           _IOR(L, 79, struct meminfo)

/* get specific malloc information [i] */
#define VINUM_MALLOCINFO        _IOWR(L, 80, struct mc)

/* label a volume */
#define VINUM_LABEL             _IOC(IOC_IN | IOC_OUT, L, 81, MAX_IOCTL_REPLY)

/* initialize a subdisk */
#define VINUM_INITSD            _IOW(L, 82, int)

/* remove an object */
#define VINUM_REMOVE            _IOWR(L, 83, struct _ioctl_reply)

/* set read policy */
#define VINUM_READPOL           _IOWR(L, 84, struct _ioctl_reply)

/* diddle object state */
#define VINUM_SETSTATE_FORCE    _IOC(IOC_IN | IOC_OUT, L, 85, MAX_IOCTL_REPLY)

/* reset object stats */
#define VINUM_RESETSTATS        _IOWR(L, 86, struct _ioctl_reply)

/* attach an object */
#define VINUM_ATTACH            _IOWR(L, 87, struct _ioctl_reply)

/* remove an object */
#define VINUM_DETACH            _IOWR(L, 88, struct _ioctl_reply)

/* rename an object */
#define VINUM_RENAME            _IOWR(L, 89, struct _ioctl_reply)

/* replace an object */
#define VINUM_REPLACE           _IOWR(L, 90, struct _ioctl_reply)

#ifdef VINUMDEBUG

/* get request info [i] from trace buffer */
#define VINUM_RQINFO            _IOWR(L, 91, struct rqinfo)

#endif

/* perform the kernel part of Vinum daemon */
#define VINUM_DAEMON            _IOC(0, L, 92, 0)

/* check for presence of Vinum daemon */
#define VINUM_FINDDAEMON        _IOC(0, L, 93, 0)

/* set daemon flags */
#define VINUM_SETDAEMON         _IOW(L, 94, int)

/* get daemon flags */
#define VINUM_GETDAEMON         _IOR(L, 95, int)

/* check/rebuild RAID-4/5 parity */
#define VINUM_PARITYOP          _IOWR(L, 96, struct _ioctl_reply)

/* move an object */
#define VINUM_MOVE              _IOWR(L, 98, struct _ioctl_reply)