1 /*- 2 * Copyright (c) 1997, 1998 3 * Nan Yang Computer Services Limited. All rights reserved. 4 * 5 * This software is distributed under the so-called ``Berkeley 6 * License'': 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. All advertising materials mentioning features or use of this software 17 * must display the following acknowledgement: 18 * This product includes software developed by Nan Yang Computer 19 * Services Limited. 20 * 4. Neither the name of the Company nor the names of its contributors 21 * may be used to endorse or promote products derived from this software 22 * without specific prior written permission. 23 * 24 * This software is provided ``as is'', and any express or implied 25 * warranties, including, but not limited to, the implied warranties of 26 * merchantability and fitness for a particular purpose are disclaimed. 27 * In no event shall the company or contributors be liable for any 28 * direct, indirect, incidental, special, exemplary, or consequential 29 * damages (including, but not limited to, procurement of substitute 30 * goods or services; loss of use, data, or profits; or business 31 * interruption) however caused and on any theory of liability, whether 32 * in contract, strict liability, or tort (including negligence or 33 * otherwise) arising in any way out of the use of this software, even if 34 * advised of the possibility of such damage. 35 * 36 * $Id: vinumio.h,v 1.19 2000/04/26 04:17:33 grog Exp grog $ 37 * $FreeBSD: src/sys/dev/vinum/vinumio.h,v 1.18.2.1 2000/05/11 08:49:22 grog Exp $ 38 * $DragonFly: src/sys/dev/raid/vinum/vinumio.h,v 1.2 2003/06/17 04:28:33 dillon Exp $ 39 */ 40 41 #include <sys/ioccom.h> 42 43 #define L 'F' /* ID letter of our ioctls */ 44 45 #ifdef VINUMDEBUG 46 #define MAX_IOCTL_REPLY 1024 47 #else 48 #define MAX_IOCTL_REPLY 256 49 #endif 50 51 #ifdef VINUMDEBUG 52 struct debuginfo { 53 int changeit; 54 int param; 55 }; 56 57 #endif 58 59 enum objecttype { 60 drive_object, 61 sd_object, 62 plex_object, 63 volume_object, 64 invalid_object 65 }; 66 67 /* 68 * The state to set with VINUM_SETSTATE. Since each object has a 69 * different set of states, we need to translate later. 70 */ 71 enum objectstate { 72 object_down, 73 object_initializing, 74 object_initialized, 75 object_up 76 }; 77 78 /* 79 * This structure is used for modifying objects 80 * (VINUM_SETSTATE, VINUM_REMOVE, VINUM_RESETSTATS, VINUM_ATTACH, 81 * VINUM_DETACH, VINUM_REPLACE 82 */ 83 struct vinum_ioctl_msg { 84 int index; 85 enum objecttype type; 86 enum objectstate state; /* state to set (VINUM_SETSTATE) */ 87 enum parityop op; /* for parity ops */ 88 int force; /* do it even if it doesn't make sense */ 89 int recurse; /* recurse (VINUM_REMOVE) */ 90 int verify; /* verify (initsd, rebuildparity) */ 91 int otherobject; /* superordinate object (attach), 92 * replacement object (replace) */ 93 int rename; /* rename object (attach) */ 94 int64_t offset; /* offset of subdisk (for attach) */ 95 int blocksize; /* size of block to revive (bytes) */ 96 }; 97 98 /* VINUM_CREATE returns a buffer of this kind */ 99 struct _ioctl_reply { 100 int error; 101 char msg[MAX_IOCTL_REPLY]; 102 }; 103 104 struct vinum_rename_msg { 105 int index; 106 int recurse; /* rename subordinate objects too */ 107 enum objecttype type; 108 char newname[MAXNAME]; /* new name to give to object */ 109 }; 110 111 /* ioctl requests */ 112 #define BUFSIZE 1024 /* size of buffer, including continuations */ 113 #define VINUM_CREATE _IOC(IOC_IN | IOC_OUT, L, 64, BUFSIZE) /* configure vinum */ 114 #define VINUM_GETCONFIG _IOR(L, 65, struct _vinum_conf) /* get global config */ 115 #define VINUM_DRIVECONFIG _IOWR(L, 66, struct drive) /* get drive config */ 116 #define VINUM_SDCONFIG _IOWR(L, 67, struct sd) /* get subdisk config */ 117 #define VINUM_PLEXCONFIG _IOWR(L, 68, struct plex) /* get plex config */ 118 #define VINUM_VOLCONFIG _IOWR(L, 69, struct volume) /* get volume config */ 119 #define VINUM_PLEXSDCONFIG _IOWR(L, 70, struct sd) /* get sd config for plex (plex, sdno) */ 120 #define VINUM_GETFREELIST _IOWR(L, 71, struct drive_freelist) /* get freelist element (drive, fe) */ 121 #define VINUM_SAVECONFIG _IOW(L, 72, int) /* write config to disk */ 122 #define VINUM_RESETCONFIG _IOC(0, L, 73, 0) /* trash config on disk */ 123 #define VINUM_INIT _IOC(0, L, 74, 0) /* read config from disk */ 124 #ifdef VINUMDEBUG 125 #define VINUM_DEBUG _IOWR(L, 75, struct debuginfo) /* call the debugger from ioctl () */ 126 #endif 127 128 /* 129 * Start an object. Pass two integers: 130 * msg [0] index in vinum_conf.<object> 131 * msg [1] type of object (see below) 132 * 133 * Return ioctl_reply 134 */ 135 #define VINUM_SETSTATE _IOC(IOC_IN | IOC_OUT, L, 76, MAX_IOCTL_REPLY) /* start an object */ 136 #define VINUM_RELEASECONFIG _IOC(0, L, 77, 0) /* release locks and write config to disk */ 137 #define VINUM_STARTCONFIG _IOW(L, 78, int) /* start a configuration operation */ 138 #define VINUM_MEMINFO _IOR(L, 79, struct meminfo) /* get memory usage summary */ 139 #define VINUM_MALLOCINFO _IOWR(L, 80, struct mc) /* get specific malloc information [i] */ 140 #define VINUM_LABEL _IOC(IOC_IN | IOC_OUT, L, 81, MAX_IOCTL_REPLY) /* label a volume */ 141 #define VINUM_INITSD _IOW(L, 82, int) /* initialize a subdisk */ 142 #define VINUM_REMOVE _IOWR(L, 83, struct _ioctl_reply) /* remove an object */ 143 #define VINUM_READPOL _IOWR(L, 84, struct _ioctl_reply) /* set read policy */ 144 #define VINUM_SETSTATE_FORCE _IOC(IOC_IN | IOC_OUT, L, 85, MAX_IOCTL_REPLY) /* diddle object state */ 145 #define VINUM_RESETSTATS _IOWR(L, 86, struct _ioctl_reply) /* reset object stats */ 146 #define VINUM_ATTACH _IOWR(L, 87, struct _ioctl_reply) /* attach an object */ 147 #define VINUM_DETACH _IOWR(L, 88, struct _ioctl_reply) /* remove an object */ 148 149 #define VINUM_RENAME _IOWR(L, 89, struct _ioctl_reply) /* rename an object */ 150 #define VINUM_REPLACE _IOWR(L, 90, struct _ioctl_reply) /* replace an object */ 151 152 #ifdef VINUMDEBUG 153 #define VINUM_RQINFO _IOWR(L, 91, struct rqinfo) /* get request info [i] from trace buffer */ 154 #endif 155 156 #define VINUM_DAEMON _IOC(0, L, 92, 0) /* perform the kernel part of Vinum daemon */ 157 #define VINUM_FINDDAEMON _IOC(0, L, 93, 0) /* check for presence of Vinum daemon */ 158 #define VINUM_SETDAEMON _IOW(L, 94, int) /* set daemon flags */ 159 #define VINUM_GETDAEMON _IOR(L, 95, int) /* get daemon flags */ 160 #define VINUM_PARITYOP _IOWR(L, 96, struct _ioctl_reply) /* check/rebuild RAID-4/5 parity */ 161 #define VINUM_MOVE _IOWR(L, 98, struct _ioctl_reply) /* move an object */ 162