]> git.ipfire.org Git - thirdparty/mdadm.git/blame - mdadm.h
Introduce MaxSector
[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);
462906cd
N
388extern int sysfs_add_disk(struct mdinfo *sra, struct mdinfo *sd,
389 int in_sync);
f1665f72 390extern int sysfs_disk_to_scsi_id(int fd, __u32 *id);
f94d52f4 391extern int sysfs_unique_holder(int devnum, long rdev);
c69b251b 392extern int load_sys(char *path, char *buf);
e86c9dd6
NB
393
394
395extern int save_stripes(int *source, unsigned long long *offsets,
396 int raid_disks, int chunk_size, int level, int layout,
397 int nwrites, int *dest,
a6288483
N
398 unsigned long long start, unsigned long long length,
399 char *buf);
353632d9
NB
400extern int restore_stripes(int *dest, unsigned long long *offsets,
401 int raid_disks, int chunk_size, int level, int layout,
402 int source, unsigned long long read_offset,
403 unsigned long long start, unsigned long long length);
e86c9dd6 404
52826846
NB
405#ifndef Sendmail
406#define Sendmail "/usr/lib/sendmail -t"
407#endif
408
773135f5
NB
409#define SYSLOG_FACILITY LOG_DAEMON
410
682c7051
NB
411extern char *map_num(mapping_t *map, int num);
412extern int map_name(mapping_t *map, char *name);
b640a252 413extern mapping_t r5layout[], r6layout[], pers[], modes[], faultylayout[];
682c7051 414
16c6fa80 415extern char *map_dev(int major, int minor, int create);
64c4757e 416
549e9569 417struct active_array;
2e735d19 418struct metadata_update;
64c4757e 419
6adfd3af
NB
420/* A superswitch provides entry point the a metadata handler.
421 *
422 * The super_switch primarily operates on some "metadata" that
423 * is accessed via the 'supertype'.
424 * This metadata has one of three possible sources.
425 * 1/ It is read from a single device. In this case it may not completely
426 * describe the array or arrays as some information might be on other
427 * devices.
428 * 2/ It is read from all devices in a container. In this case all
429 * information is present.
430 * 3/ It is created by ->init_super / ->add_to_super. In this case it will
431 * be complete once enough ->add_to_super calls have completed.
432 *
433 * When creating an array inside a container, the metadata will be
434 * formed by a combination of 2 and 3. The metadata or the array is read,
435 * then new information is added.
436 *
437 * The metadata must sometimes have a concept of a 'current' array
438 * and a 'current' device.
439 * The 'current' array is set by init_super to be the newly created array,
440 * or is set by super_by_fd when it finds it is looking at an array inside
441 * a container.
442 *
443 * The 'current' device is either the device that the metadata was read from
444 * in case 1, or the last device added by add_to_super in case 3.
445 * Case 2 does not identify a 'current' device.
446 */
f9ce90ba 447extern struct superswitch {
6adfd3af
NB
448
449 /* Used to report details of metadata read from a component
450 * device. ->load_super has been called.
451 */
3da92f27 452 void (*examine_super)(struct supertype *st, char *homehost);
061f2c6a 453 void (*brief_examine_super)(struct supertype *st, int verbose);
4737ae25 454 void (*brief_examine_subarrays)(struct supertype *st, int verbose);
0d726f17 455 void (*export_examine_super)(struct supertype *st);
6adfd3af
NB
456
457 /* Used to report details of an active array.
458 * ->load_super was possibly given a 'component' string.
459 */
3da92f27 460 void (*detail_super)(struct supertype *st, char *homehost);
3da92f27 461 void (*brief_detail_super)(struct supertype *st);
0d726f17 462 void (*export_detail_super)(struct supertype *st);
6adfd3af 463
4cce4069 464 /* Optional: platform hardware / firmware details */
5615172f 465 int (*detail_platform)(int verbose, int enumerate_only);
4cce4069 466
6adfd3af
NB
467 /* Used:
468 * to get uuid to storing in bitmap metadata
469 * and 'reshape' backup-data metadata
470 * To see if a device is being re-added to an array it was part of.
471 */
3da92f27 472 void (*uuid_from_super)(struct supertype *st, int uuid[4]);
6adfd3af 473
8592f29d 474 /* Extract generic details from metadata. This could be details about
6adfd3af
NB
475 * the container, or about an individual array within the container.
476 * The determination is made either by:
477 * load_super being given a 'component' string.
478 * validate_geometry determining what to create.
d2ca6449
NB
479 * The info includes both array information and device information.
480 * The particular device should be:
481 * The last device added by add_to_super
482 * The device the metadata was loaded from by load_super
6adfd3af 483 */
3da92f27 484 void (*getinfo_super)(struct supertype *st, struct mdinfo *info);
6adfd3af
NB
485
486 /* Check if the given metadata is flagged as belonging to "this"
9362c1c8 487 * host. 0 for 'no', 1 for 'yes', -1 for "Don't record homehost"
6adfd3af 488 */
3da92f27 489 int (*match_home)(struct supertype *st, char *homehost);
6adfd3af
NB
490
491 /* Make one of several generic modifications to metadata
492 * prior to assembly (or other times).
493 * sparc2.2 - first bug in early 0.90 metadata
494 * super-minor - change name of 0.90 metadata
495 * summaries - 'correct' any redundant data
496 * resync - mark array as dirty to trigger a resync.
497 * uuid - set new uuid - only 0.90 or 1.x
498 * name - change the name of the array (where supported)
499 * homehost - change which host this array is tied to.
500 * devicesize - If metadata is at start of device, change recorded
501 * device size to match actual device size
502 * byteorder - swap bytes for 0.90 metadata
503 *
504 * force-one - mark that device as uptodate, not old or failed.
505 * force-array - mark array as clean if it would not otherwise
506 * assemble
507 * assemble - not sure how this is different from force-one...
508 * linear-grow-new - add a new device to a linear array, but don't
509 * change the size: so superblock still matches
510 * linear-grow-update - now change the size of the array.
511 */
68c7d6d7 512 int (*update_super)(struct supertype *st, struct mdinfo *info,
3da92f27 513 char *update,
e5eac01f
NB
514 char *devname, int verbose,
515 int uuid_set, char *homehost);
6adfd3af
NB
516
517 /* Create new metadata for new array as described. This could
518 * be a new container, or an array in a pre-existing container.
519 * Also used to zero metadata prior to writing it to invalidate old
520 * metadata.
521 */
3da92f27
NB
522 int (*init_super)(struct supertype *st, mdu_array_info_t *info,
523 unsigned long long size, char *name,
524 char *homehost, int *uuid);
6adfd3af
NB
525
526 /* update the metadata to include new device, either at create or
527 * when hot-adding a spare.
528 */
f20c3968 529 int (*add_to_super)(struct supertype *st, mdu_disk_info_t *dinfo,
111d01fc 530 int fd, char *devname);
6adfd3af
NB
531
532 /* Write metadata to one device when fixing problems or adding
533 * a new device.
534 */
3da92f27 535 int (*store_super)(struct supertype *st, int fd);
6adfd3af
NB
536
537 /* Write all metadata for this array.
538 */
111d01fc 539 int (*write_init_super)(struct supertype *st);
64557c33 540 int (*compare_super)(struct supertype *st, struct supertype *tst);
3da92f27 541 int (*load_super)(struct supertype *st, int fd, char *devname);
82d9eba6 542 struct supertype * (*match_metadata_desc)(char *arg);
1bf4e2d9 543 __u64 (*avail_size)(struct supertype *st, __u64 size);
3da92f27 544 int (*add_internal_bitmap)(struct supertype *st, int *chunkp,
199171a2 545 int delay, int write_behind,
f9c25f1d 546 unsigned long long size, int may_change, int major);
3da92f27
NB
547 void (*locate_bitmap)(struct supertype *st, int fd);
548 int (*write_bitmap)(struct supertype *st, int fd);
549 void (*free_super)(struct supertype *st);
78e44928
NB
550
551 /* validate_geometry is called with an st returned by
552 * match_metadata_desc.
553 * It should check that the geometry described in compatible with
554 * the metadata type. It will be called repeatedly as devices
555 * added to validate changing size and new devices. If there are
556 * inter-device dependencies, it should record sufficient details
557 * so these can be validated.
e46273eb 558 * Both 'size' and '*freesize' are in sectors. chunk is bytes.
78e44928 559 */
17f25ca6
NB
560 int (*validate_geometry)(struct supertype *st, int level, int layout,
561 int raiddisks,
562 int chunk, unsigned long long size,
2c514b71
NB
563 char *subdev, unsigned long long *freesize,
564 int verbose);
598f0d58
NB
565
566 struct mdinfo *(*container_content)(struct supertype *st);
a18a888e
DW
567 /* Allow a metadata handler to override mdadm's default layouts */
568 int (*default_layout)(int level); /* optional */
598f0d58 569
549e9569 570/* for mdmon */
cba0191b
NB
571 int (*open_new)(struct supertype *c, struct active_array *a,
572 char *inst);
ed9d66aa
NB
573
574 /* Tell the metadata handler the current state of the array.
575 * This covers whether it is known to be consistent (no pending writes)
01f157d7 576 * and how far along a resync is known to have progressed
ed9d66aa
NB
577 * (in a->resync_start).
578 * resync status is really irrelevant if the array is not consistent,
579 * but some metadata (DDF!) have a place to record the distinction.
01f157d7
N
580 * If 'consistent' is '2', then the array can mark it dirty if a
581 * resync/recovery/whatever is required, or leave it clean if not.
582 * Return value is 0 dirty (not consistent) and 1 if clean.
583 * it is only really important if consistent is passed in as '2'.
4e5528c6 584 */
01f157d7 585 int (*set_array_state)(struct active_array *a, int consistent);
7a7cc504
NB
586
587 /* When the state of a device might have changed, we call set_disk to
588 * tell the metadata what the current state is.
589 * Typically this happens on spare->in_sync and (spare|in_sync)->faulty
590 * transitions.
591 * set_disk might be called when the state of the particular disk has
592 * not in fact changed.
593 */
8d45d196 594 void (*set_disk)(struct active_array *a, int n, int state);
2e735d19
NB
595 void (*sync_metadata)(struct supertype *st);
596 void (*process_update)(struct supertype *st,
597 struct metadata_update *update);
edd8d13c
NB
598 void (*prepare_update)(struct supertype *st,
599 struct metadata_update *update);
549e9569 600
6c3fb95c
NB
601 /* activate_spare will check if the array is degraded and, if it
602 * is, try to find some spare space in the container.
603 * On success, it add appropriate updates (For process_update) to
604 * to the 'updates' list and returns a list of 'mdinfo' identifying
605 * the device, or devices as there might be multiple missing
606 * devices and multiple spares available.
607 */
608 struct mdinfo *(*activate_spare)(struct active_array *a,
609 struct metadata_update **updates);
549e9569 610
f277ce36 611 int swapuuid; /* true if uuid is bigending rather than hostendian */
d03373f1 612 int external;
4cce4069 613 const char *name; /* canonical metadata name */
0063ecba 614} super0, super1, super_ddf, *superlist[];
82d9eba6 615
0063ecba 616extern struct superswitch super_imsm;
cdddbdbc 617
edd8d13c
NB
618struct metadata_update {
619 int len;
620 char *buf;
621 void *space; /* allocated space that monitor will use */
622 struct metadata_update *next;
623};
624
6adfd3af
NB
625/* A supertype holds a particular collection of metadata.
626 * It identifies the metadata type by the superswitch, and the particular
627 * sub-version of that metadata type.
628 * metadata read in or created is stored in 'sb' and 'info'.
629 * There are also fields used by mdmon to track containers.
630 *
352452c3
N
631 * A supertype may refer to:
632 * Just an array, possibly in a container
633 * A container, not identifying any particular array
634 * Info read from just one device, not yet fully describing the array/container.
635 *
636 *
6adfd3af
NB
637 * A supertype is created by:
638 * super_by_fd
639 * guess_super
640 * dup_super
641 */
82d9eba6
NB
642struct supertype {
643 struct superswitch *ss;
644 int minor_version;
ea329559 645 int max_devs;
2f6079dc 646 int container_dev; /* devnum of container */
f7e7067b 647 char subarray[32]; /* name of array inside container */
64557c33 648 void *sb;
111d01fc 649 void *info;
352452c3
N
650 int loaded_container; /* Set if load_super found a container,
651 * not just one device */
549e9569 652
edd8d13c
NB
653 struct metadata_update *updates;
654 struct metadata_update **update_tail;
655
549e9569
NB
656 /* extra stuff used by mdmon */
657 struct active_array *arrays;
549e9569 658 int sock; /* listen to external programs */
549e9569
NB
659 int devnum;
660 char *devname; /* e.g. md0. This appears in metadata_verison:
661 * external:/md0/12
662 */
663 int devcnt;
664
665 struct mdinfo *devs;
666
82d9eba6 667};
f9ce90ba 668
1686dc25 669extern struct supertype *super_by_fd(int fd);
82d9eba6 670extern struct supertype *guess_super(int fd);
3da92f27 671extern struct supertype *dup_super(struct supertype *st);
beae1dfe 672extern int get_dev_size(int fd, char *dname, unsigned long long *sizep);
8382f19b
NB
673extern void get_one_disk(int mdfd, mdu_array_info_t *ainf,
674 mdu_disk_info_t *disk);
a7c6e3fb 675void wait_for(char *dev, int fd);
f9ce90ba 676
838acbc2
NB
677#if __GNUC__ < 3
678struct stat64;
679#endif
680
45e878bb
NB
681#define HAVE_NFTW we assume
682#define HAVE_FTW
683
2df1f269 684#ifdef __UCLIBC__
45e878bb 685# include <features.h>
2df1f269
BRF
686# ifndef __UCLIBC_HAS_LFS__
687# define lseek64 lseek
688# endif
45e878bb
NB
689# ifndef __UCLIBC_HAS_FTW__
690# undef HAVE_FTW
691# undef HAVE_NFTW
692# endif
693#endif
694
695#ifdef __dietlibc__
696# undef HAVE_NFTW
697#endif
698
e39b673e 699#if defined(__KLIBC__)
700# undef HAVE_NFTW
701# undef HAVE_FTW
702#endif
703
45e878bb 704#ifndef HAVE_NFTW
173fc515 705# define FTW_PHYS 1
45e878bb
NB
706# ifndef HAVE_FTW
707 struct FTW {};
173fc515
NB
708# endif
709#endif
710
45e878bb
NB
711#ifdef HAVE_FTW
712# include <ftw.h>
713#endif
714
173fc515
NB
715extern int add_dev(const char *name, const struct stat *stb, int flag, struct FTW *s);
716
f9ce90ba 717
64c4757e 718extern int Manage_ro(char *devname, int fd, int readonly);
91f068bf 719extern int Manage_runstop(char *devname, int fd, int runstop, int quiet);
dd0781e5 720extern int Manage_resize(char *devname, int fd, long long size, int raid_disks);
64c4757e 721extern int Manage_subdevs(char *devname, int fd,
dab6685f 722 mddev_dev_t devlist, int verbose);
1f48664b 723extern int autodetect(void);
e5329c37 724extern int Grow_Add_device(char *devname, int fd, char *newdev);
8fac0577 725extern int Grow_addbitmap(char *devname, int fd, char *file, int chunk, int delay, int write_behind, int force);
06b0d786 726extern int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
e86c9dd6 727 long long size,
19678e53 728 int level, char *layout_str, int chunksize, int raid_disks);
06b0d786 729extern int Grow_restart(struct supertype *st, struct mdinfo *info,
ea0ebe96 730 int *fdlist, int cnt, char *backup_file, int verbose);
e9e43ec3
N
731extern int Grow_continue(int mdfd, struct supertype *st,
732 struct mdinfo *info, char *backup_file);
64c4757e 733
7f91af49 734extern int Assemble(struct supertype *st, char *mddev,
52826846 735 mddev_ident_t ident,
06b0d786 736 mddev_dev_t devlist, char *backup_file,
64c4757e 737 int readonly, int runstop,
0ac91628 738 char *update, char *homehost, int require_homehost,
64c4757e
NB
739 int verbose, int force);
740
7f91af49
N
741extern int Build(char *mddev, int chunk, int level, int layout,
742 int raiddisks, mddev_dev_t devlist, int assume_clean,
743 char *bitmap_file, int bitmap_chunk, int write_behind,
83208785 744 int delay, int verbose, int autof, unsigned long long size);
64c4757e
NB
745
746
7f91af49 747extern int Create(struct supertype *st, char *mddev,
5dd497ee 748 int chunk, int level, int layout, unsigned long long size, int raiddisks, int sparedisks,
3d3dd91e 749 char *name, char *homehost, int *uuid,
cd29a5c8 750 int subdevs, mddev_dev_t devlist,
47d79ef8 751 int runstop, int verbose, int force, int assume_clean,
7f91af49 752 char *bitmap_file, int bitmap_chunk, int write_behind, int delay, int autof);
64c4757e 753
54bad364 754extern int Detail(char *dev, int brief, int export, int test, char *homehost);
4cce4069 755extern int Detail_Platform(struct superswitch *ss, int scan, int verbose);
e0d19036 756extern int Query(char *dev);
0d726f17
KS
757extern int Examine(mddev_dev_t devlist, int brief, int export, int scan,
758 int SparcAdjust, struct supertype *forcest, char *homehost);
cd29a5c8 759extern int Monitor(mddev_dev_t devlist,
e0d19036 760 char *mailaddr, char *alert_cmd,
aa88f531 761 int period, int daemonise, int scan, int oneshot,
9a36a9b7 762 int dosyslog, int test, char *pidfile, int increments);
64c4757e 763
9277cc77 764extern int Kill(char *dev, struct supertype *st, int force, int quiet, int noexcl);
b90c0e9a 765extern int Wait(char *dev);
9f1da824 766extern int WaitClean(char *dev, int sock, int verbose);
9a9dab36 767
8382f19b 768extern int Incremental(char *devname, int verbose, int runstop,
0ac91628
N
769 struct supertype *st, char *homehost, int require_homehost,
770 int autof);
598f0d58 771extern int Incremental_container(struct supertype *st, char *devname,
215bb3f7
N
772 int verbose, int runstop, int autof,
773 int trustworthy);
8382f19b
NB
774extern void RebuildMap(void);
775extern int IncrementalScan(int verbose);
776
c82f047c
NB
777extern int CreateBitmap(char *filename, int force, char uuid[16],
778 unsigned long chunksize, unsigned long daemon_sleep,
dfd4d8ee 779 unsigned long write_behind,
dcec9ee5
NB
780 unsigned long long array_size,
781 int major);
55935d51 782extern int ExamineBitmap(char *filename, int brief, struct supertype *st);
bf4fb153 783extern int bitmap_update_uuid(int fd, int *uuid, int swap);
2a528478 784extern unsigned long bitmap_sectors(struct bitmap_super_s *bsb);
c82f047c 785
64c4757e 786extern int md_get_version(int fd);
e0d19036 787extern int get_linux_version(void);
84e11361 788extern long long parse_size(char *size);
64c4757e 789extern int parse_uuid(char *str, int uuid[4]);
4a06e2c2
N
790extern int parse_layout_10(char *layout);
791extern int parse_layout_faulty(char *layout);
682c7051
NB
792extern int check_ext2(int fd, char *name);
793extern int check_reiser(int fd, char *name);
794extern int check_raid(int fd, char *name);
64c4757e 795
dd0781e5 796extern int get_mdp_major(void);
8b0dabea 797extern int dev_open(char *dev, int flags);
e8a70c89 798extern int open_dev(int devnum);
a931db9e 799extern int open_dev_excl(int devnum);
8d80900b 800extern int is_standard(char *dev, int *nump);
9008ed1c 801extern int same_dev(char *one, char *two);
dd0781e5 802
f1ae21c4 803extern int parse_auto(char *str, char *msg, int config);
8aec876d
NB
804extern mddev_ident_t conf_get_ident(char *dev);
805extern mddev_dev_t conf_get_devs(void);
8382f19b 806extern int conf_test_dev(char *devname);
31015d57 807extern int conf_test_metadata(const char *version);
8aec876d
NB
808extern struct createinfo *conf_get_create_info(void);
809extern void set_conffile(char *file);
810extern char *conf_get_mailaddr(void);
811extern char *conf_get_mailfrom(void);
812extern char *conf_get_program(void);
0ac91628 813extern char *conf_get_homehost(int *require_homehostp);
e0d19036 814extern char *conf_line(FILE *file);
98c6faba 815extern char *conf_word(FILE *file, int allow_key);
0ac91628
N
816extern int conf_name_is_free(char *name);
817extern int devname_matches(char *name, char *match);
360b4636 818extern struct mddev_ident_s *conf_match(struct mdinfo *info, struct supertype *st);
0ac91628 819
e0d19036
NB
820extern void free_line(char *line);
821extern int match_oneof(char *devices, char *devname);
e0d19036 822extern void uuid_from_super(int uuid[4], mdp_super_t *super);
36ba7d48 823extern const int uuid_match_any[4];
f277ce36 824extern int same_uuid(int a[4], int b[4], int swapuuid);
350f29f9 825extern void copy_uuid(void *a, int b[4], int swapuuid);
aae5a112 826extern char *__fname_from_uuid(int id[4], int swap, char *buf, char sep);
d7288ddc 827extern char *fname_from_uuid(struct supertype *st,
ff54de6e 828 struct mdinfo *info, char *buf, char sep);
4b1ac34b 829extern unsigned long calc_csum(void *super, int bytes);
583315d9 830extern int enough(int level, int raid_disks, int layout, int clean,
265e0f17 831 char *avail, int avail_disks);
e0d19036 832extern int ask(char *mesg);
8fac0577 833extern unsigned long long get_component_size(int fd);
0430ed48 834extern void remove_partitions(int fd);
5f8097be
NB
835extern unsigned long long calc_array_size(int level, int raid_disks, int layout,
836 int chunksize, unsigned long long devsize);
edd8d13c
NB
837extern int flush_metadata_updates(struct supertype *st);
838extern void append_metadata_update(struct supertype *st, void *buf, int len);
6234c63c
DW
839extern int assemble_container_content(struct supertype *st, int mdfd,
840 struct mdinfo *content, int runstop,
841 char *chosen_name, int verbose);
e0d19036 842
7801ac20
N
843extern int add_disk(int mdfd, struct supertype *st,
844 struct mdinfo *sra, struct mdinfo *info);
f35f2525 845extern int set_array_info(int mdfd, struct supertype *st, struct mdinfo *info);
cd29a5c8 846
56eb10c0 847extern char *human_size(long long bytes);
e4965ef8
N
848extern char *human_size_brief(long long bytes);
849extern void print_r10_layout(int layout);
e0d19036 850
63152c1b
NB
851#define NoMdDev (1<<23)
852extern int find_free_devnum(int use_partitions);
853
e0d19036
NB
854extern void put_md_name(char *name);
855extern char *get_md_name(int dev);
856
c913b90e 857extern char DefaultConfFile[];
b5e64645 858
69207ff6
N
859extern int create_mddev(char *dev, char *name, int autof, int trustworthy,
860 char *chosen);
861/* values for 'trustworthy' */
862#define LOCAL 1
863#define FOREIGN 2
864#define METADATA 3
6be1d39d 865extern int open_mddev(char *dev, int report_errors);
a322f70c 866extern int open_container(int fd);
b5e64645 867
a931db9e
NB
868extern int mdmon_running(int devnum);
869extern int signal_mdmon(int devnum);
40ebbb9c 870extern int check_env(char *name);
148acb7b 871extern __u32 random32(void);
8850ee3e 872extern int start_mdmon(int devnum);
a931db9e 873
2f6079dc 874extern char *devnum2devname(int num);
77472ff8 875extern int devname2devnum(char *name);
c94709e8 876extern int stat2devnum(struct stat *st);
2f6079dc 877extern int fd2devnum(int fd);
b5e64645 878
a931db9e
NB
879static inline int dev2major(int d)
880{
881 if (d >= 0)
882 return MD_MAJOR;
883 else
884 return get_mdp_major();
885}
886
887static inline int dev2minor(int d)
888{
889 if (d >= 0)
890 return d;
891 return (-1-d) << MdpMinorShift;
892}
893
6416d527
NB
894static inline int ROUND_UP(int a, int base)
895{
896 return ((a+base-1)/base)*base;
897}
898
3c558363
N
899static inline int is_subarray(char *vers)
900{
e9dd1598
N
901 /* The version string for a 'subarray' (an array in a container)
902 * is
903 * /containername/componentname for normal read-write arrays
904 * -containername/componentname for read-only arrays.
905 * containername is e.g. md0, md_d1
906 * componentname is dependant on the metadata. e.g. '1' 'S1' ...
907 */
908 return (*vers == '/' || *vers == '-');
3c558363
N
909}
910
2a24d7b6
DW
911#ifdef DEBUG
912#define dprintf(fmt, arg...) \
913 fprintf(stderr, fmt, ##arg)
914#else
915#define dprintf(fmt, arg...) \
916 ({ if (0) fprintf(stderr, fmt, ##arg); 0; })
917#endif
1a0ee0ba
DK
918#include <assert.h>
919#include <stdarg.h>
920static inline int xasprintf(char **strp, const char *fmt, ...) {
921 va_list ap;
922 int ret;
923 va_start(ap, fmt);
089485cb 924 ret = vasprintf(strp, fmt, ap);
1a0ee0ba
DK
925 va_end(ap);
926 assert(ret >= 0);
927 return ret;
928}
2a24d7b6 929
b5e64645
NB
930#define LEVEL_MULTIPATH (-4)
931#define LEVEL_LINEAR (-1)
932#define LEVEL_FAULTY (-5)
933
17f25ca6
NB
934/* kernel module doesn't know about these */
935#define LEVEL_CONTAINER (-100)
a322f70c 936#define LEVEL_UNSUPPORTED (-200)
17f25ca6 937
b5e64645
NB
938
939/* faulty stuff */
940
941#define WriteTransient 0
942#define ReadTransient 1
943#define WritePersistent 2
944#define ReadPersistent 3
945#define WriteAll 4 /* doesn't go to device */
946#define ReadFixable 5
947#define Modes 6
948
949#define ClearErrors 31
950#define ClearFaults 30
951
952#define AllPersist 100 /* internal use only */
953#define NoPersist 101
954
955#define ModeMask 0x1f
956#define ModeShift 5
fe6729fa
NB
957
958
959#ifdef __TINYC__
960#undef minor
961#undef major
962#undef makedev
963#define minor(x) ((x)&0xff)
964#define major(x) (((x)>>8)&0xff)
965#define makedev(M,m) (((M)<<8) | (m))
966#endif
967
b640a252 968/* for raid4/5/6 */
e86c9dd6
NB
969#define ALGORITHM_LEFT_ASYMMETRIC 0
970#define ALGORITHM_RIGHT_ASYMMETRIC 1
971#define ALGORITHM_LEFT_SYMMETRIC 2
972#define ALGORITHM_RIGHT_SYMMETRIC 3
b640a252
N
973
974/* Define non-rotating (raid4) algorithms. These allow
975 * conversion of raid4 to raid5.
976 */
977#define ALGORITHM_PARITY_0 4 /* P or P,Q are initial devices */
978#define ALGORITHM_PARITY_N 5 /* P or P,Q are final devices. */
979
980/* DDF RAID6 layouts differ from md/raid6 layouts in two ways.
981 * Firstly, the exact positioning of the parity block is slightly
982 * different between the 'LEFT_*' modes of md and the "_N_*" modes
983 * of DDF.
984 * Secondly, or order of datablocks over which the Q syndrome is computed
985 * is different.
986 * Consequently we have different layouts for DDF/raid6 than md/raid6.
987 * These layouts are from the DDFv1.2 spec.
988 * Interestingly DDFv1.2-Errata-A does not specify N_CONTINUE but
989 * leaves RLQ=3 as 'Vendor Specific'
990 */
991
992#define ALGORITHM_ROTATING_ZERO_RESTART 8 /* DDF PRL=6 RLQ=1 */
993#define ALGORITHM_ROTATING_N_RESTART 9 /* DDF PRL=6 RLQ=2 */
994#define ALGORITHM_ROTATING_N_CONTINUE 10 /*DDF PRL=6 RLQ=3 */
995
996
997/* For every RAID5 algorithm we define a RAID6 algorithm
998 * with exactly the same layout for data and parity, and
999 * with the Q block always on the last device (N-1).
1000 * This allows trivial conversion from RAID5 to RAID6
1001 */
1002#define ALGORITHM_LEFT_ASYMMETRIC_6 16
1003#define ALGORITHM_RIGHT_ASYMMETRIC_6 17
1004#define ALGORITHM_LEFT_SYMMETRIC_6 18
1005#define ALGORITHM_RIGHT_SYMMETRIC_6 19
1006#define ALGORITHM_PARITY_0_6 20
1007#define ALGORITHM_PARITY_N_6 ALGORITHM_PARITY_N
1008