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