mdadm-1.6.0
[thirdparty/mdadm.git] / mdadm.h
1 /*
2  * mdadm - manage Linux "md" devices aka RAID arrays.
3  *
4  * Copyright (C) 2001-2002 Neil Brown <neilb@cse.unsw.edu.au>
5  *
6  *
7  *    This program is free software; you can redistribute it and/or modify
8  *    it under the terms of the GNU General Public License as published by
9  *    the Free Software Foundation; either version 2 of the License, or
10  *    (at your option) any later version.
11  *
12  *    This program is distributed in the hope that it will be useful,
13  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  *    GNU General Public License for more details.
16  *
17  *    You should have received a copy of the GNU General Public License
18  *    along with this program; if not, write to the Free Software
19  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  *
21  *    Author: Neil Brown
22  *    Email: <neilb@cse.unsw.edu.au>
23  *    Paper: Neil Brown
24  *           School of Computer Science and Engineering
25  *           The University of New South Wales
26  *           Sydney, 2052
27  *           Australia
28  */
29
30 #define __USE_LARGEFILE64
31 #include        <unistd.h>
32 #ifndef __dietlibc__
33 extern __off64_t lseek64 __P ((int __fd, __off64_t __offset, int __whence));
34 #endif
35
36 #include        <sys/types.h>
37 #include        <sys/stat.h>
38 #include        <stdlib.h>
39 #include        <time.h>
40 #include        <getopt.h>
41 #include        <fcntl.h>
42 #include        <stdio.h>
43 #include        <errno.h>
44 #include        <string.h>
45 #ifdef __dietlibc__NONO
46 int strncmp(const char *s1, const char *s2, size_t n) __THROW __pure__;
47 char *strncpy(char *dest, const char *src, size_t n) __THROW;
48 #include    <strings.h>
49 #endif
50
51
52 #include        <linux/kdev_t.h>
53 /*#include      <linux/fs.h> */
54 #include        <sys/mount.h>
55 #include        <asm/types.h>
56 #include        <sys/ioctl.h>
57 #define MD_MAJOR 9
58 #define MdpMinorShift 6
59
60 #ifndef BLKGETSIZE64
61 #define BLKGETSIZE64 _IOR(0x12,114,size_t) /* return device size in bytes (u64 *arg) */
62 #endif
63
64
65 #include        "md_u.h"
66 #include        "md_p.h"
67
68 #define Name "mdadm"
69
70 enum mode {
71         ASSEMBLE=1,
72         BUILD,
73         CREATE,
74         MANAGE,
75         MISC,
76         MONITOR,
77         GROW,
78 };
79
80 extern char short_options[];
81 extern struct option long_options[];
82 extern char Version[], Usage[], Help[], OptionHelp[],
83         Help_create[], Help_build[], Help_assemble[], Help_grow[],
84         Help_manage[], Help_misc[], Help_monitor[], Help_config[];
85
86 /* structures read from config file */
87 /* List of mddevice names and identifiers
88  * Identifiers can be:
89  *    uuid=128-hex-uuid
90  *    super-minor=decimal-minor-number-from-superblock
91  *    devices=comma,separated,list,of,device,names,with,wildcards
92  *
93  * If multiple fields are present, the intersection of all matching
94  * devices is considered
95  */
96 #define UnSet (0xfffe)
97 typedef struct mddev_ident_s {
98         char    *devname;
99         
100         int     uuid_set;
101         __u32   uuid[4];
102
103         unsigned int super_minor;
104
105         char    *devices;       /* comma separated list of device
106                                  * names with wild cards
107                                  */
108         int     level;
109         unsigned int raid_disks;
110         unsigned int spare_disks;
111         int     autof;          /* 1 for normal, 2 for partitioned */
112         char    *spare_group;
113
114         struct mddev_ident_s *next;
115 } *mddev_ident_t;
116
117 /* List of device names - wildcards expanded */
118 typedef struct mddev_dev_s {
119         char *devname;
120         char disposition;       /* 'a' for add, 'r' for remove, 'f' for fail.
121                                  * Not set for names read from .config
122                                  */
123         struct mddev_dev_s *next;
124 } *mddev_dev_t;
125
126 typedef struct mapping {
127         char *name;
128         int num;
129 } mapping_t;
130
131
132 struct mdstat_ent {
133         char            *dev;
134         int             devnum;
135         int             active;
136         char            *level;
137         char            *pattern; /* U or up, _ for down */
138         int             percent; /* -1 if no resync */
139         struct mdstat_ent *next;
140 };
141
142 extern struct mdstat_ent *mdstat_read(int);
143 extern void free_mdstat(struct mdstat_ent *ms);
144 extern void mdstat_wait(int seconds);
145
146 #ifndef Sendmail
147 #define Sendmail "/usr/lib/sendmail -t"
148 #endif
149
150 extern char *map_num(mapping_t *map, int num);
151 extern int map_name(mapping_t *map, char *name);
152 extern mapping_t r5layout[], pers[], modes[];
153
154 extern char *map_dev(int major, int minor);
155
156
157 extern int Manage_ro(char *devname, int fd, int readonly);
158 extern int Manage_runstop(char *devname, int fd, int runstop);
159 extern int Manage_resize(char *devname, int fd, long long size, int raid_disks);
160 extern int Manage_subdevs(char *devname, int fd,
161                           mddev_dev_t devlist);
162
163
164 extern int Assemble(char *mddev, int mdfd,
165                     mddev_ident_t ident,
166                     char *conffile,
167                     mddev_dev_t devlist,
168                     int readonly, int runstop,
169                     char *update,
170                     int verbose, int force);
171
172 extern int Build(char *mddev, int mdfd, int chunk, int level,
173                  int raiddisks,
174                  mddev_dev_t devlist, int assume_clean);
175
176
177 extern int Create(char *mddev, int mdfd,
178                   int chunk, int level, int layout, unsigned long size, int raiddisks, int sparedisks,
179                   int subdevs, mddev_dev_t devlist,
180                   int runstop, int verbose, int force);
181
182 extern int Detail(char *dev, int brief, int test);
183 extern int Query(char *dev);
184 extern int Examine(mddev_dev_t devlist, int brief, int scan, int SparcAdjust);
185 extern int Monitor(mddev_dev_t devlist,
186                    char *mailaddr, char *alert_cmd,
187                    int period, int daemonise, int scan, int oneshot,
188                    char *config, int test);
189
190 extern int Kill(char *dev, int force);
191
192 extern int md_get_version(int fd);
193 extern int get_linux_version(void);
194 extern int parse_uuid(char *str, int uuid[4]);
195 extern int check_ext2(int fd, char *name);
196 extern int check_reiser(int fd, char *name);
197 extern int check_raid(int fd, char *name);
198
199 extern int get_mdp_major(void);
200 extern int is_standard(char *dev);
201
202
203 extern mddev_ident_t conf_get_ident(char *conffile, char *dev);
204 extern mddev_dev_t conf_get_devs(char *conffile);
205 extern char *conf_get_mailaddr(char *conffile);
206 extern char *conf_get_program(char *conffile);
207 extern char *conf_line(FILE *file);
208 extern char *conf_word(FILE *file, int allow_key);
209 extern void free_line(char *line);
210 extern int match_oneof(char *devices, char *devname);
211 extern int load_super(int fd, mdp_super_t *super);
212 extern void uuid_from_super(int uuid[4], mdp_super_t *super);
213 extern int same_uuid(int a[4], int b[4]);
214 extern int compare_super(mdp_super_t *first, mdp_super_t *second);
215 extern unsigned long calc_sb_csum(mdp_super_t *super);
216 extern int store_super(int fd, mdp_super_t *super);
217 extern int enough(int level, int raid_disks, int avail_disks);
218 extern int ask(char *mesg);
219
220
221 extern char *human_size(long long bytes);
222 char *human_size_brief(long long bytes);
223
224 extern void put_md_name(char *name);
225 extern char *get_md_name(int dev);
226
227 extern char DefaultConfFile[];