]> git.ipfire.org Git - thirdparty/mdadm.git/blame - mdadm.h
Grow: set new_data_offset if appropriate
[thirdparty/mdadm.git] / mdadm.h
CommitLineData
64c4757e 1/*
9a9dab36 2 * mdadm - manage Linux "md" devices aka RAID arrays.
64c4757e 3 *
e736b623 4 * Copyright (C) 2001-2009 Neil Brown <neilb@suse.de>
64c4757e
NB
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
e736b623 22 * Email: <neilb@suse.de>
64c4757e
NB
23 */
24
4ccdb956 25#define _GNU_SOURCE
c2c9bb6f 26#define _FILE_OFFSET_BITS 64
64c4757e 27#include <unistd.h>
e39b673e 28#if !defined(__dietlibc__) && !defined(__KLIBC__)
64c4757e 29extern __off64_t lseek64 __P ((int __fd, __off64_t __offset, int __whence));
f783ca4f 30#else
fffdbe5e 31# if defined(__NO_STAT64) || __WORDSIZE != 32
f783ca4f
NB
32# define lseek64 lseek
33# endif
98c6faba 34#endif
64c4757e
NB
35
36#include <sys/types.h>
37#include <sys/stat.h>
38#include <stdlib.h>
39#include <time.h>
11018a45 40#include <sys/time.h>
64c4757e
NB
41#include <getopt.h>
42#include <fcntl.h>
43#include <stdio.h>
44#include <errno.h>
45#include <string.h>
773135f5 46#include <syslog.h>
b56c3630
NB
47#ifdef __dietlibc__
48#include <strings.h>
280a927d
NB
49/* dietlibc has deprecated random and srandom!! */
50#define random rand
51#define srandom srand
98c6faba
NB
52#endif
53
64c4757e
NB
54
55#include <linux/kdev_t.h>
e0d19036
NB
56/*#include <linux/fs.h> */
57#include <sys/mount.h>
58#include <asm/types.h>
64c4757e
NB
59#include <sys/ioctl.h>
60#define MD_MAJOR 9
dd0781e5 61#define MdpMinorShift 6
64c4757e 62
e0d19036 63#ifndef BLKGETSIZE64
98c6faba 64#define BLKGETSIZE64 _IOR(0x12,114,size_t) /* return device size in bytes (u64 *arg) */
e0d19036 65#endif
56eb10c0 66
c21e737b 67#define DEFAULT_CHUNK 512
c82f047c
NB
68#define DEFAULT_BITMAP_CHUNK 4096
69#define DEFAULT_BITMAP_DELAY 5
dfd4d8ee 70#define DEFAULT_MAX_WRITE_BEHIND 256
64c4757e 71
753cf905 72/* MAP_DIR should be somewhere that persists across the pivotroot
5d4d1b26 73 * from early boot to late boot.
96fd06ed 74 * /run seems to have emerged as the best standard.
5d4d1b26 75 */
753cf905 76#ifndef MAP_DIR
96fd06ed 77#define MAP_DIR "/run/mdadm"
753cf905
DL
78#endif /* MAP_DIR */
79/* MAP_FILE is what we name the map file we put in MAP_DIR, in case you
80 * want something other than the default of "map"
81 */
82#ifndef MAP_FILE
83#define MAP_FILE "map"
84#endif /* MAP_FILE */
85/* MDMON_DIR is where pid and socket files used for communicating
96fd06ed 86 * with mdmon normally live. Best is /var/run/mdadm as
753cf905
DL
87 * mdmon is needed at early boot then it needs to write there prior
88 * to /var/run being mounted read/write, and it also then needs to
89 * persist beyond when /var/run is mounter read-only. So, to be
90 * safe, the default is somewhere that is read/write early in the
91 * boot process and stays up as long as possible during shutdown.
92 */
93#ifndef MDMON_DIR
96fd06ed 94#define MDMON_DIR "/run/mdadm"
753cf905 95#endif /* MDMON_DIR */
5d4d1b26 96
403410eb
PC
97/* FAILED_SLOTS is where to save files storing recent removal of array
98 * member in order to allow future reuse of disk inserted in the same
99 * slot for array recovery
100 */
101#ifndef FAILED_SLOTS_DIR
96fd06ed 102#define FAILED_SLOTS_DIR "/run/mdadm/failed-slots"
403410eb
PC
103#endif /* FAILED_SLOTS */
104
64c4757e 105#include "md_u.h"
e0d19036 106#include "md_p.h"
c82f047c 107#include "bitmap.h"
f7dd881f 108#include "msg.h"
64c4757e 109
1e0d770c 110#include <endian.h>
efd441d1
NB
111/* Redhat don't like to #include <asm/byteorder.h>, and
112 * some time include <linux/byteorder/xxx_endian.h> isn't enough,
113 * and there is no standard conversion function so... */
0ae03b8a
NB
114/* And dietlibc doesn't think byteswap is ok, so.. */
115/* #include <byteswap.h> */
116#define bswap_16(x) (((x) & 0x00ffU) << 8 | \
117 ((x) & 0xff00U) >> 8)
118#define bswap_32(x) (((x) & 0x000000ffU) << 24 | \
119 ((x) & 0xff000000U) >> 24 | \
120 ((x) & 0x0000ff00U) << 8 | \
121 ((x) & 0x00ff0000U) >> 8)
122#define bswap_64(x) (((x) & 0x00000000000000ffULL) << 56 | \
123 ((x) & 0xff00000000000000ULL) >> 56 | \
124 ((x) & 0x000000000000ff00ULL) << 40 | \
125 ((x) & 0x00ff000000000000ULL) >> 40 | \
126 ((x) & 0x0000000000ff0000ULL) << 24 | \
127 ((x) & 0x0000ff0000000000ULL) >> 24 | \
128 ((x) & 0x00000000ff000000ULL) << 8 | \
129 ((x) & 0x000000ff00000000ULL) >> 8)
130
e39b673e 131#if !defined(__KLIBC__)
efd441d1
NB
132#if BYTE_ORDER == LITTLE_ENDIAN
133#define __cpu_to_le16(_x) (_x)
134#define __cpu_to_le32(_x) (_x)
135#define __cpu_to_le64(_x) (_x)
136#define __le16_to_cpu(_x) (_x)
137#define __le32_to_cpu(_x) (_x)
138#define __le64_to_cpu(_x) (_x)
974e620d
NB
139
140#define __cpu_to_be16(_x) bswap_16(_x)
141#define __cpu_to_be32(_x) bswap_32(_x)
142#define __cpu_to_be64(_x) bswap_64(_x)
143#define __be16_to_cpu(_x) bswap_16(_x)
144#define __be32_to_cpu(_x) bswap_32(_x)
145#define __be64_to_cpu(_x) bswap_64(_x)
efd441d1
NB
146#elif BYTE_ORDER == BIG_ENDIAN
147#define __cpu_to_le16(_x) bswap_16(_x)
148#define __cpu_to_le32(_x) bswap_32(_x)
149#define __cpu_to_le64(_x) bswap_64(_x)
150#define __le16_to_cpu(_x) bswap_16(_x)
151#define __le32_to_cpu(_x) bswap_32(_x)
152#define __le64_to_cpu(_x) bswap_64(_x)
974e620d
NB
153
154#define __cpu_to_be16(_x) (_x)
155#define __cpu_to_be32(_x) (_x)
156#define __cpu_to_be64(_x) (_x)
157#define __be16_to_cpu(_x) (_x)
158#define __be32_to_cpu(_x) (_x)
159#define __be64_to_cpu(_x) (_x)
1e0d770c
NB
160#else
161# error "unknown endianness."
162#endif
e39b673e 163#endif /* __KLIBC__ */
1e0d770c
NB
164
165
1e5c6983
DW
166/*
167 * min()/max()/clamp() macros that also do
168 * strict type-checking.. See the
169 * "unnecessary" pointer comparison.
170 */
171#define min(x, y) ({ \
172 typeof(x) _min1 = (x); \
173 typeof(y) _min2 = (y); \
174 (void) (&_min1 == &_min2); \
175 _min1 < _min2 ? _min1 : _min2; })
176
177#define max(x, y) ({ \
178 typeof(x) _max1 = (x); \
179 typeof(y) _max2 = (y); \
180 (void) (&_max1 == &_max2); \
181 _max1 > _max2 ? _max1 : _max2; })
1e0d770c 182
4b1ac34b
NB
183/* general information that might be extracted from a superblock */
184struct mdinfo {
185 mdu_array_info_t array;
186 mdu_disk_info_t disk;
187 __u64 events;
fbf8a0b7 188 int uuid[4];
31317663 189 char name[33];
353632d9 190 unsigned long long data_offset;
3c0cb0d2 191 unsigned long long new_data_offset;
598f0d58
NB
192 unsigned long long component_size; /* same as array.size, except in
193 * sectors and up to 64bits.
194 */
da9b4a62
DW
195 unsigned long long custom_array_size; /* size for non-default sized
196 * arrays (in sectors)
197 */
81219e70
LM
198#define NO_RESHAPE 0
199#define VOLUME_RESHAPE 1
200#define CONTAINER_RESHAPE 2
353632d9
NB
201 int reshape_active;
202 unsigned long long reshape_progress;
6e75048b
AK
203 int recovery_blocked; /* for external metadata it
204 * indicates that there is
205 * reshape in progress in
206 * container,
207 * for native metadata it is
208 * reshape_active field mirror
209 */
2c01e1d8
N
210 /* During reshape we can sometimes change the data_offset to avoid
211 * over-writing still-valid data. We need to know if there is space.
212 * So getinfo_super will fill in space_before and space_after in sectors.
213 * data_offset can be increased or decreased by this amount.
214 */
215 unsigned long long space_before, space_after;
e1516be1
DW
216 union {
217 unsigned long long resync_start; /* per-array resync position */
218 unsigned long long recovery_start; /* per-device rebuild position */
b7528a20 219 #define MaxSector (~0ULL) /* resync/recovery complete position */
e1516be1 220 };
fbdef498 221 long bitmap_offset; /* 0 == none, 1 == a file */
a67dd8cc 222 unsigned long safe_mode_delay; /* ms delay to mark clean */
353632d9 223 int new_level, delta_disks, new_layout, new_chunk;
06c7f68e 224 int errors;
f21e18ca 225 unsigned long cache_size; /* size of raid456 stripe cache*/
7e0f6979
NB
226 int mismatch_cnt;
227 char text_version[50];
dd15dc4a
NB
228
229 int container_member; /* for assembling external-metatdata arrays
230 * This is to be used internally by metadata
231 * handler only */
97b4d0e9
DW
232 int container_enough; /* flag external handlers can set to
233 * indicate that subarrays have not enough (-1),
234 * enough to start (0), or all expected disks (1) */
06c7f68e 235 char sys_name[20];
7e0f6979 236 struct mdinfo *devs;
06c7f68e 237 struct mdinfo *next;
549e9569
NB
238
239 /* Device info for mdmon: */
e1516be1 240 int recovery_fd;
549e9569 241 int state_fd;
8d45d196
DW
242 #define DS_FAULTY 1
243 #define DS_INSYNC 2
244 #define DS_WRITE_MOSTLY 4
245 #define DS_SPARE 8
246 #define DS_BLOCKED 16
247 #define DS_REMOVE 1024
92967543 248 #define DS_UNBLOCK 2048
549e9569
NB
249 int prev_state, curr_state, next_state;
250
4b1ac34b
NB
251};
252
5bbb4842
NB
253struct createinfo {
254 int uid;
255 int gid;
256 int autof;
257 int mode;
38098016 258 int symlinks;
058574b1 259 struct supertype *supertype;
5bbb4842
NB
260};
261
9a9dab36 262#define Name "mdadm"
682c7051 263
e0d19036
NB
264enum mode {
265 ASSEMBLE=1,
266 BUILD,
267 CREATE,
268 MANAGE,
269 MISC,
270 MONITOR,
dd0781e5 271 GROW,
8382f19b 272 INCREMENTAL,
1f48664b 273 AUTODETECT,
e0d19036
NB
274};
275
64c4757e 276extern char short_options[];
024768c4 277extern char short_bitmap_options[];
c06487ce 278extern char short_bitmap_auto_options[];
64c4757e 279extern struct option long_options[];
56eedc1a 280extern char Version[], Usage[], Help[], OptionHelp[],
dd0781e5 281 Help_create[], Help_build[], Help_assemble[], Help_grow[],
8382f19b 282 Help_incr[],
e0d19036 283 Help_manage[], Help_misc[], Help_monitor[], Help_config[];
64c4757e 284
997aed5d 285/* for option that don't have short equivilents, we assign arbitrary
1c7a808c 286 * numbers later than any 'short' character option.
997aed5d
NB
287 */
288enum special_options {
1c7a808c 289 AssumeClean = 300,
997aed5d
NB
290 BitmapChunk,
291 WriteBehind,
292 ReAdd,
293 NoDegraded,
294 Sparc22,
1c7a808c 295 BackupFile,
997aed5d 296 HomeHost,
589395d6 297 AutoHomeHost,
38098016 298 Symlinks,
1f48664b 299 AutoDetect,
1770662b 300 Waitclean,
4cce4069 301 DetailPlatform,
33414a01 302 KillSubarray,
1c7a808c 303 UpdateSubarray,
edde9560 304 IncrementalPath,
1c7a808c
N
305 NoSharing,
306 HelpOptions,
307 Brief,
308 ManageOpt,
309 Add,
310 Remove,
311 Fail,
312 MiscOpt,
313 WaitOpt,
314 ConfigFile,
315 ChunkSize,
316 WriteMostly,
317 Layout,
318 Auto,
319 Force,
320 SuperMinor,
321 EMail,
322 ProgramOpt,
323 Increment,
324 Fork,
325 Bitmap,
326 RebuildMapOpt,
87f26d14 327 InvalidBackup,
20b60dcd 328 UdevRules,
b76b30e0 329 FreezeReshape,
2dddadb0 330 Continue,
08ca2adf 331 OffRootOpt,
c2ecf5f6 332 Prefer,
79b1d381 333 DataOffset,
997aed5d
NB
334};
335
64c4757e 336/* structures read from config file */
52826846
NB
337/* List of mddevice names and identifiers
338 * Identifiers can be:
339 * uuid=128-hex-uuid
340 * super-minor=decimal-minor-number-from-superblock
341 * devices=comma,separated,list,of,device,names,with,wildcards
342 *
343 * If multiple fields are present, the intersection of all matching
344 * devices is considered
345 */
98c6faba 346#define UnSet (0xfffe)
fa56eddb 347struct mddev_ident {
dd0781e5 348 char *devname;
aba69144 349
dd0781e5 350 int uuid_set;
3fa06e9d 351 int uuid[4];
947fd4dd 352 char name[33];
52826846 353
f21e18ca 354 int super_minor;
52826846 355
dd0781e5 356 char *devices; /* comma separated list of device
52826846
NB
357 * names with wild cards
358 */
dd0781e5 359 int level;
f21e18ca
N
360 int raid_disks;
361 int spare_disks;
82d9eba6 362 struct supertype *st;
dd0781e5
NB
363 int autof; /* 1 for normal, 2 for partitioned */
364 char *spare_group;
7ef02d01 365 char *bitmap_file;
c82f047c 366 int bitmap_fd;
dd0781e5 367
1771a6e2
N
368 char *container; /* /dev/whatever name of container, or
369 * uuid of container. You would expect
370 * this to be the 'devname' or UUID
dbb44303
N
371 * of some other entry.
372 */
373 char *member; /* subarray within a container */
374
fa56eddb 375 struct mddev_ident *next;
b179246f
N
376 union {
377 /* fields needed by different users of this structure */
378 int assembled; /* set when assembly succeeds */
379 };
fa56eddb 380};
64c4757e
NB
381
382/* List of device names - wildcards expanded */
a655e550 383struct mddev_dev {
64c4757e 384 char *devname;
1c7a808c 385 int disposition; /* 'a' for add, 'r' for remove, 'f' for fail.
cd29a5c8
NB
386 * Not set for names read from .config
387 */
b3d31955 388 char writemostly; /* 1 for 'set writemostly', 2 for 'clear writemostly' */
fe80f49b 389 char re_add;
811e6cbe 390 char used; /* set when used */
a655e550
N
391 struct mddev_dev *next;
392};
64c4757e 393
682c7051
NB
394typedef struct mapping {
395 char *name;
396 int num;
397} mapping_t;
398
e0d19036
NB
399
400struct mdstat_ent {
401 char *dev;
402 int devnum;
403 int active;
404 char *level;
405 char *pattern; /* U or up, _ for down */
406 int percent; /* -1 if no resync */
f94c116f 407 int resync; /* 3 if check, 2 if reshape, 1 if resync, 0 if recovery */
549e9569
NB
408 int devcnt;
409 int raid_disks;
549e9569 410 char * metadata_version;
3b57c466
N
411 struct dev_member {
412 char *name;
413 struct dev_member *next;
414 } *members;
e0d19036
NB
415 struct mdstat_ent *next;
416};
417
22a88995 418extern struct mdstat_ent *mdstat_read(int hold, int start);
e0d19036 419extern void free_mdstat(struct mdstat_ent *ms);
dd0781e5 420extern void mdstat_wait(int seconds);
58a4ba2a 421extern void mdstat_wait_fd(int fd, const sigset_t *sigmask);
8382f19b 422extern int mddev_busy(int devnum);
3b57c466 423extern struct mdstat_ent *mdstat_by_component(char *name);
78b10e66 424extern struct mdstat_ent *mdstat_by_subdev(char *subdev, int container);
8382f19b
NB
425
426struct map_ent {
427 struct map_ent *next;
428 int devnum;
1522c538 429 char metadata[20];
8382f19b 430 int uuid[4];
195254b8 431 int bad;
8382f19b
NB
432 char *path;
433};
1522c538 434extern int map_update(struct map_ent **mpp, int devnum, char *metadata,
8382f19b 435 int uuid[4], char *path);
4eb26970 436extern void map_remove(struct map_ent **map, int devnum);
8382f19b 437extern struct map_ent *map_by_uuid(struct map_ent **map, int uuid[4]);
f2e55ecc
N
438extern struct map_ent *map_by_devnum(struct map_ent **map, int devnum);
439extern struct map_ent *map_by_name(struct map_ent **map, char *name);
8382f19b
NB
440extern void map_read(struct map_ent **melp);
441extern int map_write(struct map_ent *mel);
442extern void map_delete(struct map_ent **mapp, int devnum);
443extern void map_free(struct map_ent *map);
444extern void map_add(struct map_ent **melp,
1522c538 445 int devnum, char *metadata, int uuid[4], char *path);
ad5bc697
N
446extern int map_lock(struct map_ent **melp);
447extern void map_unlock(struct map_ent **melp);
cc700db3 448extern void map_fork(void);
e0d19036 449
e86c9dd6 450/* various details can be requested */
dab4a513
DW
451enum sysfs_read_flags {
452 GET_LEVEL = (1 << 0),
453 GET_LAYOUT = (1 << 1),
454 GET_COMPONENT = (1 << 2),
455 GET_CHUNK = (1 << 3),
456 GET_CACHE = (1 << 4),
457 GET_MISMATCH = (1 << 5),
458 GET_VERSION = (1 << 6),
459 GET_DISKS = (1 << 7),
460 GET_DEGRADED = (1 << 8),
461 GET_SAFEMODE = (1 << 9),
c0c1acd6
N
462 GET_BITMAP_LOCATION = (1 << 10),
463
464 GET_DEVS = (1 << 20), /* gets role, major, minor */
465 GET_OFFSET = (1 << 21),
466 GET_SIZE = (1 << 22),
467 GET_STATE = (1 << 23),
468 GET_ERROR = (1 << 24),
dab4a513 469};
e86c9dd6
NB
470
471/* If fd >= 0, get the array it is open on,
472 * else use devnum. >=0 -> major9. <0.....
473 */
549e9569 474extern int sysfs_open(int devnum, char *devname, char *attr);
f35f2525 475extern void sysfs_init(struct mdinfo *mdi, int fd, int devnum);
7e0f6979
NB
476extern void sysfs_free(struct mdinfo *sra);
477extern struct mdinfo *sysfs_read(int fd, int devnum, unsigned long options);
1770662b
DW
478extern int sysfs_attr_match(const char *attr, const char *str);
479extern int sysfs_match_word(const char *word, char **list);
7e0f6979 480extern int sysfs_set_str(struct mdinfo *sra, struct mdinfo *dev,
e86c9dd6 481 char *name, char *val);
7e0f6979 482extern int sysfs_set_num(struct mdinfo *sra, struct mdinfo *dev,
e86c9dd6 483 char *name, unsigned long long val);
012a8641
JS
484extern int sysfs_set_num_signed(struct mdinfo *sra, struct mdinfo *dev,
485 char *name, long long val);
97590376 486extern int sysfs_uevent(struct mdinfo *sra, char *event);
7236ee7a
N
487extern int sysfs_get_fd(struct mdinfo *sra, struct mdinfo *dev,
488 char *name);
489extern int sysfs_fd_get_ll(int fd, unsigned long long *val);
7e0f6979 490extern int sysfs_get_ll(struct mdinfo *sra, struct mdinfo *dev,
e86c9dd6 491 char *name, unsigned long long *val);
7236ee7a 492extern int sysfs_fd_get_str(int fd, char *val, int size);
bc77ed53
DW
493extern int sysfs_attribute_available(struct mdinfo *sra, struct mdinfo *dev,
494 char *name);
93ecfa01
N
495extern int sysfs_get_str(struct mdinfo *sra, struct mdinfo *dev,
496 char *name, char *val, int size);
8ed3e5e1 497extern int sysfs_set_safemode(struct mdinfo *sra, unsigned long ms);
f35f2525 498extern int sysfs_set_array(struct mdinfo *info, int vers);
2904b26f 499extern int sysfs_add_disk(struct mdinfo *sra, struct mdinfo *sd, int resume);
f1665f72 500extern int sysfs_disk_to_scsi_id(int fd, __u32 *id);
f94d52f4 501extern int sysfs_unique_holder(int devnum, long rdev);
bc77ed53 502extern int sysfs_freeze_array(struct mdinfo *sra);
c69b251b 503extern int load_sys(char *path, char *buf);
130994cb
AK
504extern int reshape_prepare_fdlist(char *devname,
505 struct mdinfo *sra,
506 int raid_disks,
507 int nrdisks,
508 unsigned long blocks,
509 char *backup_file,
510 int *fdlist,
511 unsigned long long *offsets);
512extern void reshape_free_fdlist(int *fdlist,
513 unsigned long long *offsets,
514 int size);
e6e9d47b
AK
515extern int reshape_open_backup_file(char *backup,
516 int fd,
517 char *devname,
518 long blocks,
519 int *fdlist,
a93f87ee
N
520 unsigned long long *offsets,
521 int restart);
1c009fc2
AK
522extern unsigned long compute_backup_blocks(int nchunk, int ochunk,
523 unsigned int ndata, unsigned int odata);
e86c9dd6
NB
524
525extern int save_stripes(int *source, unsigned long long *offsets,
526 int raid_disks, int chunk_size, int level, int layout,
527 int nwrites, int *dest,
a6288483
N
528 unsigned long long start, unsigned long long length,
529 char *buf);
353632d9
NB
530extern int restore_stripes(int *dest, unsigned long long *offsets,
531 int raid_disks, int chunk_size, int level, int layout,
532 int source, unsigned long long read_offset,
2fcb75ae
AK
533 unsigned long long start, unsigned long long length,
534 char *src_buf);
e86c9dd6 535
52826846
NB
536#ifndef Sendmail
537#define Sendmail "/usr/lib/sendmail -t"
538#endif
539
773135f5
NB
540#define SYSLOG_FACILITY LOG_DAEMON
541
682c7051
NB
542extern char *map_num(mapping_t *map, int num);
543extern int map_name(mapping_t *map, char *name);
b640a252 544extern mapping_t r5layout[], r6layout[], pers[], modes[], faultylayout[];
682c7051 545
c2ecf5f6
N
546extern char *map_dev_preferred(int major, int minor, int create,
547 char *prefer);
548static inline char *map_dev(int major, int minor, int create)
549{
550 return map_dev_preferred(major, minor, create, NULL);
551}
64c4757e 552
549e9569 553struct active_array;
2e735d19 554struct metadata_update;
64c4757e 555
999b4972 556
2c01e1d8 557/* 'struct reshape' records the intermediate states of
999b4972
N
558 * a general reshape.
559 * The starting geometry is converted to the 'before' geometry
560 * by at most an atomic level change. They could be the same.
561 * Similarly the 'after' geometry is converted to the final
562 * geometry by at most a level change.
563 * Note that 'before' and 'after' must have the same level.
564 * 'blocks' is the minimum number of sectors for a reshape unit.
565 * This will be a multiple of the stripe size in each of the
566 * 'before' and 'after' geometries.
567 * If 'blocks' is 0, no restriping is necessary.
568 */
569struct reshape {
570 int level;
571 int parity; /* number of parity blocks/devices */
572 struct {
573 int layout;
574 int data_disks;
575 } before, after;
576 unsigned long long backup_blocks;
577 unsigned long long stripes; /* number of old stripes that comprise 'blocks'*/
578 unsigned long long new_size; /* New size of array in sectors */
579};
580
6adfd3af
NB
581/* A superswitch provides entry point the a metadata handler.
582 *
583 * The super_switch primarily operates on some "metadata" that
584 * is accessed via the 'supertype'.
585 * This metadata has one of three possible sources.
586 * 1/ It is read from a single device. In this case it may not completely
587 * describe the array or arrays as some information might be on other
588 * devices.
589 * 2/ It is read from all devices in a container. In this case all
590 * information is present.
591 * 3/ It is created by ->init_super / ->add_to_super. In this case it will
592 * be complete once enough ->add_to_super calls have completed.
593 *
594 * When creating an array inside a container, the metadata will be
595 * formed by a combination of 2 and 3. The metadata or the array is read,
596 * then new information is added.
597 *
598 * The metadata must sometimes have a concept of a 'current' array
599 * and a 'current' device.
600 * The 'current' array is set by init_super to be the newly created array,
601 * or is set by super_by_fd when it finds it is looking at an array inside
602 * a container.
603 *
604 * The 'current' device is either the device that the metadata was read from
605 * in case 1, or the last device added by add_to_super in case 3.
606 * Case 2 does not identify a 'current' device.
607 */
f9ce90ba 608extern struct superswitch {
6adfd3af
NB
609
610 /* Used to report details of metadata read from a component
611 * device. ->load_super has been called.
612 */
3da92f27 613 void (*examine_super)(struct supertype *st, char *homehost);
061f2c6a 614 void (*brief_examine_super)(struct supertype *st, int verbose);
4737ae25 615 void (*brief_examine_subarrays)(struct supertype *st, int verbose);
0d726f17 616 void (*export_examine_super)(struct supertype *st);
6adfd3af
NB
617
618 /* Used to report details of an active array.
619 * ->load_super was possibly given a 'component' string.
620 */
3da92f27 621 void (*detail_super)(struct supertype *st, char *homehost);
3da92f27 622 void (*brief_detail_super)(struct supertype *st);
0d726f17 623 void (*export_detail_super)(struct supertype *st);
6adfd3af 624
4cce4069 625 /* Optional: platform hardware / firmware details */
5615172f 626 int (*detail_platform)(int verbose, int enumerate_only);
4cce4069 627
6adfd3af
NB
628 /* Used:
629 * to get uuid to storing in bitmap metadata
630 * and 'reshape' backup-data metadata
631 * To see if a device is being re-added to an array it was part of.
632 */
3da92f27 633 void (*uuid_from_super)(struct supertype *st, int uuid[4]);
6adfd3af 634
8592f29d 635 /* Extract generic details from metadata. This could be details about
6adfd3af
NB
636 * the container, or about an individual array within the container.
637 * The determination is made either by:
638 * load_super being given a 'component' string.
639 * validate_geometry determining what to create.
d2ca6449
NB
640 * The info includes both array information and device information.
641 * The particular device should be:
642 * The last device added by add_to_super
643 * The device the metadata was loaded from by load_super
a5d85af7
N
644 * If 'map' is present, then it is an array raid_disks long
645 * (raid_disk must already be set and correct) and it is filled
646 * with 1 for slots that are thought to be active and 0 for slots which
647 * appear to be failed/missing.
95eeceeb 648 * *info is zeroed out before data is added.
6adfd3af 649 */
a5d85af7 650 void (*getinfo_super)(struct supertype *st, struct mdinfo *info, char *map);
5c4cd5da 651 struct mdinfo *(*getinfo_super_disks)(struct supertype *st);
6adfd3af 652 /* Check if the given metadata is flagged as belonging to "this"
9362c1c8 653 * host. 0 for 'no', 1 for 'yes', -1 for "Don't record homehost"
6adfd3af 654 */
3da92f27 655 int (*match_home)(struct supertype *st, char *homehost);
6adfd3af
NB
656
657 /* Make one of several generic modifications to metadata
658 * prior to assembly (or other times).
659 * sparc2.2 - first bug in early 0.90 metadata
660 * super-minor - change name of 0.90 metadata
661 * summaries - 'correct' any redundant data
662 * resync - mark array as dirty to trigger a resync.
663 * uuid - set new uuid - only 0.90 or 1.x
664 * name - change the name of the array (where supported)
665 * homehost - change which host this array is tied to.
666 * devicesize - If metadata is at start of device, change recorded
667 * device size to match actual device size
668 * byteorder - swap bytes for 0.90 metadata
669 *
670 * force-one - mark that device as uptodate, not old or failed.
671 * force-array - mark array as clean if it would not otherwise
672 * assemble
673 * assemble - not sure how this is different from force-one...
674 * linear-grow-new - add a new device to a linear array, but don't
675 * change the size: so superblock still matches
676 * linear-grow-update - now change the size of the array.
16715c01
DL
677 * writemostly - set the WriteMostly1 bit in the superblock devflags
678 * readwrite - clear the WriteMostly1 bit in the superblock devflags
6adfd3af 679 */
68c7d6d7 680 int (*update_super)(struct supertype *st, struct mdinfo *info,
3da92f27 681 char *update,
e5eac01f
NB
682 char *devname, int verbose,
683 int uuid_set, char *homehost);
6adfd3af
NB
684
685 /* Create new metadata for new array as described. This could
686 * be a new container, or an array in a pre-existing container.
687 * Also used to zero metadata prior to writing it to invalidate old
688 * metadata.
689 */
3da92f27
NB
690 int (*init_super)(struct supertype *st, mdu_array_info_t *info,
691 unsigned long long size, char *name,
09057fc5 692 char *homehost, int *uuid, long long data_offset);
6adfd3af
NB
693
694 /* update the metadata to include new device, either at create or
695 * when hot-adding a spare.
696 */
f20c3968 697 int (*add_to_super)(struct supertype *st, mdu_disk_info_t *dinfo,
1a64be56
LM
698 int fd, char *devname);
699 /* update the metadata to delete a device,
700 * when hot-removing.
701 */
702 int (*remove_from_super)(struct supertype *st, mdu_disk_info_t *dinfo);
6adfd3af
NB
703
704 /* Write metadata to one device when fixing problems or adding
705 * a new device.
706 */
3da92f27 707 int (*store_super)(struct supertype *st, int fd);
6adfd3af
NB
708
709 /* Write all metadata for this array.
710 */
111d01fc 711 int (*write_init_super)(struct supertype *st);
64557c33 712 int (*compare_super)(struct supertype *st, struct supertype *tst);
3da92f27 713 int (*load_super)(struct supertype *st, int fd, char *devname);
2b959fbf 714 int (*load_container)(struct supertype *st, int fd, char *devname);
82d9eba6 715 struct supertype * (*match_metadata_desc)(char *arg);
c905b44a
N
716 __u64 (*avail_size)(struct supertype *st, __u64 size,
717 long long data_offset);
80e7f8c3 718 unsigned long long (*min_acceptable_spare_size)(struct supertype *st);
3da92f27 719 int (*add_internal_bitmap)(struct supertype *st, int *chunkp,
199171a2 720 int delay, int write_behind,
f9c25f1d 721 unsigned long long size, int may_change, int major);
3da92f27
NB
722 void (*locate_bitmap)(struct supertype *st, int fd);
723 int (*write_bitmap)(struct supertype *st, int fd);
724 void (*free_super)(struct supertype *st);
78e44928
NB
725
726 /* validate_geometry is called with an st returned by
727 * match_metadata_desc.
728 * It should check that the geometry described in compatible with
729 * the metadata type. It will be called repeatedly as devices
730 * added to validate changing size and new devices. If there are
731 * inter-device dependencies, it should record sufficient details
732 * so these can be validated.
30f58b22 733 * Both 'size' and '*freesize' are in sectors. chunk is KiB.
ecbd9e81
N
734 * Return value is:
735 * 1: everything is OK
736 * 0: not OK for some reason - if 'verbose', then error was reported.
737 * -1: st->sb was NULL, 'subdev' is a member of a container of this
738 * types, but array is not acceptable for some reason
739 * message was reported even if verbose is 0.
78e44928 740 */
17f25ca6
NB
741 int (*validate_geometry)(struct supertype *st, int level, int layout,
742 int raiddisks,
c21e737b 743 int *chunk, unsigned long long size,
74d39480 744 long long data_offset,
2c514b71
NB
745 char *subdev, unsigned long long *freesize,
746 int verbose);
598f0d58 747
00bbdbda 748 struct mdinfo *(*container_content)(struct supertype *st, char *subarray);
30f58b22
DW
749 /* query the supertype for default geometry */
750 void (*default_geometry)(struct supertype *st, int *level, int *layout, int *chunk); /* optional */
33414a01
DW
751 /* Permit subarray's to be deleted from inactive containers */
752 int (*kill_subarray)(struct supertype *st); /* optional */
aa534678 753 /* Permit subarray's to be modified */
a951a4f7 754 int (*update_subarray)(struct supertype *st, char *subarray,
fa56eddb 755 char *update, struct mddev_ident *ident); /* optional */
7bc71196
DW
756 /* Check if reshape is supported for this external format.
757 * st is obtained from super_by_fd() where st->subarray[0] is
758 * initialized to indicate if reshape is being performed at the
759 * container or subarray level
760 */
016e00f5
AK
761#define APPLY_METADATA_CHANGES 1
762#define ROLLBACK_METADATA_CHANGES 0
763
7bc71196
DW
764 int (*reshape_super)(struct supertype *st, long long size, int level,
765 int layout, int chunksize, int raid_disks,
41784c88 766 int delta_disks, char *backup, char *dev,
016e00f5 767 int direction,
41784c88 768 int verbose); /* optional */
999b4972
N
769 int (*manage_reshape)( /* optional */
770 int afd, struct mdinfo *sra, struct reshape *reshape,
771 struct supertype *st, unsigned long blocks,
772 int *fds, unsigned long long *offsets,
773 int dests, int *destfd, unsigned long long *destoffsets);
598f0d58 774
549e9569 775/* for mdmon */
cba0191b
NB
776 int (*open_new)(struct supertype *c, struct active_array *a,
777 char *inst);
ed9d66aa
NB
778
779 /* Tell the metadata handler the current state of the array.
780 * This covers whether it is known to be consistent (no pending writes)
01f157d7 781 * and how far along a resync is known to have progressed
ed9d66aa
NB
782 * (in a->resync_start).
783 * resync status is really irrelevant if the array is not consistent,
784 * but some metadata (DDF!) have a place to record the distinction.
01f157d7
N
785 * If 'consistent' is '2', then the array can mark it dirty if a
786 * resync/recovery/whatever is required, or leave it clean if not.
787 * Return value is 0 dirty (not consistent) and 1 if clean.
788 * it is only really important if consistent is passed in as '2'.
4e5528c6 789 */
01f157d7 790 int (*set_array_state)(struct active_array *a, int consistent);
7a7cc504
NB
791
792 /* When the state of a device might have changed, we call set_disk to
793 * tell the metadata what the current state is.
794 * Typically this happens on spare->in_sync and (spare|in_sync)->faulty
795 * transitions.
796 * set_disk might be called when the state of the particular disk has
797 * not in fact changed.
798 */
8d45d196 799 void (*set_disk)(struct active_array *a, int n, int state);
2e735d19
NB
800 void (*sync_metadata)(struct supertype *st);
801 void (*process_update)(struct supertype *st,
802 struct metadata_update *update);
edd8d13c
NB
803 void (*prepare_update)(struct supertype *st,
804 struct metadata_update *update);
549e9569 805
6c3fb95c
NB
806 /* activate_spare will check if the array is degraded and, if it
807 * is, try to find some spare space in the container.
808 * On success, it add appropriate updates (For process_update) to
809 * to the 'updates' list and returns a list of 'mdinfo' identifying
810 * the device, or devices as there might be multiple missing
811 * devices and multiple spares available.
812 */
813 struct mdinfo *(*activate_spare)(struct active_array *a,
814 struct metadata_update **updates);
2cda7640
ML
815 /*
816 * Return statically allocated string that represents metadata specific
817 * controller domain of the disk. The domain is used in disk domain
818 * matching functions. Disks belong to the same domain if the they have
819 * the same domain from mdadm.conf and belong the same metadata domain.
820 * Returning NULL or not providing this handler means that metadata
821 * does not distinguish the differences between disks that belong to
822 * different controllers. They are in the domain specified by
823 * configuration file (mdadm.conf).
824 * In case when the metadata has the notion of domains based on disk
825 * it shall return NULL for disks that do not belong to the controller
826 * the supported domains. Such disks will form another domain and won't
827 * be mixed with supported ones.
828 */
829 const char *(*get_disk_controller_domain)(const char *path);
549e9569 830
ba53ea59
AK
831 /* for external backup area */
832 int (*recover_backup)(struct supertype *st, struct mdinfo *info);
833
f277ce36 834 int swapuuid; /* true if uuid is bigending rather than hostendian */
d03373f1 835 int external;
4cce4069 836 const char *name; /* canonical metadata name */
0f22b998 837} *superlist[];
82d9eba6 838
0f22b998
N
839extern struct superswitch super0, super1;
840extern struct superswitch super_imsm, super_ddf;
0592faeb 841extern struct superswitch mbr, gpt;
cdddbdbc 842
edd8d13c
NB
843struct metadata_update {
844 int len;
845 char *buf;
846 void *space; /* allocated space that monitor will use */
cb23f1f4
N
847 void **space_list; /* list of allocated spaces that monitor can
848 * use or that it returned.
849 */
edd8d13c
NB
850 struct metadata_update *next;
851};
852
6adfd3af
NB
853/* A supertype holds a particular collection of metadata.
854 * It identifies the metadata type by the superswitch, and the particular
855 * sub-version of that metadata type.
856 * metadata read in or created is stored in 'sb' and 'info'.
857 * There are also fields used by mdmon to track containers.
858 *
352452c3
N
859 * A supertype may refer to:
860 * Just an array, possibly in a container
861 * A container, not identifying any particular array
862 * Info read from just one device, not yet fully describing the array/container.
863 *
864 *
6adfd3af
NB
865 * A supertype is created by:
866 * super_by_fd
867 * guess_super
868 * dup_super
869 */
82d9eba6
NB
870struct supertype {
871 struct superswitch *ss;
872 int minor_version;
ea329559 873 int max_devs;
2f6079dc 874 int container_dev; /* devnum of container */
64557c33 875 void *sb;
111d01fc 876 void *info;
df3346e6
LM
877 int ignore_hw_compat; /* used to inform metadata handlers that it should ignore
878 HW/firmware related incompatability to load metadata.
879 Used when examining metadata to display content of disk
880 when user has no hw/firmare compatible system.
881 */
edd8d13c
NB
882 struct metadata_update *updates;
883 struct metadata_update **update_tail;
884
549e9569
NB
885 /* extra stuff used by mdmon */
886 struct active_array *arrays;
549e9569 887 int sock; /* listen to external programs */
549e9569
NB
888 int devnum;
889 char *devname; /* e.g. md0. This appears in metadata_verison:
890 * external:/md0/12
891 */
892 int devcnt;
68226a80 893 int retry_soon;
549e9569
NB
894
895 struct mdinfo *devs;
896
82d9eba6 897};
f9ce90ba 898
4725bc31 899extern struct supertype *super_by_fd(int fd, char **subarray);
54887ad8
N
900enum guess_types { guess_any, guess_array, guess_partitions };
901extern struct supertype *guess_super_type(int fd, enum guess_types guess_type);
902static inline struct supertype *guess_super(int fd) {
903 return guess_super_type(fd, guess_any);
904}
3da92f27 905extern struct supertype *dup_super(struct supertype *st);
beae1dfe 906extern int get_dev_size(int fd, char *dname, unsigned long long *sizep);
3a371610 907extern int must_be_container(int fd);
0f0749ad 908extern int dev_size_from_id(dev_t id, unsigned long long *size);
8382f19b
NB
909extern void get_one_disk(int mdfd, mdu_array_info_t *ainf,
910 mdu_disk_info_t *disk);
a7c6e3fb 911void wait_for(char *dev, int fd);
f9ce90ba 912
5527fc74
N
913/*
914 * Data structures for policy management.
915 * Each device can have a policy structure that lists
916 * various name/value pairs each possibly with a metadata associated.
917 * The policy list is sorted by name/value/metadata
918 */
919struct dev_policy {
920 struct dev_policy *next;
921 char *name; /* None of these strings are allocated. They are
922 * all just references to strings which are known
923 * to exist elsewhere.
924 * name and metadata can be compared by address equality.
925 */
926 const char *metadata;
2cda7640 927 const char *value;
5527fc74
N
928};
929
4e8d9f0a 930extern char pol_act[], pol_domain[], pol_metadata[], pol_auto[];
5527fc74
N
931
932/* iterate over the sublist starting at list, having the same
933 * 'name' as 'list', and matching the given metadata (Where
934 * NULL matches anything
935 */
936#define pol_for_each(item, list, _metadata) \
937 for (item = list; \
938 item && item->name == list->name; \
939 item = item->next) \
940 if (!(!_metadata || !item->metadata || _metadata == item->metadata)) \
941 ; else
942
943/*
944 * policy records read from mdadm are largely just name-value pairs.
945 * The names are constants, not strdupped
946 */
947struct pol_rule {
948 struct pol_rule *next;
949 char *type; /* rule_policy or rule_part */
950 struct rule {
951 struct rule *next;
952 char *name;
953 char *value;
954 char *dups; /* duplicates of 'value' with a partNN appended */
955 } *rule;
956};
957
958extern char rule_policy[], rule_part[];
959extern char rule_path[], rule_type[];
960extern char type_part[], type_disk[];
961
962extern void policyline(char *line, char *type);
4e8d9f0a 963extern void policy_add(char *type, ...);
5527fc74
N
964extern void policy_free(void);
965
73c9c47c 966extern struct dev_policy *path_policy(char *path, char *type);
5527fc74 967extern struct dev_policy *disk_policy(struct mdinfo *disk);
4e8d9f0a 968extern struct dev_policy *devnum_policy(int dev);
5527fc74
N
969extern void dev_policy_free(struct dev_policy *p);
970
e78dda3b
N
971//extern void pol_new(struct dev_policy **pol, char *name, char *val, char *metadata);
972extern void pol_add(struct dev_policy **pol, char *name, char *val, char *metadata);
5527fc74
N
973extern struct dev_policy *pol_find(struct dev_policy *pol, char *name);
974
e3bb5f14
N
975enum policy_action {
976 act_default,
977 act_include,
978 act_re_add,
d2db3045
N
979 act_spare, /* This only applies to bare devices */
980 act_spare_same_slot, /* this allows non-bare devices,
981 * but only if recent removal */
982 act_force_spare, /* this allow non-bare devices in any case */
e3bb5f14
N
983 act_err
984};
985
986extern int policy_action_allows(struct dev_policy *plist, const char *metadata,
987 enum policy_action want);
988extern int disk_action_allows(struct mdinfo *disk, const char *metadata,
989 enum policy_action want);
f5f12c84
N
990
991struct domainlist {
992 struct domainlist *next;
2cda7640 993 const char *dom;
f5f12c84
N
994};
995
996extern int domain_test(struct domainlist *dom, struct dev_policy *pol,
997 const char *metadata);
998extern struct domainlist *domain_from_array(struct mdinfo *mdi,
999 const char *metadata);
e78dda3b
N
1000extern void domainlist_add_dev(struct domainlist **dom, int devnum,
1001 const char *metadata);
f5f12c84
N
1002extern void domain_free(struct domainlist *dl);
1003extern void domain_merge(struct domainlist **domp, struct dev_policy *pol,
1004 const char *metadata);
e78dda3b 1005void domain_add(struct domainlist **domp, char *domain);
f5f12c84 1006
403410eb
PC
1007extern void policy_save_path(char *id_path, struct map_ent *array);
1008extern int policy_check_path(struct mdinfo *disk, struct map_ent *array);
1009
838acbc2
NB
1010#if __GNUC__ < 3
1011struct stat64;
1012#endif
1013
45e878bb
NB
1014#define HAVE_NFTW we assume
1015#define HAVE_FTW
1016
2df1f269 1017#ifdef __UCLIBC__
45e878bb 1018# include <features.h>
2df1f269
BRF
1019# ifndef __UCLIBC_HAS_LFS__
1020# define lseek64 lseek
1021# endif
45e878bb
NB
1022# ifndef __UCLIBC_HAS_FTW__
1023# undef HAVE_FTW
1024# undef HAVE_NFTW
1025# endif
1026#endif
1027
1028#ifdef __dietlibc__
1029# undef HAVE_NFTW
1030#endif
1031
e39b673e 1032#if defined(__KLIBC__)
1033# undef HAVE_NFTW
1034# undef HAVE_FTW
1035#endif
1036
45e878bb 1037#ifndef HAVE_NFTW
173fc515 1038# define FTW_PHYS 1
45e878bb
NB
1039# ifndef HAVE_FTW
1040 struct FTW {};
173fc515
NB
1041# endif
1042#endif
1043
45e878bb
NB
1044#ifdef HAVE_FTW
1045# include <ftw.h>
1046#endif
1047
173fc515
NB
1048extern int add_dev(const char *name, const struct stat *stb, int flag, struct FTW *s);
1049
f9ce90ba 1050
64c4757e 1051extern int Manage_ro(char *devname, int fd, int readonly);
91f068bf 1052extern int Manage_runstop(char *devname, int fd, int runstop, int quiet);
dd0781e5 1053extern int Manage_resize(char *devname, int fd, long long size, int raid_disks);
64c4757e 1054extern int Manage_subdevs(char *devname, int fd,
833bb0f8 1055 struct mddev_dev *devlist, int verbose, int test,
11b391ec 1056 char *update, int force);
1f48664b 1057extern int autodetect(void);
e5329c37 1058extern int Grow_Add_device(char *devname, int fd, char *newdev);
8fac0577 1059extern int Grow_addbitmap(char *devname, int fd, char *file, int chunk, int delay, int write_behind, int force);
06b0d786 1060extern int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
e86c9dd6 1061 long long size,
691a36b7 1062 int level, char *layout_str, int chunksize, int raid_disks,
79b1d381 1063 long long data_offset,
e2e53a2d 1064 struct mddev_dev *devlist,
ce52f92f 1065 int assume_clean, int force);
06b0d786 1066extern int Grow_restart(struct supertype *st, struct mdinfo *info,
ea0ebe96 1067 int *fdlist, int cnt, char *backup_file, int verbose);
e9e43ec3 1068extern int Grow_continue(int mdfd, struct supertype *st,
b76b30e0
AK
1069 struct mdinfo *info, char *backup_file,
1070 int freeze_reshape);
1071
3f54bd62
AK
1072extern int restore_backup(struct supertype *st,
1073 struct mdinfo *content,
1074 int working_disks,
1075 int spares,
1076 char *backup_file,
1077 int verbose);
2dddadb0
AK
1078extern int Grow_continue_command(char *devname, int fd,
1079 char *backup_file, int verbose);
64c4757e 1080
7f91af49 1081extern int Assemble(struct supertype *st, char *mddev,
fa56eddb 1082 struct mddev_ident *ident,
87f26d14
N
1083 struct mddev_dev *devlist,
1084 char *backup_file, int invalid_backup,
64c4757e 1085 int readonly, int runstop,
0ac91628 1086 char *update, char *homehost, int require_homehost,
b76b30e0 1087 int verbose, int force, int freeze_reshape);
64c4757e 1088
7f91af49 1089extern int Build(char *mddev, int chunk, int level, int layout,
a655e550 1090 int raiddisks, struct mddev_dev *devlist, int assume_clean,
7f91af49 1091 char *bitmap_file, int bitmap_chunk, int write_behind,
83208785 1092 int delay, int verbose, int autof, unsigned long long size);
64c4757e
NB
1093
1094
7f91af49 1095extern int Create(struct supertype *st, char *mddev,
5dd497ee 1096 int chunk, int level, int layout, unsigned long long size, int raiddisks, int sparedisks,
3d3dd91e 1097 char *name, char *homehost, int *uuid,
a655e550 1098 int subdevs, struct mddev_dev *devlist,
47d79ef8 1099 int runstop, int verbose, int force, int assume_clean,
79b1d381
N
1100 char *bitmap_file, int bitmap_chunk, int write_behind, int delay, int autof,
1101 unsigned long long data_offset);
64c4757e 1102
c2ecf5f6 1103extern int Detail(char *dev, int brief, int export, int test, char *homehost, char *prefer);
4cce4069 1104extern int Detail_Platform(struct superswitch *ss, int scan, int verbose);
e0d19036 1105extern int Query(char *dev);
a655e550 1106extern int Examine(struct mddev_dev *devlist, int brief, int export, int scan,
0d726f17 1107 int SparcAdjust, struct supertype *forcest, char *homehost);
a655e550 1108extern int Monitor(struct mddev_dev *devlist,
e0d19036 1109 char *mailaddr, char *alert_cmd,
aa88f531 1110 int period, int daemonise, int scan, int oneshot,
edde9560 1111 int dosyslog, int test, char *pidfile, int increments,
c2ecf5f6 1112 int share, char *prefer);
64c4757e 1113
9277cc77 1114extern int Kill(char *dev, struct supertype *st, int force, int quiet, int noexcl);
33414a01 1115extern int Kill_subarray(char *dev, char *subarray, int quiet);
fa56eddb 1116extern int Update_subarray(char *dev, char *subarray, char *update, struct mddev_ident *ident, int quiet);
b90c0e9a 1117extern int Wait(char *dev);
9f1da824 1118extern int WaitClean(char *dev, int sock, int verbose);
9a9dab36 1119
8382f19b 1120extern int Incremental(char *devname, int verbose, int runstop,
0ac91628 1121 struct supertype *st, char *homehost, int require_homehost,
b76b30e0 1122 int autof, int freeze_reshape);
8382f19b
NB
1123extern void RebuildMap(void);
1124extern int IncrementalScan(int verbose);
950bc344 1125extern int IncrementalRemove(char *devname, char *path, int verbose);
c82f047c
NB
1126extern int CreateBitmap(char *filename, int force, char uuid[16],
1127 unsigned long chunksize, unsigned long daemon_sleep,
dfd4d8ee 1128 unsigned long write_behind,
dcec9ee5
NB
1129 unsigned long long array_size,
1130 int major);
55935d51 1131extern int ExamineBitmap(char *filename, int brief, struct supertype *st);
20b60dcd 1132extern int Write_rules(char *rule_name);
bf4fb153 1133extern int bitmap_update_uuid(int fd, int *uuid, int swap);
2a528478 1134extern unsigned long bitmap_sectors(struct bitmap_super_s *bsb);
c82f047c 1135
64c4757e 1136extern int md_get_version(int fd);
e0d19036 1137extern int get_linux_version(void);
bc77ed53 1138extern int mdadm_version(char *version);
84e11361 1139extern long long parse_size(char *size);
64c4757e 1140extern int parse_uuid(char *str, int uuid[4]);
4a06e2c2
N
1141extern int parse_layout_10(char *layout);
1142extern int parse_layout_faulty(char *layout);
682c7051
NB
1143extern int check_ext2(int fd, char *name);
1144extern int check_reiser(int fd, char *name);
1145extern int check_raid(int fd, char *name);
53ed6ac3
KW
1146extern int check_partitions(int fd, char *dname,
1147 unsigned long long freesize,
1148 unsigned long long size);
64c4757e 1149
dd0781e5 1150extern int get_mdp_major(void);
8b0dabea 1151extern int dev_open(char *dev, int flags);
e8a70c89 1152extern int open_dev(int devnum);
d998b738 1153extern int open_dev_flags(int devnum, int flags);
a931db9e 1154extern int open_dev_excl(int devnum);
8d80900b 1155extern int is_standard(char *dev, int *nump);
9008ed1c 1156extern int same_dev(char *one, char *two);
dd0781e5 1157
f1ae21c4 1158extern int parse_auto(char *str, char *msg, int config);
fa56eddb 1159extern struct mddev_ident *conf_get_ident(char *dev);
a655e550 1160extern struct mddev_dev *conf_get_devs(void);
8382f19b 1161extern int conf_test_dev(char *devname);
4e8d9f0a 1162extern int conf_test_metadata(const char *version, struct dev_policy *pol, int is_homehost);
8aec876d
NB
1163extern struct createinfo *conf_get_create_info(void);
1164extern void set_conffile(char *file);
1165extern char *conf_get_mailaddr(void);
1166extern char *conf_get_mailfrom(void);
1167extern char *conf_get_program(void);
0ac91628 1168extern char *conf_get_homehost(int *require_homehostp);
e0d19036 1169extern char *conf_line(FILE *file);
98c6faba 1170extern char *conf_word(FILE *file, int allow_key);
0ac91628 1171extern int conf_name_is_free(char *name);
7c336758 1172extern int conf_verify_devnames(struct mddev_ident *array_list);
0ac91628 1173extern int devname_matches(char *name, char *match);
2244d1a9
N
1174extern struct mddev_ident *conf_match(struct supertype *st,
1175 struct mdinfo *info,
1176 char *devname,
1177 int verbose, int *rvp);
6d11ec6f 1178extern int experimental(void);
0ac91628 1179
e0d19036
NB
1180extern void free_line(char *line);
1181extern int match_oneof(char *devices, char *devname);
e0d19036 1182extern void uuid_from_super(int uuid[4], mdp_super_t *super);
22e263f6 1183extern const int uuid_zero[4];
f277ce36 1184extern int same_uuid(int a[4], int b[4], int swapuuid);
350f29f9 1185extern void copy_uuid(void *a, int b[4], int swapuuid);
aae5a112 1186extern char *__fname_from_uuid(int id[4], int swap, char *buf, char sep);
d7288ddc 1187extern char *fname_from_uuid(struct supertype *st,
ff54de6e 1188 struct mdinfo *info, char *buf, char sep);
4b1ac34b 1189extern unsigned long calc_csum(void *super, int bytes);
583315d9 1190extern int enough(int level, int raid_disks, int layout, int clean,
de5a472e 1191 char *avail);
8453e704 1192extern int enough_fd(int fd);
e0d19036 1193extern int ask(char *mesg);
8fac0577 1194extern unsigned long long get_component_size(int fd);
0430ed48 1195extern void remove_partitions(int fd);
691c6ee1 1196extern int test_partition(int fd);
bfd76b93 1197extern int test_partition_from_id(dev_t id);
577e8448 1198extern int get_data_disks(int level, int layout, int raid_disks);
5f8097be
NB
1199extern unsigned long long calc_array_size(int level, int raid_disks, int layout,
1200 int chunksize, unsigned long long devsize);
edd8d13c
NB
1201extern int flush_metadata_updates(struct supertype *st);
1202extern void append_metadata_update(struct supertype *st, void *buf, int len);
6234c63c
DW
1203extern int assemble_container_content(struct supertype *st, int mdfd,
1204 struct mdinfo *content, int runstop,
49680258 1205 char *chosen_name, int verbose,
b76b30e0 1206 char *backup_file, int freeze_reshape);
326727d9
AC
1207extern struct mdinfo *container_choose_spares(struct supertype *st,
1208 unsigned long long min_size,
1209 struct domainlist *domlist,
1210 char *spare_group,
1211 const char *metadata, int get_one);
d52bb542 1212extern int move_spare(char *from_devname, char *to_devname, dev_t devid);
7801ac20
N
1213extern int add_disk(int mdfd, struct supertype *st,
1214 struct mdinfo *sra, struct mdinfo *info);
de6ae750
N
1215extern int remove_disk(int mdfd, struct supertype *st,
1216 struct mdinfo *sra, struct mdinfo *info);
f35f2525 1217extern int set_array_info(int mdfd, struct supertype *st, struct mdinfo *info);
1e5c6983 1218unsigned long long min_recovery_start(struct mdinfo *array);
cd29a5c8 1219
56eb10c0 1220extern char *human_size(long long bytes);
e4965ef8
N
1221extern char *human_size_brief(long long bytes);
1222extern void print_r10_layout(int layout);
e0d19036 1223
63152c1b
NB
1224#define NoMdDev (1<<23)
1225extern int find_free_devnum(int use_partitions);
1226
e0d19036
NB
1227extern void put_md_name(char *name);
1228extern char *get_md_name(int dev);
1229
c913b90e 1230extern char DefaultConfFile[];
b5e64645 1231
69207ff6
N
1232extern int create_mddev(char *dev, char *name, int autof, int trustworthy,
1233 char *chosen);
1234/* values for 'trustworthy' */
1235#define LOCAL 1
d1d3482b 1236#define LOCAL_ANY 10
69207ff6
N
1237#define FOREIGN 2
1238#define METADATA 3
6be1d39d 1239extern int open_mddev(char *dev, int report_errors);
a322f70c 1240extern int open_container(int fd);
33414a01
DW
1241extern int is_container_member(struct mdstat_ent *ent, char *devname);
1242extern int is_subarray_active(char *subarray, char *devname);
feab51f8 1243extern int open_subarray(char *dev, char *subarray, struct supertype *st, int quiet);
33414a01 1244extern struct superswitch *version_to_superswitch(char *vers);
b5e64645 1245
a931db9e 1246extern int mdmon_running(int devnum);
24f6f99b 1247extern int mdmon_pid(int devnum);
40ebbb9c 1248extern int check_env(char *name);
148acb7b 1249extern __u32 random32(void);
8850ee3e 1250extern int start_mdmon(int devnum);
a931db9e 1251
999b4972
N
1252extern int child_monitor(int afd, struct mdinfo *sra, struct reshape *reshape,
1253 struct supertype *st, unsigned long stripes,
1254 int *fds, unsigned long long *offsets,
1255 int dests, int *destfd, unsigned long long *destoffsets);
10f22854 1256void abort_reshape(struct mdinfo *sra);
999b4972 1257
2f6079dc 1258extern char *devnum2devname(int num);
11877f4d 1259extern void fmt_devname(char *name, int num);
77472ff8 1260extern int devname2devnum(char *name);
c94709e8 1261extern int stat2devnum(struct stat *st);
2f6079dc 1262extern int fd2devnum(int fd);
b5e64645 1263
a931db9e
NB
1264static inline int dev2major(int d)
1265{
1266 if (d >= 0)
1267 return MD_MAJOR;
1268 else
1269 return get_mdp_major();
1270}
1271
1272static inline int dev2minor(int d)
1273{
1274 if (d >= 0)
1275 return d;
1276 return (-1-d) << MdpMinorShift;
1277}
1278
2d762ade 1279#define _ROUND_UP(val, base) (((val) + (base) - 1) & ~(base - 1))
de897065
JS
1280#define ROUND_UP(val, base) _ROUND_UP(val, (typeof(val))(base))
1281#define ROUND_UP_PTR(ptr, base) ((typeof(ptr)) \
1282 (ROUND_UP((unsigned long)(ptr), base)))
6416d527 1283
3c558363
N
1284static inline int is_subarray(char *vers)
1285{
e9dd1598
N
1286 /* The version string for a 'subarray' (an array in a container)
1287 * is
1288 * /containername/componentname for normal read-write arrays
746a6567
N
1289 * -containername/componentname for arrays which mdmon must not
1290 * reconfigure. They might be read-only
1291 * or might be undergoing reshape etc.
e9dd1598
N
1292 * containername is e.g. md0, md_d1
1293 * componentname is dependant on the metadata. e.g. '1' 'S1' ...
1294 */
1295 return (*vers == '/' || *vers == '-');
3c558363
N
1296}
1297
e5408a32
DW
1298static inline char *to_subarray(struct mdstat_ent *ent, char *container)
1299{
1300 return &ent->metadata_version[10+strlen(container)+1];
1301}
1302
2a24d7b6
DW
1303#ifdef DEBUG
1304#define dprintf(fmt, arg...) \
1305 fprintf(stderr, fmt, ##arg)
1306#else
1307#define dprintf(fmt, arg...) \
1308 ({ if (0) fprintf(stderr, fmt, ##arg); 0; })
1309#endif
1a0ee0ba
DK
1310#include <assert.h>
1311#include <stdarg.h>
1312static inline int xasprintf(char **strp, const char *fmt, ...) {
1313 va_list ap;
1314 int ret;
1315 va_start(ap, fmt);
089485cb 1316 ret = vasprintf(strp, fmt, ap);
1a0ee0ba
DK
1317 va_end(ap);
1318 assert(ret >= 0);
1319 return ret;
1320}
2a24d7b6 1321
b5e64645
NB
1322#define LEVEL_MULTIPATH (-4)
1323#define LEVEL_LINEAR (-1)
1324#define LEVEL_FAULTY (-5)
1325
17f25ca6
NB
1326/* kernel module doesn't know about these */
1327#define LEVEL_CONTAINER (-100)
a322f70c 1328#define LEVEL_UNSUPPORTED (-200)
17f25ca6 1329
b5e64645
NB
1330
1331/* faulty stuff */
1332
1333#define WriteTransient 0
1334#define ReadTransient 1
1335#define WritePersistent 2
1336#define ReadPersistent 3
1337#define WriteAll 4 /* doesn't go to device */
1338#define ReadFixable 5
1339#define Modes 6
1340
1341#define ClearErrors 31
1342#define ClearFaults 30
1343
1344#define AllPersist 100 /* internal use only */
1345#define NoPersist 101
1346
1347#define ModeMask 0x1f
1348#define ModeShift 5
fe6729fa
NB
1349
1350
1351#ifdef __TINYC__
1352#undef minor
1353#undef major
1354#undef makedev
1355#define minor(x) ((x)&0xff)
1356#define major(x) (((x)>>8)&0xff)
1357#define makedev(M,m) (((M)<<8) | (m))
1358#endif
1359
b640a252 1360/* for raid4/5/6 */
e86c9dd6
NB
1361#define ALGORITHM_LEFT_ASYMMETRIC 0
1362#define ALGORITHM_RIGHT_ASYMMETRIC 1
1363#define ALGORITHM_LEFT_SYMMETRIC 2
1364#define ALGORITHM_RIGHT_SYMMETRIC 3
b640a252
N
1365
1366/* Define non-rotating (raid4) algorithms. These allow
1367 * conversion of raid4 to raid5.
1368 */
1369#define ALGORITHM_PARITY_0 4 /* P or P,Q are initial devices */
1370#define ALGORITHM_PARITY_N 5 /* P or P,Q are final devices. */
1371
1372/* DDF RAID6 layouts differ from md/raid6 layouts in two ways.
1373 * Firstly, the exact positioning of the parity block is slightly
1374 * different between the 'LEFT_*' modes of md and the "_N_*" modes
1375 * of DDF.
1376 * Secondly, or order of datablocks over which the Q syndrome is computed
1377 * is different.
1378 * Consequently we have different layouts for DDF/raid6 than md/raid6.
1379 * These layouts are from the DDFv1.2 spec.
1380 * Interestingly DDFv1.2-Errata-A does not specify N_CONTINUE but
1381 * leaves RLQ=3 as 'Vendor Specific'
1382 */
1383
1384#define ALGORITHM_ROTATING_ZERO_RESTART 8 /* DDF PRL=6 RLQ=1 */
1385#define ALGORITHM_ROTATING_N_RESTART 9 /* DDF PRL=6 RLQ=2 */
1386#define ALGORITHM_ROTATING_N_CONTINUE 10 /*DDF PRL=6 RLQ=3 */
1387
1388
1389/* For every RAID5 algorithm we define a RAID6 algorithm
1390 * with exactly the same layout for data and parity, and
1391 * with the Q block always on the last device (N-1).
1392 * This allows trivial conversion from RAID5 to RAID6
1393 */
1394#define ALGORITHM_LEFT_ASYMMETRIC_6 16
1395#define ALGORITHM_RIGHT_ASYMMETRIC_6 17
1396#define ALGORITHM_LEFT_SYMMETRIC_6 18
1397#define ALGORITHM_RIGHT_SYMMETRIC_6 19
1398#define ALGORITHM_PARITY_0_6 20
1399#define ALGORITHM_PARITY_N_6 ALGORITHM_PARITY_N
1400
33a6535d
AW
1401/* Define PATH_MAX in case we don't use glibc or standard library does
1402 * not have PATH_MAX defined. Assume max path length is 4K characters.
1403 */
1404#ifndef PATH_MAX
1405#define PATH_MAX 4096
1406#endif
1407
2d3603ba
KW
1408#define PROCESS_DELAYED -2
1409#define PROCESS_PENDING -3
a0963a86 1410
480f3566
N
1411/* When using "GET_DISK_INFO" it isn't certain how high
1412 * we need to check. So we impose an absolute limit of
1413 * MAX_DISKS. This needs to be much more than the largest
1414 * number of devices any metadata can support. Currently
1415 * v1.x can support 1920
1416 */
1417#define MAX_DISKS 4096
1418
a0963a86 1419extern int __offroot;