]> git.ipfire.org Git - thirdparty/mdadm.git/blame - mdadm.h
Support external metadata recovery-resume
[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
c82f047c
NB
67#define DEFAULT_BITMAP_CHUNK 4096
68#define DEFAULT_BITMAP_DELAY 5
dfd4d8ee 69#define DEFAULT_MAX_WRITE_BEHIND 256
64c4757e
NB
70
71#include "md_u.h"
e0d19036 72#include "md_p.h"
c82f047c 73#include "bitmap.h"
f7dd881f 74#include "msg.h"
64c4757e 75
1e0d770c 76#include <endian.h>
efd441d1
NB
77/* Redhat don't like to #include <asm/byteorder.h>, and
78 * some time include <linux/byteorder/xxx_endian.h> isn't enough,
79 * and there is no standard conversion function so... */
0ae03b8a
NB
80/* And dietlibc doesn't think byteswap is ok, so.. */
81/* #include <byteswap.h> */
82#define bswap_16(x) (((x) & 0x00ffU) << 8 | \
83 ((x) & 0xff00U) >> 8)
84#define bswap_32(x) (((x) & 0x000000ffU) << 24 | \
85 ((x) & 0xff000000U) >> 24 | \
86 ((x) & 0x0000ff00U) << 8 | \
87 ((x) & 0x00ff0000U) >> 8)
88#define bswap_64(x) (((x) & 0x00000000000000ffULL) << 56 | \
89 ((x) & 0xff00000000000000ULL) >> 56 | \
90 ((x) & 0x000000000000ff00ULL) << 40 | \
91 ((x) & 0x00ff000000000000ULL) >> 40 | \
92 ((x) & 0x0000000000ff0000ULL) << 24 | \
93 ((x) & 0x0000ff0000000000ULL) >> 24 | \
94 ((x) & 0x00000000ff000000ULL) << 8 | \
95 ((x) & 0x000000ff00000000ULL) >> 8)
96
e39b673e 97#if !defined(__KLIBC__)
efd441d1
NB
98#if BYTE_ORDER == LITTLE_ENDIAN
99#define __cpu_to_le16(_x) (_x)
100#define __cpu_to_le32(_x) (_x)
101#define __cpu_to_le64(_x) (_x)
102#define __le16_to_cpu(_x) (_x)
103#define __le32_to_cpu(_x) (_x)
104#define __le64_to_cpu(_x) (_x)
974e620d
NB
105
106#define __cpu_to_be16(_x) bswap_16(_x)
107#define __cpu_to_be32(_x) bswap_32(_x)
108#define __cpu_to_be64(_x) bswap_64(_x)
109#define __be16_to_cpu(_x) bswap_16(_x)
110#define __be32_to_cpu(_x) bswap_32(_x)
111#define __be64_to_cpu(_x) bswap_64(_x)
efd441d1
NB
112#elif BYTE_ORDER == BIG_ENDIAN
113#define __cpu_to_le16(_x) bswap_16(_x)
114#define __cpu_to_le32(_x) bswap_32(_x)
115#define __cpu_to_le64(_x) bswap_64(_x)
116#define __le16_to_cpu(_x) bswap_16(_x)
117#define __le32_to_cpu(_x) bswap_32(_x)
118#define __le64_to_cpu(_x) bswap_64(_x)
974e620d
NB
119
120#define __cpu_to_be16(_x) (_x)
121#define __cpu_to_be32(_x) (_x)
122#define __cpu_to_be64(_x) (_x)
123#define __be16_to_cpu(_x) (_x)
124#define __be32_to_cpu(_x) (_x)
125#define __be64_to_cpu(_x) (_x)
1e0d770c
NB
126#else
127# error "unknown endianness."
128#endif
e39b673e 129#endif /* __KLIBC__ */
1e0d770c
NB
130
131
132
4b1ac34b
NB
133/* general information that might be extracted from a superblock */
134struct mdinfo {
135 mdu_array_info_t array;
136 mdu_disk_info_t disk;
137 __u64 events;
fbf8a0b7 138 int uuid[4];
31317663 139 char name[33];
353632d9 140 unsigned long long data_offset;
598f0d58
NB
141 unsigned long long component_size; /* same as array.size, except in
142 * sectors and up to 64bits.
143 */
da9b4a62
DW
144 unsigned long long custom_array_size; /* size for non-default sized
145 * arrays (in sectors)
146 */
353632d9
NB
147 int reshape_active;
148 unsigned long long reshape_progress;
e1516be1
DW
149 union {
150 unsigned long long resync_start; /* per-array resync position */
151 unsigned long long recovery_start; /* per-device rebuild position */
b7528a20 152 #define MaxSector (~0ULL) /* resync/recovery complete position */
e1516be1 153 };
a67dd8cc 154 unsigned long safe_mode_delay; /* ms delay to mark clean */
353632d9 155 int new_level, delta_disks, new_layout, new_chunk;
06c7f68e 156 int errors;
7e0f6979
NB
157 int cache_size; /* size of raid456 stripe cache*/
158 int mismatch_cnt;
159 char text_version[50];
6e46bf34
DW
160 void *update_private; /* for passing metadata-format
161 * specific update data
162 * between successive calls to
163 * update_super()
164 */
dd15dc4a
NB
165
166 int container_member; /* for assembling external-metatdata arrays
167 * This is to be used internally by metadata
168 * handler only */
06c7f68e
NB
169
170 char sys_name[20];
7e0f6979 171 struct mdinfo *devs;
06c7f68e 172 struct mdinfo *next;
549e9569
NB
173
174 /* Device info for mdmon: */
e1516be1 175 int recovery_fd;
549e9569 176 int state_fd;
8d45d196
DW
177 #define DS_FAULTY 1
178 #define DS_INSYNC 2
179 #define DS_WRITE_MOSTLY 4
180 #define DS_SPARE 8
181 #define DS_BLOCKED 16
182 #define DS_REMOVE 1024
92967543 183 #define DS_UNBLOCK 2048
549e9569
NB
184 int prev_state, curr_state, next_state;
185
4b1ac34b
NB
186};
187
5bbb4842
NB
188struct createinfo {
189 int uid;
190 int gid;
191 int autof;
192 int mode;
38098016 193 int symlinks;
058574b1 194 struct supertype *supertype;
5bbb4842
NB
195};
196
9a9dab36 197#define Name "mdadm"
682c7051 198
e0d19036
NB
199enum mode {
200 ASSEMBLE=1,
201 BUILD,
202 CREATE,
203 MANAGE,
204 MISC,
205 MONITOR,
dd0781e5 206 GROW,
8382f19b 207 INCREMENTAL,
1f48664b 208 AUTODETECT,
e0d19036
NB
209};
210
64c4757e 211extern char short_options[];
024768c4 212extern char short_bitmap_options[];
c06487ce 213extern char short_bitmap_auto_options[];
64c4757e 214extern struct option long_options[];
56eedc1a 215extern char Version[], Usage[], Help[], OptionHelp[],
dd0781e5 216 Help_create[], Help_build[], Help_assemble[], Help_grow[],
8382f19b 217 Help_incr[],
e0d19036 218 Help_manage[], Help_misc[], Help_monitor[], Help_config[];
64c4757e 219
997aed5d
NB
220/* for option that don't have short equivilents, we assign arbitrary
221 * small numbers. '1' means an undecorated option, so we start at '2'.
222 */
223enum special_options {
224 AssumeClean = 2,
225 BitmapChunk,
226 WriteBehind,
227 ReAdd,
228 NoDegraded,
229 Sparc22,
230 BackupFile,
231 HomeHost,
589395d6 232 AutoHomeHost,
38098016 233 Symlinks,
1f48664b 234 AutoDetect,
1770662b 235 Waitclean,
4cce4069 236 DetailPlatform,
997aed5d
NB
237};
238
64c4757e 239/* structures read from config file */
52826846
NB
240/* List of mddevice names and identifiers
241 * Identifiers can be:
242 * uuid=128-hex-uuid
243 * super-minor=decimal-minor-number-from-superblock
244 * devices=comma,separated,list,of,device,names,with,wildcards
245 *
246 * If multiple fields are present, the intersection of all matching
247 * devices is considered
248 */
98c6faba 249#define UnSet (0xfffe)
52826846 250typedef struct mddev_ident_s {
dd0781e5 251 char *devname;
aba69144 252
dd0781e5 253 int uuid_set;
3fa06e9d 254 int uuid[4];
947fd4dd 255 char name[33];
52826846 256
98c6faba 257 unsigned int super_minor;
52826846 258
dd0781e5 259 char *devices; /* comma separated list of device
52826846
NB
260 * names with wild cards
261 */
dd0781e5 262 int level;
98c6faba
NB
263 unsigned int raid_disks;
264 unsigned int spare_disks;
82d9eba6 265 struct supertype *st;
dd0781e5
NB
266 int autof; /* 1 for normal, 2 for partitioned */
267 char *spare_group;
7ef02d01 268 char *bitmap_file;
c82f047c 269 int bitmap_fd;
dd0781e5 270
1771a6e2
N
271 char *container; /* /dev/whatever name of container, or
272 * uuid of container. You would expect
273 * this to be the 'devname' or UUID
dbb44303
N
274 * of some other entry.
275 */
276 char *member; /* subarray within a container */
277
52826846
NB
278 struct mddev_ident_s *next;
279} *mddev_ident_t;
64c4757e
NB
280
281/* List of device names - wildcards expanded */
282typedef struct mddev_dev_s {
283 char *devname;
cd29a5c8
NB
284 char disposition; /* 'a' for add, 'r' for remove, 'f' for fail.
285 * Not set for names read from .config
286 */
b3d31955 287 char writemostly; /* 1 for 'set writemostly', 2 for 'clear writemostly' */
fe80f49b 288 char re_add;
811e6cbe 289 char used; /* set when used */
9008ed1c
N
290 struct mdinfo *content; /* If devname is a container, this might list
291 * the remaining member arrays. */
64c4757e
NB
292 struct mddev_dev_s *next;
293} *mddev_dev_t;
294
682c7051
NB
295typedef struct mapping {
296 char *name;
297 int num;
298} mapping_t;
299
e0d19036
NB
300
301struct mdstat_ent {
302 char *dev;
303 int devnum;
304 int active;
305 char *level;
306 char *pattern; /* U or up, _ for down */
307 int percent; /* -1 if no resync */
e5329c37 308 int resync; /* 1 if resync, 0 if recovery */
549e9569
NB
309 int devcnt;
310 int raid_disks;
311 int chunk_size;
312 char * metadata_version;
e0d19036
NB
313 struct mdstat_ent *next;
314};
315
22a88995 316extern struct mdstat_ent *mdstat_read(int hold, int start);
e0d19036 317extern void free_mdstat(struct mdstat_ent *ms);
dd0781e5 318extern void mdstat_wait(int seconds);
1ed3f387 319extern void mdstat_wait_fd(int fd, const sigset_t *sigmask);
8382f19b
NB
320extern int mddev_busy(int devnum);
321
322struct map_ent {
323 struct map_ent *next;
324 int devnum;
1522c538 325 char metadata[20];
8382f19b 326 int uuid[4];
195254b8 327 int bad;
8382f19b
NB
328 char *path;
329};
1522c538 330extern int map_update(struct map_ent **mpp, int devnum, char *metadata,
8382f19b
NB
331 int uuid[4], char *path);
332extern struct map_ent *map_by_uuid(struct map_ent **map, int uuid[4]);
f2e55ecc
N
333extern struct map_ent *map_by_devnum(struct map_ent **map, int devnum);
334extern struct map_ent *map_by_name(struct map_ent **map, char *name);
8382f19b
NB
335extern void map_read(struct map_ent **melp);
336extern int map_write(struct map_ent *mel);
337extern void map_delete(struct map_ent **mapp, int devnum);
338extern void map_free(struct map_ent *map);
339extern void map_add(struct map_ent **melp,
1522c538 340 int devnum, char *metadata, int uuid[4], char *path);
ad5bc697
N
341extern int map_lock(struct map_ent **melp);
342extern void map_unlock(struct map_ent **melp);
e0d19036 343
e86c9dd6 344/* various details can be requested */
dab4a513
DW
345enum sysfs_read_flags {
346 GET_LEVEL = (1 << 0),
347 GET_LAYOUT = (1 << 1),
348 GET_COMPONENT = (1 << 2),
349 GET_CHUNK = (1 << 3),
350 GET_CACHE = (1 << 4),
351 GET_MISMATCH = (1 << 5),
352 GET_VERSION = (1 << 6),
353 GET_DISKS = (1 << 7),
354 GET_DEGRADED = (1 << 8),
355 GET_SAFEMODE = (1 << 9),
356 GET_DEVS = (1 << 10), /* gets role, major, minor */
357 GET_OFFSET = (1 << 11),
358 GET_SIZE = (1 << 12),
359 GET_STATE = (1 << 13),
360 GET_ERROR = (1 << 14),
361 SKIP_GONE_DEVS = (1 << 15),
362};
e86c9dd6
NB
363
364/* If fd >= 0, get the array it is open on,
365 * else use devnum. >=0 -> major9. <0.....
366 */
549e9569 367extern int sysfs_open(int devnum, char *devname, char *attr);
f35f2525 368extern void sysfs_init(struct mdinfo *mdi, int fd, int devnum);
7e0f6979
NB
369extern void sysfs_free(struct mdinfo *sra);
370extern struct mdinfo *sysfs_read(int fd, int devnum, unsigned long options);
1770662b
DW
371extern int sysfs_attr_match(const char *attr, const char *str);
372extern int sysfs_match_word(const char *word, char **list);
7e0f6979 373extern int sysfs_set_str(struct mdinfo *sra, struct mdinfo *dev,
e86c9dd6 374 char *name, char *val);
7e0f6979 375extern int sysfs_set_num(struct mdinfo *sra, struct mdinfo *dev,
e86c9dd6 376 char *name, unsigned long long val);
97590376 377extern int sysfs_uevent(struct mdinfo *sra, char *event);
7236ee7a
N
378extern int sysfs_get_fd(struct mdinfo *sra, struct mdinfo *dev,
379 char *name);
380extern int sysfs_fd_get_ll(int fd, unsigned long long *val);
7e0f6979 381extern int sysfs_get_ll(struct mdinfo *sra, struct mdinfo *dev,
e86c9dd6 382 char *name, unsigned long long *val);
7236ee7a 383extern int sysfs_fd_get_str(int fd, char *val, int size);
93ecfa01
N
384extern int sysfs_get_str(struct mdinfo *sra, struct mdinfo *dev,
385 char *name, char *val, int size);
8ed3e5e1 386extern int sysfs_set_safemode(struct mdinfo *sra, unsigned long ms);
f35f2525 387extern int sysfs_set_array(struct mdinfo *info, int vers);
2904b26f 388extern int sysfs_add_disk(struct mdinfo *sra, struct mdinfo *sd, int resume);
f1665f72 389extern int sysfs_disk_to_scsi_id(int fd, __u32 *id);
f94d52f4 390extern int sysfs_unique_holder(int devnum, long rdev);
c69b251b 391extern int load_sys(char *path, char *buf);
e86c9dd6
NB
392
393
394extern int save_stripes(int *source, unsigned long long *offsets,
395 int raid_disks, int chunk_size, int level, int layout,
396 int nwrites, int *dest,
a6288483
N
397 unsigned long long start, unsigned long long length,
398 char *buf);
353632d9
NB
399extern int restore_stripes(int *dest, unsigned long long *offsets,
400 int raid_disks, int chunk_size, int level, int layout,
401 int source, unsigned long long read_offset,
402 unsigned long long start, unsigned long long length);
e86c9dd6 403
52826846
NB
404#ifndef Sendmail
405#define Sendmail "/usr/lib/sendmail -t"
406#endif
407
773135f5
NB
408#define SYSLOG_FACILITY LOG_DAEMON
409
682c7051
NB
410extern char *map_num(mapping_t *map, int num);
411extern int map_name(mapping_t *map, char *name);
b640a252 412extern mapping_t r5layout[], r6layout[], pers[], modes[], faultylayout[];
682c7051 413
16c6fa80 414extern char *map_dev(int major, int minor, int create);
64c4757e 415
549e9569 416struct active_array;
2e735d19 417struct metadata_update;
64c4757e 418
6adfd3af
NB
419/* A superswitch provides entry point the a metadata handler.
420 *
421 * The super_switch primarily operates on some "metadata" that
422 * is accessed via the 'supertype'.
423 * This metadata has one of three possible sources.
424 * 1/ It is read from a single device. In this case it may not completely
425 * describe the array or arrays as some information might be on other
426 * devices.
427 * 2/ It is read from all devices in a container. In this case all
428 * information is present.
429 * 3/ It is created by ->init_super / ->add_to_super. In this case it will
430 * be complete once enough ->add_to_super calls have completed.
431 *
432 * When creating an array inside a container, the metadata will be
433 * formed by a combination of 2 and 3. The metadata or the array is read,
434 * then new information is added.
435 *
436 * The metadata must sometimes have a concept of a 'current' array
437 * and a 'current' device.
438 * The 'current' array is set by init_super to be the newly created array,
439 * or is set by super_by_fd when it finds it is looking at an array inside
440 * a container.
441 *
442 * The 'current' device is either the device that the metadata was read from
443 * in case 1, or the last device added by add_to_super in case 3.
444 * Case 2 does not identify a 'current' device.
445 */
f9ce90ba 446extern struct superswitch {
6adfd3af
NB
447
448 /* Used to report details of metadata read from a component
449 * device. ->load_super has been called.
450 */
3da92f27 451 void (*examine_super)(struct supertype *st, char *homehost);
061f2c6a 452 void (*brief_examine_super)(struct supertype *st, int verbose);
4737ae25 453 void (*brief_examine_subarrays)(struct supertype *st, int verbose);
0d726f17 454 void (*export_examine_super)(struct supertype *st);
6adfd3af
NB
455
456 /* Used to report details of an active array.
457 * ->load_super was possibly given a 'component' string.
458 */
3da92f27 459 void (*detail_super)(struct supertype *st, char *homehost);
3da92f27 460 void (*brief_detail_super)(struct supertype *st);
0d726f17 461 void (*export_detail_super)(struct supertype *st);
6adfd3af 462
4cce4069 463 /* Optional: platform hardware / firmware details */
5615172f 464 int (*detail_platform)(int verbose, int enumerate_only);
4cce4069 465
6adfd3af
NB
466 /* Used:
467 * to get uuid to storing in bitmap metadata
468 * and 'reshape' backup-data metadata
469 * To see if a device is being re-added to an array it was part of.
470 */
3da92f27 471 void (*uuid_from_super)(struct supertype *st, int uuid[4]);
6adfd3af 472
8592f29d 473 /* Extract generic details from metadata. This could be details about
6adfd3af
NB
474 * the container, or about an individual array within the container.
475 * The determination is made either by:
476 * load_super being given a 'component' string.
477 * validate_geometry determining what to create.
d2ca6449
NB
478 * The info includes both array information and device information.
479 * The particular device should be:
480 * The last device added by add_to_super
481 * The device the metadata was loaded from by load_super
6adfd3af 482 */
3da92f27 483 void (*getinfo_super)(struct supertype *st, struct mdinfo *info);
6adfd3af
NB
484
485 /* Check if the given metadata is flagged as belonging to "this"
9362c1c8 486 * host. 0 for 'no', 1 for 'yes', -1 for "Don't record homehost"
6adfd3af 487 */
3da92f27 488 int (*match_home)(struct supertype *st, char *homehost);
6adfd3af
NB
489
490 /* Make one of several generic modifications to metadata
491 * prior to assembly (or other times).
492 * sparc2.2 - first bug in early 0.90 metadata
493 * super-minor - change name of 0.90 metadata
494 * summaries - 'correct' any redundant data
495 * resync - mark array as dirty to trigger a resync.
496 * uuid - set new uuid - only 0.90 or 1.x
497 * name - change the name of the array (where supported)
498 * homehost - change which host this array is tied to.
499 * devicesize - If metadata is at start of device, change recorded
500 * device size to match actual device size
501 * byteorder - swap bytes for 0.90 metadata
502 *
503 * force-one - mark that device as uptodate, not old or failed.
504 * force-array - mark array as clean if it would not otherwise
505 * assemble
506 * assemble - not sure how this is different from force-one...
507 * linear-grow-new - add a new device to a linear array, but don't
508 * change the size: so superblock still matches
509 * linear-grow-update - now change the size of the array.
510 */
68c7d6d7 511 int (*update_super)(struct supertype *st, struct mdinfo *info,
3da92f27 512 char *update,
e5eac01f
NB
513 char *devname, int verbose,
514 int uuid_set, char *homehost);
6adfd3af
NB
515
516 /* Create new metadata for new array as described. This could
517 * be a new container, or an array in a pre-existing container.
518 * Also used to zero metadata prior to writing it to invalidate old
519 * metadata.
520 */
3da92f27
NB
521 int (*init_super)(struct supertype *st, mdu_array_info_t *info,
522 unsigned long long size, char *name,
523 char *homehost, int *uuid);
6adfd3af
NB
524
525 /* update the metadata to include new device, either at create or
526 * when hot-adding a spare.
527 */
f20c3968 528 int (*add_to_super)(struct supertype *st, mdu_disk_info_t *dinfo,
111d01fc 529 int fd, char *devname);
6adfd3af
NB
530
531 /* Write metadata to one device when fixing problems or adding
532 * a new device.
533 */
3da92f27 534 int (*store_super)(struct supertype *st, int fd);
6adfd3af
NB
535
536 /* Write all metadata for this array.
537 */
111d01fc 538 int (*write_init_super)(struct supertype *st);
64557c33 539 int (*compare_super)(struct supertype *st, struct supertype *tst);
3da92f27 540 int (*load_super)(struct supertype *st, int fd, char *devname);
82d9eba6 541 struct supertype * (*match_metadata_desc)(char *arg);
1bf4e2d9 542 __u64 (*avail_size)(struct supertype *st, __u64 size);
3da92f27 543 int (*add_internal_bitmap)(struct supertype *st, int *chunkp,
199171a2 544 int delay, int write_behind,
f9c25f1d 545 unsigned long long size, int may_change, int major);
3da92f27
NB
546 void (*locate_bitmap)(struct supertype *st, int fd);
547 int (*write_bitmap)(struct supertype *st, int fd);
548 void (*free_super)(struct supertype *st);
78e44928
NB
549
550 /* validate_geometry is called with an st returned by
551 * match_metadata_desc.
552 * It should check that the geometry described in compatible with
553 * the metadata type. It will be called repeatedly as devices
554 * added to validate changing size and new devices. If there are
555 * inter-device dependencies, it should record sufficient details
556 * so these can be validated.
e46273eb 557 * Both 'size' and '*freesize' are in sectors. chunk is bytes.
78e44928 558 */
17f25ca6
NB
559 int (*validate_geometry)(struct supertype *st, int level, int layout,
560 int raiddisks,
561 int chunk, unsigned long long size,
2c514b71
NB
562 char *subdev, unsigned long long *freesize,
563 int verbose);
598f0d58
NB
564
565 struct mdinfo *(*container_content)(struct supertype *st);
a18a888e
DW
566 /* Allow a metadata handler to override mdadm's default layouts */
567 int (*default_layout)(int level); /* optional */
598f0d58 568
549e9569 569/* for mdmon */
cba0191b
NB
570 int (*open_new)(struct supertype *c, struct active_array *a,
571 char *inst);
ed9d66aa
NB
572
573 /* Tell the metadata handler the current state of the array.
574 * This covers whether it is known to be consistent (no pending writes)
01f157d7 575 * and how far along a resync is known to have progressed
ed9d66aa
NB
576 * (in a->resync_start).
577 * resync status is really irrelevant if the array is not consistent,
578 * but some metadata (DDF!) have a place to record the distinction.
01f157d7
N
579 * If 'consistent' is '2', then the array can mark it dirty if a
580 * resync/recovery/whatever is required, or leave it clean if not.
581 * Return value is 0 dirty (not consistent) and 1 if clean.
582 * it is only really important if consistent is passed in as '2'.
4e5528c6 583 */
01f157d7 584 int (*set_array_state)(struct active_array *a, int consistent);
7a7cc504
NB
585
586 /* When the state of a device might have changed, we call set_disk to
587 * tell the metadata what the current state is.
588 * Typically this happens on spare->in_sync and (spare|in_sync)->faulty
589 * transitions.
590 * set_disk might be called when the state of the particular disk has
591 * not in fact changed.
592 */
8d45d196 593 void (*set_disk)(struct active_array *a, int n, int state);
2e735d19
NB
594 void (*sync_metadata)(struct supertype *st);
595 void (*process_update)(struct supertype *st,
596 struct metadata_update *update);
edd8d13c
NB
597 void (*prepare_update)(struct supertype *st,
598 struct metadata_update *update);
549e9569 599
6c3fb95c
NB
600 /* activate_spare will check if the array is degraded and, if it
601 * is, try to find some spare space in the container.
602 * On success, it add appropriate updates (For process_update) to
603 * to the 'updates' list and returns a list of 'mdinfo' identifying
604 * the device, or devices as there might be multiple missing
605 * devices and multiple spares available.
606 */
607 struct mdinfo *(*activate_spare)(struct active_array *a,
608 struct metadata_update **updates);
549e9569 609
f277ce36 610 int swapuuid; /* true if uuid is bigending rather than hostendian */
d03373f1 611 int external;
4cce4069 612 const char *name; /* canonical metadata name */
0063ecba 613} super0, super1, super_ddf, *superlist[];
82d9eba6 614
0063ecba 615extern struct superswitch super_imsm;
cdddbdbc 616
edd8d13c
NB
617struct metadata_update {
618 int len;
619 char *buf;
620 void *space; /* allocated space that monitor will use */
621 struct metadata_update *next;
622};
623
6adfd3af
NB
624/* A supertype holds a particular collection of metadata.
625 * It identifies the metadata type by the superswitch, and the particular
626 * sub-version of that metadata type.
627 * metadata read in or created is stored in 'sb' and 'info'.
628 * There are also fields used by mdmon to track containers.
629 *
352452c3
N
630 * A supertype may refer to:
631 * Just an array, possibly in a container
632 * A container, not identifying any particular array
633 * Info read from just one device, not yet fully describing the array/container.
634 *
635 *
6adfd3af
NB
636 * A supertype is created by:
637 * super_by_fd
638 * guess_super
639 * dup_super
640 */
82d9eba6
NB
641struct supertype {
642 struct superswitch *ss;
643 int minor_version;
ea329559 644 int max_devs;
2f6079dc 645 int container_dev; /* devnum of container */
f7e7067b 646 char subarray[32]; /* name of array inside container */
64557c33 647 void *sb;
111d01fc 648 void *info;
352452c3
N
649 int loaded_container; /* Set if load_super found a container,
650 * not just one device */
549e9569 651
edd8d13c
NB
652 struct metadata_update *updates;
653 struct metadata_update **update_tail;
654
549e9569
NB
655 /* extra stuff used by mdmon */
656 struct active_array *arrays;
549e9569 657 int sock; /* listen to external programs */
549e9569
NB
658 int devnum;
659 char *devname; /* e.g. md0. This appears in metadata_verison:
660 * external:/md0/12
661 */
662 int devcnt;
663
664 struct mdinfo *devs;
665
82d9eba6 666};
f9ce90ba 667
1686dc25 668extern struct supertype *super_by_fd(int fd);
82d9eba6 669extern struct supertype *guess_super(int fd);
3da92f27 670extern struct supertype *dup_super(struct supertype *st);
beae1dfe 671extern int get_dev_size(int fd, char *dname, unsigned long long *sizep);
8382f19b
NB
672extern void get_one_disk(int mdfd, mdu_array_info_t *ainf,
673 mdu_disk_info_t *disk);
a7c6e3fb 674void wait_for(char *dev, int fd);
f9ce90ba 675
838acbc2
NB
676#if __GNUC__ < 3
677struct stat64;
678#endif
679
45e878bb
NB
680#define HAVE_NFTW we assume
681#define HAVE_FTW
682
2df1f269 683#ifdef __UCLIBC__
45e878bb 684# include <features.h>
2df1f269
BRF
685# ifndef __UCLIBC_HAS_LFS__
686# define lseek64 lseek
687# endif
45e878bb
NB
688# ifndef __UCLIBC_HAS_FTW__
689# undef HAVE_FTW
690# undef HAVE_NFTW
691# endif
692#endif
693
694#ifdef __dietlibc__
695# undef HAVE_NFTW
696#endif
697
e39b673e 698#if defined(__KLIBC__)
699# undef HAVE_NFTW
700# undef HAVE_FTW
701#endif
702
45e878bb 703#ifndef HAVE_NFTW
173fc515 704# define FTW_PHYS 1
45e878bb
NB
705# ifndef HAVE_FTW
706 struct FTW {};
173fc515
NB
707# endif
708#endif
709
45e878bb
NB
710#ifdef HAVE_FTW
711# include <ftw.h>
712#endif
713
173fc515
NB
714extern int add_dev(const char *name, const struct stat *stb, int flag, struct FTW *s);
715
f9ce90ba 716
64c4757e 717extern int Manage_ro(char *devname, int fd, int readonly);
91f068bf 718extern int Manage_runstop(char *devname, int fd, int runstop, int quiet);
dd0781e5 719extern int Manage_resize(char *devname, int fd, long long size, int raid_disks);
64c4757e 720extern int Manage_subdevs(char *devname, int fd,
dab6685f 721 mddev_dev_t devlist, int verbose);
1f48664b 722extern int autodetect(void);
e5329c37 723extern int Grow_Add_device(char *devname, int fd, char *newdev);
8fac0577 724extern int Grow_addbitmap(char *devname, int fd, char *file, int chunk, int delay, int write_behind, int force);
06b0d786 725extern int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
e86c9dd6 726 long long size,
19678e53 727 int level, char *layout_str, int chunksize, int raid_disks);
06b0d786 728extern int Grow_restart(struct supertype *st, struct mdinfo *info,
ea0ebe96 729 int *fdlist, int cnt, char *backup_file, int verbose);
e9e43ec3
N
730extern int Grow_continue(int mdfd, struct supertype *st,
731 struct mdinfo *info, char *backup_file);
64c4757e 732
7f91af49 733extern int Assemble(struct supertype *st, char *mddev,
52826846 734 mddev_ident_t ident,
06b0d786 735 mddev_dev_t devlist, char *backup_file,
64c4757e 736 int readonly, int runstop,
0ac91628 737 char *update, char *homehost, int require_homehost,
64c4757e
NB
738 int verbose, int force);
739
7f91af49
N
740extern int Build(char *mddev, int chunk, int level, int layout,
741 int raiddisks, mddev_dev_t devlist, int assume_clean,
742 char *bitmap_file, int bitmap_chunk, int write_behind,
83208785 743 int delay, int verbose, int autof, unsigned long long size);
64c4757e
NB
744
745
7f91af49 746extern int Create(struct supertype *st, char *mddev,
5dd497ee 747 int chunk, int level, int layout, unsigned long long size, int raiddisks, int sparedisks,
3d3dd91e 748 char *name, char *homehost, int *uuid,
cd29a5c8 749 int subdevs, mddev_dev_t devlist,
47d79ef8 750 int runstop, int verbose, int force, int assume_clean,
7f91af49 751 char *bitmap_file, int bitmap_chunk, int write_behind, int delay, int autof);
64c4757e 752
54bad364 753extern int Detail(char *dev, int brief, int export, int test, char *homehost);
4cce4069 754extern int Detail_Platform(struct superswitch *ss, int scan, int verbose);
e0d19036 755extern int Query(char *dev);
0d726f17
KS
756extern int Examine(mddev_dev_t devlist, int brief, int export, int scan,
757 int SparcAdjust, struct supertype *forcest, char *homehost);
cd29a5c8 758extern int Monitor(mddev_dev_t devlist,
e0d19036 759 char *mailaddr, char *alert_cmd,
aa88f531 760 int period, int daemonise, int scan, int oneshot,
9a36a9b7 761 int dosyslog, int test, char *pidfile, int increments);
64c4757e 762
9277cc77 763extern int Kill(char *dev, struct supertype *st, int force, int quiet, int noexcl);
b90c0e9a 764extern int Wait(char *dev);
9f1da824 765extern int WaitClean(char *dev, int sock, int verbose);
9a9dab36 766
8382f19b 767extern int Incremental(char *devname, int verbose, int runstop,
0ac91628
N
768 struct supertype *st, char *homehost, int require_homehost,
769 int autof);
598f0d58 770extern int Incremental_container(struct supertype *st, char *devname,
215bb3f7
N
771 int verbose, int runstop, int autof,
772 int trustworthy);
8382f19b
NB
773extern void RebuildMap(void);
774extern int IncrementalScan(int verbose);
775
c82f047c
NB
776extern int CreateBitmap(char *filename, int force, char uuid[16],
777 unsigned long chunksize, unsigned long daemon_sleep,
dfd4d8ee 778 unsigned long write_behind,
dcec9ee5
NB
779 unsigned long long array_size,
780 int major);
55935d51 781extern int ExamineBitmap(char *filename, int brief, struct supertype *st);
bf4fb153 782extern int bitmap_update_uuid(int fd, int *uuid, int swap);
2a528478 783extern unsigned long bitmap_sectors(struct bitmap_super_s *bsb);
c82f047c 784
64c4757e 785extern int md_get_version(int fd);
e0d19036 786extern int get_linux_version(void);
84e11361 787extern long long parse_size(char *size);
64c4757e 788extern int parse_uuid(char *str, int uuid[4]);
4a06e2c2
N
789extern int parse_layout_10(char *layout);
790extern int parse_layout_faulty(char *layout);
682c7051
NB
791extern int check_ext2(int fd, char *name);
792extern int check_reiser(int fd, char *name);
793extern int check_raid(int fd, char *name);
64c4757e 794
dd0781e5 795extern int get_mdp_major(void);
8b0dabea 796extern int dev_open(char *dev, int flags);
e8a70c89 797extern int open_dev(int devnum);
a931db9e 798extern int open_dev_excl(int devnum);
8d80900b 799extern int is_standard(char *dev, int *nump);
9008ed1c 800extern int same_dev(char *one, char *two);
dd0781e5 801
f1ae21c4 802extern int parse_auto(char *str, char *msg, int config);
8aec876d
NB
803extern mddev_ident_t conf_get_ident(char *dev);
804extern mddev_dev_t conf_get_devs(void);
8382f19b 805extern int conf_test_dev(char *devname);
31015d57 806extern int conf_test_metadata(const char *version);
8aec876d
NB
807extern struct createinfo *conf_get_create_info(void);
808extern void set_conffile(char *file);
809extern char *conf_get_mailaddr(void);
810extern char *conf_get_mailfrom(void);
811extern char *conf_get_program(void);
0ac91628 812extern char *conf_get_homehost(int *require_homehostp);
e0d19036 813extern char *conf_line(FILE *file);
98c6faba 814extern char *conf_word(FILE *file, int allow_key);
0ac91628
N
815extern int conf_name_is_free(char *name);
816extern int devname_matches(char *name, char *match);
360b4636 817extern struct mddev_ident_s *conf_match(struct mdinfo *info, struct supertype *st);
0ac91628 818
e0d19036
NB
819extern void free_line(char *line);
820extern int match_oneof(char *devices, char *devname);
e0d19036 821extern void uuid_from_super(int uuid[4], mdp_super_t *super);
36ba7d48 822extern const int uuid_match_any[4];
f277ce36 823extern int same_uuid(int a[4], int b[4], int swapuuid);
350f29f9 824extern void copy_uuid(void *a, int b[4], int swapuuid);
aae5a112 825extern char *__fname_from_uuid(int id[4], int swap, char *buf, char sep);
d7288ddc 826extern char *fname_from_uuid(struct supertype *st,
ff54de6e 827 struct mdinfo *info, char *buf, char sep);
4b1ac34b 828extern unsigned long calc_csum(void *super, int bytes);
583315d9 829extern int enough(int level, int raid_disks, int layout, int clean,
265e0f17 830 char *avail, int avail_disks);
e0d19036 831extern int ask(char *mesg);
8fac0577 832extern unsigned long long get_component_size(int fd);
0430ed48 833extern void remove_partitions(int fd);
5f8097be
NB
834extern unsigned long long calc_array_size(int level, int raid_disks, int layout,
835 int chunksize, unsigned long long devsize);
edd8d13c
NB
836extern int flush_metadata_updates(struct supertype *st);
837extern void append_metadata_update(struct supertype *st, void *buf, int len);
6234c63c
DW
838extern int assemble_container_content(struct supertype *st, int mdfd,
839 struct mdinfo *content, int runstop,
840 char *chosen_name, int verbose);
e0d19036 841
7801ac20
N
842extern int add_disk(int mdfd, struct supertype *st,
843 struct mdinfo *sra, struct mdinfo *info);
f35f2525 844extern int set_array_info(int mdfd, struct supertype *st, struct mdinfo *info);
cd29a5c8 845
56eb10c0 846extern char *human_size(long long bytes);
e4965ef8
N
847extern char *human_size_brief(long long bytes);
848extern void print_r10_layout(int layout);
e0d19036 849
63152c1b
NB
850#define NoMdDev (1<<23)
851extern int find_free_devnum(int use_partitions);
852
e0d19036
NB
853extern void put_md_name(char *name);
854extern char *get_md_name(int dev);
855
c913b90e 856extern char DefaultConfFile[];
b5e64645 857
69207ff6
N
858extern int create_mddev(char *dev, char *name, int autof, int trustworthy,
859 char *chosen);
860/* values for 'trustworthy' */
861#define LOCAL 1
862#define FOREIGN 2
863#define METADATA 3
6be1d39d 864extern int open_mddev(char *dev, int report_errors);
a322f70c 865extern int open_container(int fd);
b5e64645 866
a931db9e
NB
867extern int mdmon_running(int devnum);
868extern int signal_mdmon(int devnum);
40ebbb9c 869extern int check_env(char *name);
148acb7b 870extern __u32 random32(void);
8850ee3e 871extern int start_mdmon(int devnum);
a931db9e 872
2f6079dc 873extern char *devnum2devname(int num);
77472ff8 874extern int devname2devnum(char *name);
c94709e8 875extern int stat2devnum(struct stat *st);
2f6079dc 876extern int fd2devnum(int fd);
b5e64645 877
a931db9e
NB
878static inline int dev2major(int d)
879{
880 if (d >= 0)
881 return MD_MAJOR;
882 else
883 return get_mdp_major();
884}
885
886static inline int dev2minor(int d)
887{
888 if (d >= 0)
889 return d;
890 return (-1-d) << MdpMinorShift;
891}
892
6416d527
NB
893static inline int ROUND_UP(int a, int base)
894{
895 return ((a+base-1)/base)*base;
896}
897
3c558363
N
898static inline int is_subarray(char *vers)
899{
e9dd1598
N
900 /* The version string for a 'subarray' (an array in a container)
901 * is
902 * /containername/componentname for normal read-write arrays
903 * -containername/componentname for read-only arrays.
904 * containername is e.g. md0, md_d1
905 * componentname is dependant on the metadata. e.g. '1' 'S1' ...
906 */
907 return (*vers == '/' || *vers == '-');
3c558363
N
908}
909
2a24d7b6
DW
910#ifdef DEBUG
911#define dprintf(fmt, arg...) \
912 fprintf(stderr, fmt, ##arg)
913#else
914#define dprintf(fmt, arg...) \
915 ({ if (0) fprintf(stderr, fmt, ##arg); 0; })
916#endif
1a0ee0ba
DK
917#include <assert.h>
918#include <stdarg.h>
919static inline int xasprintf(char **strp, const char *fmt, ...) {
920 va_list ap;
921 int ret;
922 va_start(ap, fmt);
089485cb 923 ret = vasprintf(strp, fmt, ap);
1a0ee0ba
DK
924 va_end(ap);
925 assert(ret >= 0);
926 return ret;
927}
2a24d7b6 928
b5e64645
NB
929#define LEVEL_MULTIPATH (-4)
930#define LEVEL_LINEAR (-1)
931#define LEVEL_FAULTY (-5)
932
17f25ca6
NB
933/* kernel module doesn't know about these */
934#define LEVEL_CONTAINER (-100)
a322f70c 935#define LEVEL_UNSUPPORTED (-200)
17f25ca6 936
b5e64645
NB
937
938/* faulty stuff */
939
940#define WriteTransient 0
941#define ReadTransient 1
942#define WritePersistent 2
943#define ReadPersistent 3
944#define WriteAll 4 /* doesn't go to device */
945#define ReadFixable 5
946#define Modes 6
947
948#define ClearErrors 31
949#define ClearFaults 30
950
951#define AllPersist 100 /* internal use only */
952#define NoPersist 101
953
954#define ModeMask 0x1f
955#define ModeShift 5
fe6729fa
NB
956
957
958#ifdef __TINYC__
959#undef minor
960#undef major
961#undef makedev
962#define minor(x) ((x)&0xff)
963#define major(x) (((x)>>8)&0xff)
964#define makedev(M,m) (((M)<<8) | (m))
965#endif
966
b640a252 967/* for raid4/5/6 */
e86c9dd6
NB
968#define ALGORITHM_LEFT_ASYMMETRIC 0
969#define ALGORITHM_RIGHT_ASYMMETRIC 1
970#define ALGORITHM_LEFT_SYMMETRIC 2
971#define ALGORITHM_RIGHT_SYMMETRIC 3
b640a252
N
972
973/* Define non-rotating (raid4) algorithms. These allow
974 * conversion of raid4 to raid5.
975 */
976#define ALGORITHM_PARITY_0 4 /* P or P,Q are initial devices */
977#define ALGORITHM_PARITY_N 5 /* P or P,Q are final devices. */
978
979/* DDF RAID6 layouts differ from md/raid6 layouts in two ways.
980 * Firstly, the exact positioning of the parity block is slightly
981 * different between the 'LEFT_*' modes of md and the "_N_*" modes
982 * of DDF.
983 * Secondly, or order of datablocks over which the Q syndrome is computed
984 * is different.
985 * Consequently we have different layouts for DDF/raid6 than md/raid6.
986 * These layouts are from the DDFv1.2 spec.
987 * Interestingly DDFv1.2-Errata-A does not specify N_CONTINUE but
988 * leaves RLQ=3 as 'Vendor Specific'
989 */
990
991#define ALGORITHM_ROTATING_ZERO_RESTART 8 /* DDF PRL=6 RLQ=1 */
992#define ALGORITHM_ROTATING_N_RESTART 9 /* DDF PRL=6 RLQ=2 */
993#define ALGORITHM_ROTATING_N_CONTINUE 10 /*DDF PRL=6 RLQ=3 */
994
995
996/* For every RAID5 algorithm we define a RAID6 algorithm
997 * with exactly the same layout for data and parity, and
998 * with the Q block always on the last device (N-1).
999 * This allows trivial conversion from RAID5 to RAID6
1000 */
1001#define ALGORITHM_LEFT_ASYMMETRIC_6 16
1002#define ALGORITHM_RIGHT_ASYMMETRIC_6 17
1003#define ALGORITHM_LEFT_SYMMETRIC_6 18
1004#define ALGORITHM_RIGHT_SYMMETRIC_6 19
1005#define ALGORITHM_PARITY_0_6 20
1006#define ALGORITHM_PARITY_N_6 ALGORITHM_PARITY_N
1007