]> git.ipfire.org Git - thirdparty/mdadm.git/blame_incremental - mdadm.h
github: disable self-runners
[thirdparty/mdadm.git] / mdadm.h
... / ...
CommitLineData
1/*
2 * mdadm - manage Linux "md" devices aka RAID arrays.
3 *
4 * Copyright (C) 2001-2009 Neil Brown <neilb@suse.de>
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@suse.de>
23 */
24
25#define _GNU_SOURCE
26#define _FILE_OFFSET_BITS 64
27#define __USE_LARGEFILE64 1
28
29#include <unistd.h>
30#include <assert.h>
31#include <asm/byteorder.h>
32#include <sys/types.h>
33#include <sys/stat.h>
34#include <stdarg.h>
35#include <stdint.h>
36#include <stdlib.h>
37#include <time.h>
38#include <sys/time.h>
39#include <getopt.h>
40#include <fcntl.h>
41#include <ftw.h>
42#include <stdio.h>
43#include <errno.h>
44#include <string.h>
45#include <syslog.h>
46#include <stdbool.h>
47#include <signal.h>
48/* Newer glibc requires sys/sysmacros.h directly for makedev() */
49#include <sys/sysmacros.h>
50#ifdef __dietlibc__
51#include <strings.h>
52/* dietlibc has deprecated random and srandom!! */
53#define random rand
54#define srandom srand
55#endif
56
57#ifdef NO_COROSYNC
58#define CS_OK 1
59typedef uint64_t cmap_handle_t;
60#else
61#include <corosync/cmap.h>
62#endif
63
64#ifndef NO_DLM
65#include <libdlm.h>
66#include <errno.h>
67#else
68#define LKF_NOQUEUE 0x00000001
69#define LKM_PWMODE 4
70#define EUNLOCK 0x10002
71
72typedef void *dlm_lshandle_t;
73
74struct dlm_lksb {
75 int sb_status;
76 uint32_t sb_lkid;
77 char sb_flags;
78 char *sb_lvbptr;
79};
80#endif
81
82#include <linux/kdev_t.h>
83#include <sys/mount.h>
84#include <asm/types.h>
85#include <sys/ioctl.h>
86#define MD_MAJOR 9
87#define MdpMinorShift 6
88
89#ifndef BLKGETSIZE64
90#define BLKGETSIZE64 _IOR(0x12,114,size_t) /* return device size in bytes (u64 *arg) */
91#endif
92
93#define DEFAULT_CHUNK 512
94#define DEFAULT_BITMAP_CHUNK 4096
95#define DEFAULT_BITMAP_DELAY 5
96#define DEFAULT_MAX_WRITE_BEHIND 256
97
98#ifndef DEV_DIR
99#define DEV_DIR "/dev/"
100#define DEV_DIR_LEN (sizeof(DEV_DIR) - 1)
101#endif /* DEV_DIR */
102
103/* DEV_NUM_PREF is a subpath to numbered MD devices, e.g. /dev/md1 or directory name.
104 * DEV_NUM_PREF_LEN is a length with Null byte excluded.
105 */
106#ifndef DEV_NUM_PREF
107#define DEV_NUM_PREF "/dev/md"
108#define DEV_NUM_PREF_LEN (sizeof(DEV_NUM_PREF) - 1)
109#endif /* DEV_NUM_PREF */
110
111/* DEV_MD_DIR points to named MD devices directory.
112 * DEV_MD_DIR_LEN is a length with Null byte excluded.
113 */
114#ifndef DEV_MD_DIR
115#define DEV_MD_DIR "/dev/md/"
116#define DEV_MD_DIR_LEN (sizeof(DEV_MD_DIR) - 1)
117#endif /* DEV_MD_DIR */
118
119/* MAP_DIR should be somewhere that persists across the pivotroot
120 * from early boot to late boot.
121 * /run seems to have emerged as the best standard.
122 */
123#ifndef MAP_DIR
124#define MAP_DIR "/run/mdadm"
125#endif /* MAP_DIR */
126/* MAP_FILE is what we name the map file we put in MAP_DIR, in case you
127 * want something other than the default of "map"
128 */
129#ifndef MAP_FILE
130#define MAP_FILE "map"
131#endif /* MAP_FILE */
132/* MDMON_DIR is where pid and socket files used for communicating
133 * with mdmon normally live. Best is /var/run/mdadm as
134 * mdmon is needed at early boot then it needs to write there prior
135 * to /var/run being mounted read/write, and it also then needs to
136 * persist beyond when /var/run is mounter read-only. So, to be
137 * safe, the default is somewhere that is read/write early in the
138 * boot process and stays up as long as possible during shutdown.
139 */
140#ifndef MDMON_DIR
141#define MDMON_DIR "/run/mdadm"
142#endif /* MDMON_DIR */
143
144#define MD_MOD_ASYNC_DEL_GENDISK "legacy_async_del_gendisk"
145
146/* FAILED_SLOTS is where to save files storing recent removal of array
147 * member in order to allow future reuse of disk inserted in the same
148 * slot for array recovery
149 */
150#ifndef FAILED_SLOTS_DIR
151#define FAILED_SLOTS_DIR "/run/mdadm/failed-slots"
152#endif /* FAILED_SLOTS */
153
154#ifndef MDMON_SERVICE
155#define MDMON_SERVICE "mdmon"
156#endif /* MDMON_SERVICE */
157
158#ifndef GROW_SERVICE
159#define GROW_SERVICE "mdadm-grow-continue"
160#endif /* GROW_SERVICE */
161
162#include <linux/raid/md_u.h>
163#include <linux/raid/md_p.h>
164
165/* These defines might be missing in raid headers*/
166#ifndef MD_SB_BLOCK_CONTAINER_RESHAPE
167#define MD_SB_BLOCK_CONTAINER_RESHAPE 3
168#endif
169#ifndef MD_SB_BLOCK_VOLUME
170#define MD_SB_BLOCK_VOLUME 4
171#endif
172#ifndef MD_DISK_REPLACEMENT
173#define MD_DISK_REPLACEMENT 17
174#endif
175
176#include "bitmap.h"
177#include "msg.h"
178#include "mdadm_status.h"
179
180/*
181 * Partially stolen from include/linux/unaligned/packed_struct.h
182 */
183struct __una_u16 { __u16 x; } __attribute__ ((packed));
184struct __una_u32 { __u32 x; } __attribute__ ((packed));
185
186/*
187 * Ensure GNU basename behavior on GLIBC less systems.
188 */
189#ifndef __GLIBC__
190#define basename(path) \
191 (strrchr((path), '/') ? strrchr((path),'/') + 1 : (path))
192#endif
193
194static inline __u16 __get_unaligned16(const void *p)
195{
196 const struct __una_u16 *ptr = (const struct __una_u16 *)p;
197 return ptr->x;
198}
199
200static inline __u32 __get_unaligned32(const void *p)
201{
202 const struct __una_u32 *ptr = (const struct __una_u32 *)p;
203 return ptr->x;
204}
205
206static inline void __put_unaligned16(__u16 val, void *p)
207{
208 struct __una_u16 *ptr = (struct __una_u16 *)p;
209 ptr->x = val;
210}
211
212static inline void __put_unaligned32(__u32 val, void *p)
213{
214 struct __una_u32 *ptr = (struct __una_u32 *)p;
215 ptr->x = val;
216}
217
218/*
219 * Check at compile time that something is of a particular type.
220 * Always evaluates to 1 so you may use it easily in comparisons.
221*/
222
223#define typecheck(type,x) \
224({ type __dummy; \
225 typeof(x) __dummy2; \
226 (void)(&__dummy == &__dummy2); \
227 1; \
228})
229
230/*
231 * These inlines deal with timer wrapping correctly.
232 *
233 * time_after(a,b) returns true if the time a is after time b.
234*/
235
236#define time_after(a,b) \
237 (typecheck(unsigned int, a) && \
238 typecheck(unsigned int, b) && \
239 ((int)((b) - (a)) < 0))
240
241#define time_before(a,b) time_after(b,a)
242
243/*
244 * min()/max()/clamp() macros that also do
245 * strict type-checking.. See the
246 * "unnecessary" pointer comparison.
247 */
248#define min(x, y) ({ \
249 typeof(x) _min1 = (x); \
250 typeof(y) _min2 = (y); \
251 (void) (&_min1 == &_min2); \
252 _min1 < _min2 ? _min1 : _min2; })
253
254#define max(x, y) ({ \
255 typeof(x) _max1 = (x); \
256 typeof(y) _max2 = (y); \
257 (void) (&_max1 == &_max2); \
258 _max1 > _max2 ? _max1 : _max2; })
259
260#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
261
262#define KIB_TO_BYTES(x) ((x) << 10)
263#define SEC_TO_BYTES(x) ((x) << 9)
264
265/**
266 * This is true for native and DDF, IMSM allows 16.
267 */
268#define MD_NAME_MAX 32
269
270extern const char Name[];
271
272struct md_bb_entry {
273 unsigned long long sector;
274 int length;
275};
276
277struct md_bb {
278 int supported;
279 int count;
280 struct md_bb_entry *entries;
281};
282
283/* general information that might be extracted from a superblock */
284struct mdinfo {
285 mdu_array_info_t array;
286 mdu_disk_info_t disk;
287 __u64 events;
288 int uuid[4];
289 char name[33];
290 unsigned long long data_offset;
291 unsigned long long new_data_offset;
292 unsigned long long component_size; /* same as array.size, except in
293 * sectors and up to 64bits.
294 */
295 unsigned long long custom_array_size; /* size for non-default sized
296 * arrays (in sectors)
297 */
298#define NO_RESHAPE 0
299#define VOLUME_RESHAPE 1
300#define CONTAINER_RESHAPE 2
301#define RESHAPE_NO_BACKUP 16 /* Mask 'or'ed in */
302 int reshape_active;
303 unsigned long long reshape_progress;
304 int recovery_blocked; /* for external metadata it
305 * indicates that there is
306 * reshape in progress in
307 * container,
308 * for native metadata it is
309 * reshape_active field mirror
310 */
311 int journal_device_required;
312 int journal_clean;
313
314 enum {
315 CONSISTENCY_POLICY_UNKNOWN,
316 CONSISTENCY_POLICY_NONE,
317 CONSISTENCY_POLICY_RESYNC,
318 CONSISTENCY_POLICY_BITMAP,
319 CONSISTENCY_POLICY_JOURNAL,
320 CONSISTENCY_POLICY_PPL,
321 } consistency_policy;
322
323 /* During reshape we can sometimes change the data_offset to avoid
324 * over-writing still-valid data. We need to know if there is space.
325 * So getinfo_super will fill in space_before and space_after in sectors.
326 * data_offset can be increased or decreased by this amount.
327 */
328 unsigned long long space_before, space_after;
329 union {
330 unsigned long long resync_start; /* per-array resync position */
331 unsigned long long recovery_start; /* per-device rebuild position */
332 #define MaxSector (~0ULL) /* resync/recovery complete position */
333 };
334 long bitmap_offset; /* 0 == none, 1 == a file */
335 unsigned int ppl_size;
336 int ppl_offset;
337 unsigned long long ppl_sector;
338 unsigned long safe_mode_delay; /* ms delay to mark clean */
339 int new_level, delta_disks, new_layout, new_chunk;
340 int errors;
341 unsigned long cache_size; /* size of raid456 stripe cache*/
342 int mismatch_cnt;
343 char text_version[50];
344
345 int container_member; /* for assembling external-metatdata arrays
346 * This is to be used internally by metadata
347 * handler only */
348 /**
349 * flag external handlers can set to indicate that subarrays have:
350 * - not enough disks to start (-1),
351 * - enough disks to start (0),
352 * - all expected disks (1).
353 */
354 int container_enough;
355 char sys_name[32];
356 struct mdinfo *devs;
357 struct mdinfo *next;
358
359 /* Device info for mdmon: */
360 int recovery_fd;
361 int state_fd;
362 int bb_fd;
363 int ubb_fd;
364 #define DS_FAULTY 1
365 #define DS_INSYNC 2
366 #define DS_WRITE_MOSTLY 4
367 #define DS_SPARE 8
368 #define DS_BLOCKED 16
369 #define DS_REMOVE 1024
370 #define DS_UNBLOCK 2048
371 #define DS_EXTERNAL_BB 4096
372 int prev_state, curr_state, next_state;
373
374 /* If set by monitor, managemon needs to remove faulty device */
375 bool man_disk_to_remove : 1;
376
377 /* Managemon cannot close descriptors if monitor is using them for select() */
378 bool mon_descriptors_not_used : 1;
379
380 /* info read from sysfs */
381 enum {
382 ARRAY_CLEAR,
383 ARRAY_INACTIVE,
384 ARRAY_SUSPENDED,
385 ARRAY_READONLY,
386 ARRAY_READ_AUTO,
387 ARRAY_CLEAN,
388 ARRAY_ACTIVE,
389 ARRAY_WRITE_PENDING,
390 ARRAY_ACTIVE_IDLE,
391 ARRAY_BROKEN,
392 ARRAY_UNKNOWN_STATE,
393 } array_state;
394 struct md_bb bb;
395};
396
397struct createinfo {
398 int uid;
399 int gid;
400 int autof;
401 int mode;
402 int names;
403 int bblist;
404 struct supertype *supertype;
405};
406
407struct spare_criteria {
408 bool criteria_set;
409 unsigned long long min_size;
410 unsigned int sector_size;
411 struct dev_policy *pols;
412};
413
414enum mode {
415 ASSEMBLE=1,
416 BUILD,
417 CREATE,
418 MANAGE,
419 MISC,
420 MONITOR,
421 GROW,
422 INCREMENTAL,
423 AUTODETECT,
424 mode_count
425};
426
427extern char short_opts[], short_monitor_opts[], short_bitmap_opts[], short_bitmap_auto_opts[];
428
429extern struct option long_options[];
430extern char Version[], Usage[], Help[], OptionHelp[],
431 *mode_help[],
432 Help_create[], Help_build[], Help_assemble[], Help_grow[],
433 Help_incr[],
434 Help_manage[], Help_misc[], Help_monitor[], Help_config[];
435
436/* for option that don't have short equivilents, we assign arbitrary
437 * numbers later than any 'short' character option.
438 */
439enum special_options {
440 AssumeClean = 300,
441 WriteZeroes,
442 BitmapChunk,
443 WriteBehind,
444 ReAdd,
445 NoDegraded,
446 Sparc22,
447 BackupFile,
448 HomeHost,
449 AutoHomeHost,
450 AutoDetect,
451 Waitclean,
452 DetailPlatform,
453 KillSubarray,
454 UpdateSubarray,
455 IncrementalPath,
456 NoSharing,
457 HelpOptions,
458 Brief,
459 NoDevices,
460 ManageOpt,
461 Add,
462 AddSpare,
463 AddJournal,
464 Remove,
465 Fail,
466 Replace,
467 With,
468 MiscOpt,
469 WaitOpt,
470 ConfigFile,
471 ChunkSize,
472 WriteMostly,
473 FailFast,
474 NoFailFast,
475 Layout,
476 Auto,
477 Force,
478 SuperMinor,
479 EMail,
480 ProgramOpt,
481 Increment,
482 Fork,
483 Bitmap,
484 RebuildMapOpt,
485 InvalidBackup,
486 UdevRules,
487 Continue,
488 OffRootOpt,
489 Prefer,
490 KillOpt,
491 DataOffset,
492 ExamineBB,
493 Dump,
494 Restore,
495 Action,
496 Nodes,
497 ClusterName,
498 ClusterConfirm,
499 WriteJournal,
500 ConsistencyPolicy,
501};
502
503enum update_opt {
504 UOPT_UNDEFINED = 0,
505 UOPT_NAME,
506 UOPT_PPL,
507 UOPT_NO_PPL,
508 UOPT_BITMAP,
509 UOPT_NO_BITMAP,
510 UOPT_SUBARRAY_ONLY,
511 UOPT_SPARC22,
512 UOPT_SUPER_MINOR,
513 UOPT_SUMMARIES,
514 UOPT_RESYNC,
515 UOPT_UUID,
516 UOPT_HOMEHOST,
517 UOPT_HOME_CLUSTER,
518 UOPT_NODES,
519 UOPT_DEVICESIZE,
520 UOPT_BBL,
521 UOPT_NO_BBL,
522 UOPT_FORCE_NO_BBL,
523 UOPT_METADATA,
524 UOPT_REVERT_RESHAPE,
525 UOPT_LAYOUT_ORIGINAL,
526 UOPT_LAYOUT_ALTERNATE,
527 UOPT_LAYOUT_UNSPECIFIED,
528 UOPT_BYTEORDER,
529 UOPT_HELP,
530 UOPT_USER_ONLY,
531 /*
532 * Code specific options, cannot be set by the user
533 */
534 UOPT_SPEC_FORCE_ONE,
535 UOPT_SPEC_FORCE_ARRAY,
536 UOPT_SPEC_ASSEMBLE,
537 UOPT_SPEC_LINEAR_GROW_NEW,
538 UOPT_SPEC_LINEAR_GROW_UPDATE,
539 UOPT_SPEC__RESHAPE_PROGRESS,
540 UOPT_SPEC_WRITEMOSTLY,
541 UOPT_SPEC_READWRITE,
542 UOPT_SPEC_FAILFAST,
543 UOPT_SPEC_NOFAILFAST,
544 UOPT_SPEC_REVERT_RESHAPE_NOBACKUP,
545};
546extern void fprint_update_options(FILE *outf, enum update_opt update_mode);
547
548enum prefix_standard {
549 JEDEC,
550 IEC
551};
552
553enum bitmap_update {
554 NoUpdate,
555 NameUpdate,
556 NodeNumUpdate,
557};
558
559enum bitmap_type {
560 BitmapNone,
561 BitmapInternal,
562 BitmapCluster,
563 BitmapUnknown,
564};
565
566enum flag_mode {
567 FlagDefault, FlagSet, FlagClear,
568};
569
570typedef enum {
571 ROLLBACK_METADATA_CHANGES,
572 APPLY_METADATA_CHANGES
573} change_dir_t;
574
575/* structures read from config file */
576/* List of mddevice names and identifiers
577 * Identifiers can be:
578 * uuid=128-hex-uuid
579 * super-minor=decimal-minor-number-from-superblock
580 * devices=comma,separated,list,of,device,names,with,wildcards
581 *
582 * If multiple fields are present, the intersection of all matching
583 * devices is considered
584 */
585#define UnSet (0xfffe)
586struct mddev_ident {
587 char *devname;
588
589 int uuid_set;
590 int uuid[4];
591 char name[MD_NAME_MAX + 1];
592
593 int super_minor;
594
595 char *devices; /* comma separated list of device
596 * names with wild cards
597 */
598 int level;
599 int raid_disks;
600 int spare_disks;
601 struct supertype *st;
602 char *spare_group;
603 enum bitmap_type btype;
604
605 char *container; /* /dev/whatever name of container, or
606 * uuid of container. You would expect
607 * this to be the 'devname' or UUID
608 * of some other entry.
609 */
610 char *member; /* subarray within a container */
611
612 struct mddev_ident *next;
613 union {
614 /* fields needed by different users of this structure */
615 int assembled; /* set when assembly succeeds */
616 };
617};
618
619struct context {
620 int readonly;
621 int runstop;
622 int verbose;
623 int brief;
624 int no_devices;
625 int force;
626 char *homehost;
627 int require_homehost;
628 char *prefer;
629 int export;
630 int test;
631 char *subarray;
632 enum update_opt update;
633 int scan;
634 int SparcAdjust;
635 int delay;
636 char *backup_file;
637 int invalid_backup;
638 char *action;
639 int nodes;
640 char *homecluster;
641 char *metadata;
642};
643
644struct shape {
645 char *dev;
646 int raiddisks;
647 int delta_disks;
648 int sparedisks;
649 int journaldisks;
650 int level;
651 int layout;
652 char *layout_str;
653 int chunk;
654 int bitmap_chunk;
655 enum bitmap_type btype;
656 int assume_clean;
657 bool write_zeroes;
658 int write_behind;
659 unsigned long long size;
660 unsigned long long data_offset;
661 int consistency_policy;
662 change_dir_t direction;
663};
664
665/* List of device names - wildcards expanded */
666struct mddev_dev {
667 char *devname;
668 int disposition; /* 'a' for add, 'r' for remove, 'f' for fail,
669 * 'A' for re_add.
670 * Not set for names read from .config
671 */
672 enum flag_mode writemostly;
673 enum flag_mode failfast;
674 int used; /* set when used */
675 long long data_offset;
676 struct mddev_dev *next;
677};
678
679typedef struct mapping {
680 char *name;
681 int num;
682} mapping_t;
683
684struct mdstat_ent {
685 char devnm[32];
686 int active;
687 char *level;
688 char *pattern; /* U for up, _ for down */
689 int percent; /* -1 if no resync */
690 int resync; /* 3 if check, 2 if reshape, 1 if resync, 0 if recovery */
691 int devcnt;
692 int raid_disks;
693 char * metadata_version;
694 struct dev_member {
695 char *name;
696 struct dev_member *next;
697 } *members;
698 struct mdstat_ent *next;
699};
700
701extern struct mdstat_ent *mdstat_read(int hold, int start);
702extern void mdstat_close(void);
703extern void free_mdstat(struct mdstat_ent *ms);
704extern int mdstat_wait(int seconds);
705extern void mdstat_wait_fd(int fd, const sigset_t *sigmask);
706extern int mddev_busy(char *devnm);
707extern struct mdstat_ent *mdstat_by_component(char *name);
708extern struct mdstat_ent *mdstat_find_by_member_name(struct mdstat_ent *mdstat, char *member_devnm);
709extern struct mdstat_ent *mdstat_by_subdev(char *subdev, char *container);
710
711extern bool is_mdstat_ent_external(struct mdstat_ent *ent);
712extern bool is_mdstat_ent_subarray(struct mdstat_ent *ent);
713
714struct map_ent {
715 struct map_ent *next;
716 char devnm[32];
717 char metadata[20];
718 int uuid[4];
719 int bad;
720 char *path;
721};
722extern int map_update(struct map_ent **mpp, char *devnm, char *metadata,
723 int uuid[4], char *path);
724extern void map_remove(struct map_ent **map, char *devnm);
725extern struct map_ent *map_by_uuid(struct map_ent **map, int uuid[4]);
726extern struct map_ent *map_by_devnm(struct map_ent **map, char *devnm);
727extern void map_free(struct map_ent *map);
728extern struct map_ent *map_by_name(struct map_ent **map, char *name);
729extern void map_read(struct map_ent **melp);
730extern int map_write(struct map_ent *mel);
731extern void map_delete(struct map_ent **mapp, char *devnm);
732extern void map_add(struct map_ent **melp,
733 char *devnm, char *metadata, int uuid[4], char *path);
734extern int map_lock(struct map_ent **melp);
735extern void map_unlock(struct map_ent **melp);
736extern void map_fork(void);
737
738/* various details can be requested */
739enum sysfs_read_flags {
740 GET_LEVEL = (1 << 0),
741 GET_LAYOUT = (1 << 1),
742 GET_COMPONENT = (1 << 2),
743 GET_CHUNK = (1 << 3),
744 GET_CACHE = (1 << 4),
745 GET_MISMATCH = (1 << 5),
746 GET_VERSION = (1 << 6),
747 GET_DISKS = (1 << 7),
748 GET_SAFEMODE = (1 << 9),
749 GET_BITMAP_LOCATION = (1 << 10),
750
751 GET_DEVS = (1 << 20), /* gets role, major, minor */
752 GET_OFFSET = (1 << 21),
753 GET_SIZE = (1 << 22),
754 GET_STATE = (1 << 23),
755 GET_ERROR = (1 << 24),
756 GET_ARRAY_STATE = (1 << 25),
757 GET_CONSISTENCY_POLICY = (1 << 26),
758 GET_DEVS_ALL = (1 << 27),
759};
760
761#define SYSFS_MAX_BUF_SIZE 64
762
763/**
764 * Defines md/<disk>/state possible values.
765 * Note that remove can't be read-back from the file.
766 *
767 * This is not complete list.
768 */
769typedef enum memb_state {
770 MEMB_STATE_EXTERNAL_BBL,
771 MEMB_STATE_BLOCKED,
772 MEMB_STATE_SPARE,
773 MEMB_STATE_WRITE_MOSTLY,
774 MEMB_STATE_IN_SYNC,
775 MEMB_STATE_FAULTY,
776 MEMB_STATE_REMOVE,
777 MEMB_STATE_UNKNOWN
778} memb_state_t;
779char *map_memb_state(memb_state_t state);
780
781extern mdadm_status_t sysfs_write_descriptor(const int fd, const char *value,
782 const ssize_t len, int *errno_p);
783extern mdadm_status_t write_attr(const char *value, const int fd);
784extern mdadm_status_t sysfs_set_memb_state_fd(int fd, memb_state_t state, int *err);
785extern mdadm_status_t sysfs_set_memb_state(char *array_devnm, char *memb_devnm, memb_state_t state);
786extern void sysfs_get_container_devnm(struct mdinfo *mdi, char *buf);
787
788extern int sysfs_open(char *devnm, char *devname, char *attr);
789extern int sysfs_open_memb_attr(char *array_devnm, char *memb_devnm, char *attr, int oflag);
790extern int sysfs_init(struct mdinfo *mdi, int fd, char *devnm);
791extern void sysfs_init_dev(struct mdinfo *mdi, dev_t devid);
792extern void sysfs_free(struct mdinfo *sra);
793
794extern struct mdinfo *sysfs_read(int fd, char *devnm, unsigned long options);
795extern int sysfs_attr_match(const char *attr, const char *str);
796extern int sysfs_match_word(const char *word, char **list);
797extern int sysfs_set_str(struct mdinfo *sra, struct mdinfo *dev,
798 char *name, char *val);
799extern int sysfs_set_num(struct mdinfo *sra, struct mdinfo *dev,
800 char *name, unsigned long long val);
801extern int sysfs_set_num_signed(struct mdinfo *sra, struct mdinfo *dev,
802 char *name, long long val);
803extern int sysfs_uevent(struct mdinfo *sra, char *event);
804extern int sysfs_get_fd(struct mdinfo *sra, struct mdinfo *dev,
805 char *name);
806extern int sysfs_fd_get_ll(int fd, unsigned long long *val);
807extern int sysfs_get_ll(struct mdinfo *sra, struct mdinfo *dev,
808 char *name, unsigned long long *val);
809extern int sysfs_fd_get_two(int fd, unsigned long long *v1, unsigned long long *v2);
810extern int sysfs_get_two(struct mdinfo *sra, struct mdinfo *dev,
811 char *name, unsigned long long *v1, unsigned long long *v2);
812extern int sysfs_fd_get_str(int fd, char *val, int size);
813extern int sysfs_attribute_available(struct mdinfo *sra, struct mdinfo *dev,
814 char *name);
815extern int sysfs_get_str(struct mdinfo *sra, struct mdinfo *dev,
816 char *name, char *val, int size);
817extern int sysfs_set_safemode(struct mdinfo *sra, unsigned long ms);
818extern int sysfs_set_array(struct mdinfo *info);
819extern int sysfs_add_disk(struct mdinfo *sra, struct mdinfo *sd, int resume);
820extern int sysfs_disk_to_scsi_id(int fd, __u32 *id);
821extern int sysfs_unique_holder(char *devnm, long rdev);
822extern int sysfs_freeze_array(struct mdinfo *sra);
823extern int sysfs_wait(int fd, int *msec);
824extern int load_sys(char *path, char *buf, int len);
825extern int zero_disk_range(int fd, unsigned long long sector, size_t count);
826extern int reshape_prepare_fdlist(char *devname,
827 struct mdinfo *sra,
828 int raid_disks,
829 int nrdisks,
830 unsigned long blocks,
831 char *backup_file,
832 int *fdlist,
833 unsigned long long *offsets);
834extern void reshape_free_fdlist(int *fdlist,
835 unsigned long long *offsets,
836 int size);
837extern int reshape_open_backup_file(char *backup,
838 int fd,
839 char *devname,
840 long blocks,
841 int *fdlist,
842 unsigned long long *offsets,
843 char *sysfs_name,
844 int restart);
845extern unsigned long compute_backup_blocks(int nchunk, int ochunk,
846 unsigned int ndata, unsigned int odata);
847extern char *locate_backup(char *name);
848extern char *make_backup(char *name);
849
850extern int save_stripes(int *source, unsigned long long *offsets,
851 int raid_disks, int chunk_size, int level, int layout,
852 int nwrites, int *dest,
853 unsigned long long start, unsigned long long length,
854 char *buf);
855extern int restore_stripes(int *dest, unsigned long long *offsets,
856 int raid_disks, int chunk_size, int level, int layout,
857 int source, unsigned long long read_offset,
858 unsigned long long start, unsigned long long length,
859 char *src_buf);
860extern bool sysfs_is_libata_allow_tpm_enabled(const int verbose);
861extern bool init_md_mod_param(void);
862
863#ifndef Sendmail
864#define Sendmail "/usr/lib/sendmail -t"
865#endif
866
867#define SYSLOG_FACILITY LOG_DAEMON
868extern char *map_num_s(mapping_t *map, int num);
869extern char *map_num(mapping_t *map, int num);
870extern int map_name(mapping_t *map, char *name);
871extern mapping_t r0layout[], r5layout[], r6layout[],
872 pers[], modes[], faultylayout[];
873extern mapping_t consistency_policies[], sysfs_array_states[], update_options[];
874
875extern char *map_dev_preferred(int major, int minor, int create,
876 char *prefer);
877static inline char *map_dev(int major, int minor, int create)
878{
879 return map_dev_preferred(major, minor, create, NULL);
880}
881
882/**
883 * is_fd_valid() - check file descriptor.
884 * @fd: file descriptor.
885 *
886 * The function checks if @fd is nonnegative integer and shall be used only
887 * to verify open() result.
888 */
889static inline int is_fd_valid(int fd)
890{
891 return (fd > -1);
892}
893
894/**
895 * is_level456() - check whether given level is between inclusive 4 and 6.
896 * @level: level to check.
897 *
898 * Return: true if condition is met, false otherwise
899 */
900static inline bool is_level456(int level)
901{
902 return (level >= 4 && level <= 6);
903}
904
905/**
906 * close_fd() - verify, close and unset file descriptor.
907 * @fd: pointer to file descriptor.
908 *
909 * The function closes and invalidates file descriptor if appropriative. It
910 * ignores incorrect file descriptor quitely to simplify error handling.
911 */
912static inline void close_fd(int *fd)
913{
914 if (is_fd_valid(*fd) && close(*fd) == 0)
915 *fd = -1;
916}
917
918struct active_array;
919struct metadata_update;
920
921/* 'struct reshape' records the intermediate states of
922 * a general reshape.
923 * The starting geometry is converted to the 'before' geometry
924 * by at most an atomic level change. They could be the same.
925 * Similarly the 'after' geometry is converted to the final
926 * geometry by at most a level change.
927 * Note that 'before' and 'after' must have the same level.
928 * 'blocks' is the minimum number of sectors for a reshape unit.
929 * This will be a multiple of the stripe size in each of the
930 * 'before' and 'after' geometries.
931 * If 'blocks' is 0, no restriping is necessary.
932 * 'min_offset_change' is the minimum change to data_offset to
933 * allow the reshape to happen. It is at least the larger of
934 * the old and new chunk sizes, and typically the same as 'blocks'
935 * divided by number of data disks.
936 */
937struct reshape {
938 int level;
939 int parity; /* number of parity blocks/devices */
940 struct {
941 int layout;
942 int data_disks;
943 } before, after;
944 unsigned long long backup_blocks;
945 unsigned long long min_offset_change;
946 unsigned long long stripes; /* number of old stripes that comprise 'blocks'*/
947 unsigned long long new_size; /* New size of array in sectors */
948};
949
950/**
951 * struct dev_policy - Data structure for policy management.
952 * @next: pointer to next dev_policy.
953 * @name: policy name, category.
954 * @metadata: the metadata type it affects.
955 * @value: value of the policy.
956 *
957 * The functions to manipulate dev_policy lists do not free elements, so they must be statically
958 * allocated. @name and @metadata can be compared by address.
959 */
960typedef struct dev_policy {
961 struct dev_policy *next;
962 char *name;
963 const char *metadata;
964 const char *value;
965} dev_policy_t;
966
967/* A superswitch provides entry point to a metadata handler.
968 *
969 * The superswitch primarily operates on some "metadata" that
970 * is accessed via the 'supertype'.
971 * This metadata has one of three possible sources.
972 * 1/ It is read from a single device. In this case it may not completely
973 * describe the array or arrays as some information might be on other
974 * devices.
975 * 2/ It is read from all devices in a container. In this case all
976 * information is present.
977 * 3/ It is created by ->init_super / ->add_to_super. In this case it will
978 * be complete once enough ->add_to_super calls have completed.
979 *
980 * When creating an array inside a container, the metadata will be
981 * formed by a combination of 2 and 3. The metadata or the array is read,
982 * then new information is added.
983 *
984 * The metadata must sometimes have a concept of a 'current' array
985 * and a 'current' device.
986 * The 'current' array is set by init_super to be the newly created array,
987 * or is set by super_by_fd when it finds it is looking at an array inside
988 * a container.
989 *
990 * The 'current' device is either the device that the metadata was read from
991 * in case 1, or the last device added by add_to_super in case 3.
992 * Case 2 does not identify a 'current' device.
993 */
994extern struct superswitch {
995
996 /* Used to report details of metadata read from a component
997 * device. ->load_super has been called.
998 */
999 void (*examine_super)(struct supertype *st, char *homehost);
1000 void (*brief_examine_super)(struct supertype *st, int verbose);
1001 void (*brief_examine_subarrays)(struct supertype *st, int verbose);
1002 void (*export_examine_super)(struct supertype *st);
1003 int (*examine_badblocks)(struct supertype *st, int fd, char *devname);
1004 int (*copy_metadata)(struct supertype *st, int from, int to);
1005
1006 /* Used to report details of an active array.
1007 * ->load_super was possibly given a 'component' string.
1008 */
1009 void (*detail_super)(struct supertype *st, char *homehost,
1010 char *subarray);
1011 void (*brief_detail_super)(struct supertype *st, char *subarray);
1012 void (*export_detail_super)(struct supertype *st);
1013
1014 /* Optional: platform hardware / firmware details */
1015 int (*detail_platform)(int verbose, int enumerate_only, char *controller_path);
1016 int (*export_detail_platform)(int verbose, char *controller_path);
1017
1018 /* Used:
1019 * to get uuid to storing in bitmap metadata
1020 * and 'reshape' backup-data metadata
1021 * To see if a device is being re-added to an array it was part of.
1022 */
1023 void (*uuid_from_super)(struct supertype *st, int uuid[4]);
1024
1025 /* Extract generic details from metadata. This could be details about
1026 * the container, or about an individual array within the container.
1027 * The determination is made either by:
1028 * load_super being given a 'component' string.
1029 * validate_geometry determining what to create.
1030 * The info includes both array information and device information.
1031 * The particular device should be:
1032 * The last device added by add_to_super
1033 * The device the metadata was loaded from by load_super
1034 * If 'map' is present, then it is an array raid_disks long
1035 * (raid_disk must already be set and correct) and it is filled
1036 * with 1 for slots that are thought to be active and 0 for slots which
1037 * appear to be failed/missing.
1038 * *info is zeroed out before data is added.
1039 */
1040 void (*getinfo_super)(struct supertype *st, struct mdinfo *info, char *map);
1041 struct mdinfo *(*getinfo_super_disks)(struct supertype *st);
1042 /* Check if the given metadata is flagged as belonging to "this"
1043 * host. 0 for 'no', 1 for 'yes', -1 for "Don't record homehost"
1044 */
1045 int (*match_home)(struct supertype *st, char *homehost);
1046
1047 /* Make one of several generic modifications to metadata
1048 * prior to assembly (or other times).
1049 * sparc2.2 - first bug in early 0.90 metadata
1050 * super-minor - change name of 0.90 metadata
1051 * summaries - 'correct' any redundant data
1052 * resync - mark array as dirty to trigger a resync.
1053 * uuid - set new uuid - only 0.90 or 1.x
1054 * name - change the name of the array (where supported)
1055 * homehost - change which host this array is tied to.
1056 * devicesize - If metadata is at start of device, change recorded
1057 * device size to match actual device size
1058 * byteorder - swap bytes for 0.90 metadata
1059 *
1060 * force-one - mark that device as uptodate, not old or failed.
1061 * force-array - mark array as clean if it would not otherwise
1062 * assemble
1063 * assemble - not sure how this is different from force-one...
1064 * linear-grow-new - add a new device to a linear array, but don't
1065 * change the size: so superblock still matches
1066 * linear-grow-update - now change the size of the array.
1067 * writemostly - set the WriteMostly1 bit in the superblock devflags
1068 * readwrite - clear the WriteMostly1 bit in the superblock devflags
1069 * failfast - set the FailFast1 bit in the superblock
1070 * nofailfast - clear the FailFast1 bit
1071 * no-bitmap - clear any record that a bitmap is present.
1072 * bbl - add a bad-block-log if possible
1073 * no-bbl - remove any bad-block-log is it is empty.
1074 * force-no-bbl - remove any bad-block-log even if empty.
1075 * revert-reshape - If a reshape is in progress, modify metadata so
1076 * it will resume going in the opposite direction.
1077 */
1078 int (*update_super)(struct supertype *st, struct mdinfo *info,
1079 enum update_opt update,
1080 char *devname, int verbose,
1081 int uuid_set, char *homehost);
1082
1083 /* Create new metadata for new array as described. This could
1084 * be a new container, or an array in a pre-existing container.
1085 * Also used to zero metadata prior to writing it to invalidate old
1086 * metadata.
1087 */
1088 int (*init_super)(struct supertype *st, mdu_array_info_t *info,
1089 struct shape *s, char *name,
1090 char *homehost, int *uuid,
1091 unsigned long long data_offset);
1092
1093 /* update the metadata to include new device, either at create or
1094 * when hot-adding a spare.
1095 */
1096 int (*add_to_super)(struct supertype *st, mdu_disk_info_t *dinfo,
1097 int fd, char *devname,
1098 unsigned long long data_offset);
1099 /* update the metadata to delete a device,
1100 * when hot-removing.
1101 */
1102 int (*remove_from_super)(struct supertype *st, mdu_disk_info_t *dinfo);
1103
1104 /* Write metadata to one device when fixing problems or adding
1105 * a new device.
1106 */
1107 int (*store_super)(struct supertype *st, int fd);
1108
1109 /* Write all metadata for this array.
1110 */
1111 int (*write_init_super)(struct supertype *st);
1112 /* Check if metadata read from one device is compatible with an array,
1113 * used when assembling an array, or pseudo-assembling was with
1114 * "--examine --brief"
1115 * If "st" has not yet been loaded the superblock from, "tst" is
1116 * moved in, otherwise the superblock in 'st' is compared with
1117 * 'tst'.
1118 */
1119 int (*compare_super)(struct supertype *st, struct supertype *tst,
1120 int verbose);
1121 /* Load metadata from a single device. If 'devname' is not NULL
1122 * print error messages as appropriate */
1123 int (*load_super)(struct supertype *st, int fd, char *devname);
1124 /* 'fd' is a 'container' md array - load array metadata from the
1125 * whole container.
1126 */
1127 int (*load_container)(struct supertype *st, int fd, char *devname);
1128 /* If 'arg' is a valid name of this metadata type, allocate and
1129 * return a 'supertype' for the particular minor version */
1130 struct supertype * (*match_metadata_desc)(char *arg);
1131 /* If a device has the given size, and the data_offset has been
1132 * requested - work out how much space is available for data.
1133 * This involves adjusting for reserved space (e.g. bitmaps)
1134 * and for any rounding.
1135 * 'mdadm' only calls this for existing arrays where a possible
1136 * spare is being added. However some super-handlers call it
1137 * internally from validate_geometry when creating an array.
1138 */
1139 __u64 (*avail_size)(struct supertype *st, __u64 size,
1140 unsigned long long data_offset);
1141 /*
1142 * Return spare criteria for array:
1143 * - minimum disk size can be used in array;
1144 * - sector size can be used in array.
1145 */
1146 mdadm_status_t (*get_spare_criteria)(struct supertype *st, char *mddev_path,
1147 struct spare_criteria *sc);
1148 /* Find somewhere to put a bitmap - possibly auto-size it - and
1149 * update the metadata to record this. The array may be newly
1150 * created, in which case data_size may be updated, or it might
1151 * already exist. Metadata handler can know if init_super
1152 * has been called, but not write_init_super.
1153 * 0: Success
1154 * -Exxxx: On error
1155 */
1156 int (*add_internal_bitmap)(struct supertype *st, int *chunkp,
1157 int delay, int write_behind,
1158 unsigned long long size, int may_change, int major);
1159 /* Perform additional setup required to activate a bitmap.
1160 */
1161 int (*set_bitmap)(struct supertype *st, struct mdinfo *info);
1162 /* Seek 'fd' to start of write-intent-bitmap. Must be an
1163 * md-native format bitmap
1164 */
1165 int (*locate_bitmap)(struct supertype *st, int fd, int node_num);
1166 /* if add_internal_bitmap succeeded for existing array, this
1167 * writes it out.
1168 */
1169 int (*write_bitmap)(struct supertype *st, int fd, enum bitmap_update update);
1170 /* Free the superblock and any other allocated data */
1171 void (*free_super)(struct supertype *st);
1172
1173 /* validate_geometry is called with an st returned by
1174 * match_metadata_desc.
1175 * It should check that the geometry described is compatible with
1176 * the metadata type. It will be called repeatedly as devices
1177 * added to validate changing size and new devices. If there are
1178 * inter-device dependencies, it should record sufficient details
1179 * so these can be validated.
1180 * Both 'size' and '*freesize' are in sectors. chunk is KiB.
1181 * Return value is:
1182 * 1: everything is OK
1183 * 0: not OK for some reason - if 'verbose', then error was reported.
1184 * -1: st->sb was NULL, 'subdev' is a member of a container of this
1185 * type, but array is not acceptable for some reason
1186 * message was reported even if verbose is 0.
1187 */
1188 int (*validate_geometry)(struct supertype *st, int level, int layout,
1189 int raiddisks,
1190 int *chunk, unsigned long long size,
1191 unsigned long long data_offset,
1192 char *subdev, unsigned long long *freesize,
1193 int consistency_policy, int verbose);
1194
1195 /**
1196 * test_and_add_drive_policies() - test new and add custom policies from metadata handler.
1197 * @pols: list of currently recorded policies.
1198 * @disk_fd: file descriptor of the device to check.
1199 * @verbose: verbose flag.
1200 *
1201 * Used by IMSM to verify all drives in container/array, against requirements not recored
1202 * in superblock, like controller type for IMSM. It should check all drives even if
1203 * they are not actually used, because mdmon or kernel are free to use any drive assigned to
1204 * container automatically.
1205 *
1206 * Generating and comparison methods belong to metadata handler. It is not mandatory to be
1207 * implemented.
1208 *
1209 * Return: MDADM_STATUS_SUCCESS is expected on success.
1210 */
1211 mdadm_status_t (*test_and_add_drive_policies)(dev_policy_t **pols, int disk_fd,
1212 const int verbose);
1213
1214 /* Return a linked list of 'mdinfo' structures for all arrays
1215 * in the container. For non-containers, it is like
1216 * getinfo_super with an allocated mdinfo.*/
1217 struct mdinfo *(*container_content)(struct supertype *st, char *subarray);
1218 /* query the supertype for default geometry */
1219 void (*default_geometry)(struct supertype *st, int *level, int *layout, int *chunk); /* optional */
1220 /* Permit subarray's to be deleted from inactive containers */
1221 int (*kill_subarray)(struct supertype *st,
1222 char *subarray_id); /* optional */
1223 /**
1224 * update_subarray() - Permit subarray to be modified.
1225 * @st: Supertype.
1226 * @subarray: Subarray name.
1227 * @update: Update option.
1228 * @ident: Optional identifiers.
1229 */
1230 int (*update_subarray)(struct supertype *st, char *subarray,
1231 enum update_opt update, struct mddev_ident *ident);
1232 /* Check if reshape is supported for this external format.
1233 * st is obtained from super_by_fd() where st->subarray[0] is
1234 * initialized to indicate if reshape is being performed at the
1235 * container or subarray level
1236 */
1237
1238 int (*reshape_super)(struct supertype *st, struct shape *shape, struct context *c);
1239 int (*manage_reshape)( /* optional */
1240 int afd, struct mdinfo *sra, struct reshape *reshape,
1241 struct supertype *st, unsigned long blocks,
1242 int *fds, unsigned long long *offsets,
1243 int dests, int *destfd, unsigned long long *destoffsets);
1244
1245/* for mdmon */
1246 int (*open_new)(struct supertype *c, struct active_array *a,
1247 int inst);
1248
1249 /* Tell the metadata handler the current state of the array.
1250 * This covers whether it is known to be consistent (no pending writes)
1251 * and how far along a resync is known to have progressed
1252 * (in a->resync_start).
1253 * resync status is really irrelevant if the array is not consistent,
1254 * but some metadata (DDF!) have a place to record the distinction.
1255 * If 'consistent' is '2', then the array can mark it dirty if a
1256 * resync/recovery/whatever is required, or leave it clean if not.
1257 * Return value is 0 dirty (not consistent) and 1 if clean.
1258 * it is only really important if consistent is passed in as '2'.
1259 */
1260 int (*set_array_state)(struct active_array *a, int consistent);
1261
1262 /* When the state of a device might have changed, we call set_disk to
1263 * tell the metadata what the current state is.
1264 * Typically this happens on spare->in_sync and (spare|in_sync)->faulty
1265 * transitions.
1266 * set_disk might be called when the state of the particular disk has
1267 * not in fact changed.
1268 */
1269 void (*set_disk)(struct active_array *a, int n, int state);
1270 void (*sync_metadata)(struct supertype *st);
1271 void (*process_update)(struct supertype *st,
1272 struct metadata_update *update);
1273 /* Prepare updates allocates extra memory that might be
1274 * needed. If the update cannot be understood, return 0.
1275 */
1276 int (*prepare_update)(struct supertype *st,
1277 struct metadata_update *update);
1278
1279 /* activate_spare will check if the array is degraded and, if it
1280 * is, try to find some spare space in the container.
1281 * On success, it add appropriate updates (For process_update) to
1282 * to the 'updates' list and returns a list of 'mdinfo' identifying
1283 * the device, or devices as there might be multiple missing
1284 * devices and multiple spares available.
1285 */
1286 struct mdinfo *(*activate_spare)(struct active_array *a,
1287 struct metadata_update **updates);
1288
1289 /* for external backup area */
1290 int (*recover_backup)(struct supertype *st, struct mdinfo *info);
1291
1292 /* validate container after assemble */
1293 int (*validate_container)(struct mdinfo *info);
1294
1295 /* write initial empty PPL on device */
1296 int (*write_init_ppl)(struct supertype *st, struct mdinfo *info, int fd);
1297
1298 /* validate ppl before assemble */
1299 int (*validate_ppl)(struct supertype *st, struct mdinfo *info,
1300 struct mdinfo *disk);
1301
1302 /* records new bad block in metadata */
1303 int (*record_bad_block)(struct active_array *a, int n,
1304 unsigned long long sector, int length);
1305
1306 /* clears bad block from metadata */
1307 int (*clear_bad_block)(struct active_array *a, int n,
1308 unsigned long long sector, int length);
1309
1310 /* get list of bad blocks from metadata */
1311 struct md_bb *(*get_bad_blocks)(struct active_array *a, int n);
1312
1313 int swapuuid; /* true if uuid is bigending rather than hostendian */
1314 int external;
1315 const char *name; /* canonical metadata name */
1316} *superlist[];
1317
1318extern struct superswitch super0, super1;
1319extern struct superswitch super_imsm, super_ddf;
1320extern struct superswitch mbr, gpt;
1321
1322void imsm_set_no_platform(int v);
1323
1324struct metadata_update {
1325 int len;
1326 char *buf;
1327 void *space; /* allocated space that monitor will use */
1328 void **space_list; /* list of allocated spaces that monitor can
1329 * use or that it returned.
1330 */
1331 struct metadata_update *next;
1332};
1333
1334/* A supertype holds a particular collection of metadata.
1335 * It identifies the metadata type by the superswitch, and the particular
1336 * sub-version of that metadata type.
1337 * metadata read in or created is stored in 'sb' and 'info'.
1338 * There are also fields used by mdmon to track containers.
1339 *
1340 * A supertype may refer to:
1341 * Just an array, possibly in a container
1342 * A container, not identifying any particular array
1343 * Info read from just one device, not yet fully describing the array/container.
1344 *
1345 *
1346 * A supertype is created by:
1347 * super_by_fd
1348 * guess_super
1349 * dup_super
1350 */
1351struct supertype {
1352 struct superswitch *ss;
1353 int minor_version;
1354 int max_devs;
1355 char container_devnm[32]; /* devnm of container */
1356 void *sb;
1357 void *info;
1358 void *other; /* Hack used to convert v0.90 to v1.0 */
1359 unsigned long long devsize;
1360 unsigned long long data_offset; /* used by v1.x only */
1361 int ignore_hw_compat; /* used to inform metadata handlers that it should ignore
1362 HW/firmware related incompatability to load metadata.
1363 Used when examining metadata to display content of disk
1364 when user has no hw/firmare compatible system.
1365 */
1366 struct metadata_update *updates;
1367 struct metadata_update **update_tail;
1368
1369 /* extra stuff used by mdmon */
1370 struct active_array *arrays;
1371 int sock; /* listen to external programs */
1372 char devnm[32]; /* e.g. md0. This appears in metadata_version:
1373 * external:/md0/12
1374 */
1375 int devcnt;
1376 int retry_soon;
1377 int nodes;
1378 char *cluster_name;
1379
1380 struct mdinfo *devs;
1381
1382};
1383
1384extern struct supertype *super_by_fd(int fd, char **subarray);
1385enum guess_types { guess_any, guess_array, guess_partitions };
1386extern struct supertype *guess_super_type(int fd, enum guess_types guess_type);
1387static inline struct supertype *guess_super(int fd) {
1388 return guess_super_type(fd, guess_any);
1389}
1390extern struct supertype *dup_super(struct supertype *st);
1391extern int get_dev_size(int fd, char *dname, unsigned long long *sizep);
1392extern int get_dev_sector_size(int fd, char *dname, unsigned int *sectsizep);
1393extern int must_be_container(int fd);
1394void wait_for(char *dev, int fd);
1395
1396extern char pol_act[], pol_domain[], pol_metadata[], pol_auto[];
1397
1398/* iterate over the sublist starting at list, having the same
1399 * 'name' as 'list', and matching the given metadata (Where
1400 * NULL matches anything
1401 */
1402#define pol_for_each(item, list, _metadata) \
1403 for (item = list; \
1404 item && item->name == list->name; \
1405 item = item->next) \
1406 if (!(!_metadata || !item->metadata || _metadata == item->metadata)) \
1407 ; else
1408
1409/*
1410 * policy records read from mdadm are largely just name-value pairs.
1411 * The names are constants, not strdupped
1412 */
1413struct pol_rule {
1414 struct pol_rule *next;
1415 char *type; /* rule_policy or rule_part */
1416 struct rule {
1417 struct rule *next;
1418 char *name;
1419 char *value;
1420 char *dups; /* duplicates of 'value' with a partNN appended */
1421 } *rule;
1422};
1423
1424extern char rule_policy[], rule_part[];
1425extern char rule_path[], rule_type[];
1426extern char type_part[], type_disk[];
1427
1428extern void policyline(char *line, char *type);
1429extern void policy_add(char *type, ...);
1430extern void policy_free(void);
1431
1432extern struct dev_policy *path_policy(char **paths, char *type);
1433extern struct dev_policy *disk_policy(struct mdinfo *disk);
1434extern struct dev_policy *devid_policy(int devid);
1435extern void dev_policy_free(struct dev_policy *p);
1436
1437extern void pol_add(struct dev_policy **pol, char *name, char *val, char *metadata);
1438extern struct dev_policy *pol_find(struct dev_policy *pol, char *name);
1439
1440extern mdadm_status_t drive_test_and_add_policies(struct supertype *st, dev_policy_t **pols,
1441 int fd, const int verbose);
1442extern mdadm_status_t sysfs_test_and_add_drive_policies(struct supertype *st, dev_policy_t **pols,
1443 struct mdinfo *mdi, const int verbose);
1444extern mdadm_status_t mddev_test_and_add_drive_policies(struct supertype *st, dev_policy_t **pols,
1445 int array_fd, const int verbose);
1446
1447enum policy_action {
1448 act_default,
1449 act_include,
1450 act_re_add,
1451 act_spare, /* This only applies to bare devices */
1452 act_spare_same_slot, /* this allows non-bare devices,
1453 * but only if recent removal */
1454 act_force_spare, /* this allow non-bare devices in any case */
1455 act_err
1456};
1457
1458extern int policy_action_allows(struct dev_policy *plist, const char *metadata,
1459 enum policy_action want);
1460extern int disk_action_allows(struct mdinfo *disk, const char *metadata,
1461 enum policy_action want);
1462
1463struct domainlist {
1464 struct domainlist *next;
1465 const char *dom;
1466};
1467
1468extern int domain_test(struct domainlist *dom, struct dev_policy *pol,
1469 const char *metadata);
1470extern struct domainlist *domain_from_array(struct mdinfo *mdi,
1471 const char *metadata);
1472extern void domainlist_add_dev(struct domainlist **dom, int devid,
1473 const char *metadata);
1474extern void domain_free(struct domainlist *dl);
1475extern void domain_merge(struct domainlist **domp, struct dev_policy *pol,
1476 const char *metadata);
1477void domain_add(struct domainlist **domp, char *domain);
1478
1479extern void policy_save_path(char *id_path, struct map_ent *array);
1480extern int policy_check_path(struct mdinfo *disk, struct map_ent *array);
1481
1482extern void sysfs_rules_apply(char *devnm, struct mdinfo *dev);
1483extern void sysfsline(char *line);
1484
1485#if __GNUC__ < 3
1486struct stat64;
1487#endif
1488
1489extern int add_dev(const char *name, const struct stat *stb, int flag, struct FTW *s);
1490
1491extern int Manage_ro(char *devname, int fd, int readonly);
1492extern int Manage_run(char *devname, int fd, struct context *c);
1493extern int Manage_stop(char *devname, int fd, int quiet,
1494 int will_retry);
1495extern int Manage_subdevs(char *devname, int fd,
1496 struct mddev_dev *devlist, int verbose, int test,
1497 enum update_opt update, int force);
1498extern int autodetect(void);
1499extern int Grow_Add_device(char *devname, int fd, char *newdev);
1500extern int Grow_addbitmap(char *devname, int fd,
1501 struct context *c, struct shape *s);
1502extern int Grow_reshape(char *devname, int fd,
1503 struct mddev_dev *devlist,
1504 struct context *c, struct shape *s);
1505extern int Grow_restart(struct supertype *st, struct mdinfo *info,
1506 int *fdlist, int cnt, char *backup_file, int verbose);
1507extern int Grow_continue(int mdfd, struct supertype *st,
1508 struct mdinfo *info, int forked, struct context *c);
1509extern int Grow_consistency_policy(char *devname, int fd,
1510 struct context *c, struct shape *s);
1511
1512extern int restore_backup(struct supertype *st,
1513 struct mdinfo *content,
1514 int working_disks,
1515 int spares,
1516 char **backup_filep,
1517 int verbose);
1518extern int Grow_continue_command(char *devname, int fd, struct context *c);
1519
1520extern int Assemble(char *mddev, struct mddev_ident *ident,
1521 struct mddev_dev *devlist, struct context *c);
1522
1523extern int Build(struct mddev_ident *ident, struct mddev_dev *devlist, struct shape *s,
1524 struct context *c);
1525
1526extern int Create(struct supertype *st, struct mddev_ident *ident, int subdevs,
1527 struct mddev_dev *devlist, struct shape *s, struct context *c);
1528
1529extern int Detail(char *dev, struct context *c);
1530extern int Detail_Platform(struct superswitch *ss, int scan, int verbose, int export, char *controller_path);
1531extern int Query(char *dev);
1532extern int ExamineBadblocks(char *devname, int brief, struct supertype *forcest);
1533extern int Examine(struct mddev_dev *devlist, struct context *c,
1534 struct supertype *forcest);
1535extern int Monitor(struct mddev_dev *devlist,
1536 char *mailaddr, char *alert_cmd,
1537 struct context *c,
1538 int daemonise, int oneshot,
1539 int dosyslog, char *pidfile, int increments,
1540 int share);
1541
1542extern int Kill(char *dev, struct supertype *st, int force, int verbose, int noexcl);
1543extern int Kill_subarray(char *dev, char *subarray, int verbose);
1544extern int Update_subarray(char *dev, char *subarray, enum update_opt update, struct mddev_ident *ident, int quiet);
1545extern int Wait(char *dev);
1546extern int WaitClean(char *dev, int verbose);
1547extern int SetAction(char *dev, char *action);
1548
1549extern int Incremental(struct mddev_dev *devlist, struct context *c,
1550 struct supertype *st);
1551extern void RebuildMap(void);
1552extern int IncrementalScan(struct context *c, char *devnm);
1553extern int Incremental_remove(char *devname, char *path, int verbose);
1554extern int CreateBitmap(char *filename, int force, char uuid[16],
1555 unsigned long chunksize, unsigned long daemon_sleep,
1556 unsigned long write_behind,
1557 unsigned long long array_size,
1558 int major);
1559extern int ExamineBitmap(char *filename, int brief, struct supertype *st);
1560extern int IsBitmapDirty(char *filename);
1561extern int Write_rules(char *rule_name);
1562extern int bitmap_update_uuid(int fd, int *uuid, int swap);
1563
1564/* calculate the size of the bitmap given the array size and bitmap chunksize */
1565static inline unsigned long long
1566bitmap_bits(unsigned long long array_size, unsigned long chunksize)
1567{
1568 return (array_size * 512 + chunksize - 1) / chunksize;
1569}
1570
1571extern int Dump_metadata(char *dev, char *dir, struct context *c,
1572 struct supertype *st);
1573extern int Restore_metadata(char *dev, char *dir, struct context *c,
1574 struct supertype *st, int only);
1575
1576int md_array_valid(int fd);
1577int md_array_active(int fd);
1578int md_array_is_active(struct mdinfo *info);
1579int md_get_array_info(int fd, struct mdu_array_info_s *array);
1580int md_set_array_info(int fd, struct mdu_array_info_s *array);
1581int md_get_disk_info(int fd, struct mdu_disk_info_s *disk);
1582extern int get_linux_version(void);
1583extern int mdadm_version(char *version);
1584extern unsigned long long parse_size(char *size);
1585extern int parse_uuid(char *str, int uuid[4]);
1586int default_layout(struct supertype *st, int level, int verbose);
1587extern int is_near_layout_10(int layout);
1588extern int parse_layout_10(char *layout);
1589extern int parse_layout_faulty(char *layout);
1590extern int parse_num(int *dest, const char *num);
1591extern int parse_cluster_confirm_arg(char *inp, char **devname, int *slot);
1592extern int check_ext2(int fd, char *name);
1593extern int check_reiser(int fd, char *name);
1594extern int check_raid(int fd, char *name);
1595extern int check_partitions(int fd, char *dname,
1596 unsigned long long freesize,
1597 unsigned long long size);
1598extern bool is_name_posix_compatible(const char *path);
1599extern int fstat_is_blkdev(int fd, char *devname, dev_t *rdev);
1600extern int stat_is_blkdev(char *devname, dev_t *rdev);
1601
1602extern bool is_string_lq(const char * const str, size_t max_len);
1603extern bool is_dev_alive(char *path);
1604extern int get_mdp_major(void);
1605extern int get_maj_min(char *dev, int *major, int *minor);
1606extern bool is_bit_set(int *val, unsigned char index);
1607extern int dev_open(char *dev, int flags);
1608extern int open_dev(char *devnm);
1609extern void reopen_mddev(int mdfd);
1610extern int open_dev_flags(char *devnm, int flags);
1611extern int open_dev_excl(char *devnm);
1612extern int is_standard(char *dev, int *nump);
1613extern int same_dev(char *one, char *two);
1614extern int compare_paths (char* path1,char* path2);
1615extern void enable_fds(int devices);
1616extern void manage_fork_fds(int close_all);
1617extern mdadm_status_t continue_via_systemd(char *devnm, char *service_name, char *prefix);
1618
1619extern void ident_init(struct mddev_ident *ident);
1620extern mdadm_status_t ident_set_devname(struct mddev_ident *ident, const char *devname);
1621extern mdadm_status_t ident_set_name(struct mddev_ident *ident, const char *name);
1622
1623extern int parse_auto(char *str, char *msg, int config);
1624extern struct mddev_ident *conf_get_ident(char *dev);
1625extern struct mddev_dev *conf_get_devs(void);
1626extern int conf_test_dev(char *devname);
1627extern int conf_test_metadata(const char *version, struct dev_policy *pol, int is_homehost);
1628extern struct createinfo *conf_get_create_info(void);
1629extern void set_conffile(char *file);
1630extern char *conf_get_mailaddr(void);
1631extern char *conf_get_mailfrom(void);
1632extern char *conf_get_program(void);
1633extern char *conf_get_homehost(int *require_homehostp);
1634extern char *conf_get_homecluster(void);
1635extern int conf_get_monitor_delay(void);
1636extern bool conf_get_sata_opal_encryption_no_verify(void);
1637extern char *conf_line(FILE *file);
1638extern char *conf_word(FILE *file, int allow_key);
1639extern void print_quoted(char *str);
1640extern int use_udev(void);
1641extern void print_escape(char *str);
1642extern unsigned long GCD(unsigned long a, unsigned long b);
1643extern int conf_name_is_free(char *name);
1644extern bool is_devname_ignore(const char *devname);
1645extern bool is_devname_md_numbered(const char *devname);
1646extern bool is_devname_md_d_numbered(const char *devname);
1647extern int conf_verify_devnames(struct mddev_ident *array_list);
1648extern int devname_matches(char *name, char *match);
1649extern struct mddev_ident *conf_match(struct supertype *st,
1650 struct mdinfo *info,
1651 char *devname,
1652 int verbose, int *rvp);
1653
1654extern void free_line(char *line);
1655extern int match_oneof(char *devices, char *devname);
1656extern void uuid_from_super(int uuid[4], mdp_super_t *super);
1657extern const int uuid_zero[4];
1658extern int same_uuid(int a[4], int b[4], int swapuuid);
1659extern void copy_uuid(void *a, int b[4], int swapuuid);
1660extern char *__fname_from_uuid(int id[4], int swap, char *buf, char sep);
1661extern char *fname_from_uuid(struct mdinfo *info, char *buf);
1662extern unsigned long calc_csum(void *super, int bytes);
1663extern int enough(int level, int raid_disks, int layout, int clean,
1664 char *avail);
1665extern int ask(char *mesg);
1666extern unsigned long long get_component_size(int fd);
1667extern void remove_partitions(int fd);
1668extern int test_partition(int fd);
1669extern int test_partition_from_id(dev_t id);
1670extern int get_data_disks(int level, int layout, int raid_disks);
1671extern unsigned long long calc_array_size(int level, int raid_disks, int layout,
1672 int chunksize, unsigned long long devsize);
1673extern int flush_metadata_updates(struct supertype *st);
1674extern void append_metadata_update(struct supertype *st, void *buf, int len);
1675extern int assemble_container_content(struct supertype *st, int mdfd,
1676 struct mdinfo *content,
1677 struct context *c,
1678 char *chosen_name, int *result);
1679#define INCR_NO 1
1680#define INCR_UNSAFE 2
1681#define INCR_ALREADY 4
1682#define INCR_YES 8
1683
1684extern bool devid_matches_criteria(struct supertype *st, dev_t devid, struct spare_criteria *sc);
1685extern bool disk_fd_matches_criteria(struct supertype *st, int disk_fd, struct spare_criteria *sc);
1686extern struct mdinfo *container_choose_spares(struct supertype *st,
1687 struct spare_criteria *criteria,
1688 struct domainlist *domlist,
1689 char *spare_group,
1690 const char *metadata, int get_one);
1691extern int move_spare(char *from_devname, char *to_devname, dev_t devid);
1692extern int add_disk(int mdfd, struct supertype *st,
1693 struct mdinfo *sra, struct mdinfo *info);
1694extern int remove_disk(int mdfd, struct supertype *st,
1695 struct mdinfo *sra, struct mdinfo *info);
1696extern int hot_remove_disk(int mdfd, unsigned long dev, int force);
1697extern int sys_hot_remove_disk(int statefd, int force);
1698extern int set_array_info(int mdfd, struct supertype *st, struct mdinfo *info);
1699unsigned long long min_recovery_start(struct mdinfo *array);
1700
1701extern char *human_size(long long bytes);
1702extern char *human_size_brief(long long bytes, int prefix);
1703extern void print_r10_layout(int layout);
1704
1705extern void put_md_name(char *name);
1706extern char *devid2kname(dev_t devid);
1707extern char *devid2devnm(dev_t devid);
1708extern dev_t devnm2devid(char *devnm);
1709extern char *get_md_name(char *devnm);
1710
1711extern char DefaultConfFile[];
1712
1713extern int create_mddev(char *dev, char *name, int trustworthy, char *chosen, int block_udev);
1714/* values for 'trustworthy' */
1715#define LOCAL 1
1716#define LOCAL_ANY 10
1717#define FOREIGN 2
1718#define METADATA 3
1719extern int open_mddev(char *dev, int report_errors);
1720extern int is_mddev(char *dev);
1721extern int open_container(int fd);
1722extern int metadata_container_matches(char *metadata, char *devnm);
1723extern int metadata_subdev_matches(char *metadata, char *devnm);
1724extern bool is_container_member(struct mdstat_ent *ent, char *devname);
1725extern int is_subarray_active(char *subarray, char *devname);
1726extern int open_subarray(char *dev, char *subarray, struct supertype *st, int quiet);
1727extern struct superswitch *version_to_superswitch(char *vers);
1728
1729extern mdadm_status_t wait_for_mdmon_control_socket(const char *container_devnm);
1730extern int mdmon_running(const char *devnm);
1731extern int mdmon_pid(const char *devnm);
1732extern mdadm_status_t wait_for_mdmon(const char *devnm);
1733
1734extern int check_env(char *name);
1735extern __u32 random32(void);
1736extern void random_uuid(__u8 *buf);
1737extern int start_mdmon(char *devnm);
1738
1739extern int child_monitor(int afd, struct mdinfo *sra, struct reshape *reshape,
1740 struct supertype *st, unsigned long stripes,
1741 int *fds, unsigned long long *offsets,
1742 int dests, int *destfd, unsigned long long *destoffsets);
1743void abort_reshape(struct mdinfo *sra);
1744
1745void *super1_make_v0(struct supertype *st, struct mdinfo *info, mdp_super_t *sb0);
1746
1747extern char *stat2kname(struct stat *st);
1748extern char *fd2kname(int fd);
1749extern char *stat2devnm(struct stat *st);
1750bool stat_is_md_dev(struct stat *st);
1751extern char *fd2devnm(int fd);
1752
1753extern int in_initrd(void);
1754
1755struct cmap_hooks {
1756 void *cmap_handle; /* corosync lib related */
1757
1758 int (*initialize)(cmap_handle_t *handle);
1759 int (*get_string)(cmap_handle_t handle,
1760 const char *string,
1761 char **name);
1762 int (*finalize)(cmap_handle_t handle);
1763};
1764
1765extern void set_cmap_hooks(void);
1766extern void set_hooks(void);
1767
1768struct dlm_hooks {
1769 void *dlm_handle; /* dlm lib related */
1770
1771 dlm_lshandle_t (*create_lockspace)(const char *name,
1772 unsigned int mode);
1773 dlm_lshandle_t (*open_lockspace)(const char *name);
1774 int (*release_lockspace)(const char *name, dlm_lshandle_t ls,
1775 int force);
1776 int (*ls_lock)(dlm_lshandle_t lockspace, uint32_t mode,
1777 struct dlm_lksb *lksb, uint32_t flags,
1778 const void *name, unsigned int namelen,
1779 uint32_t parent, void (*astaddr) (void *astarg),
1780 void *astarg, void (*bastaddr) (void *astarg),
1781 void *range);
1782 int (*ls_unlock_wait)(dlm_lshandle_t lockspace, uint32_t lkid,
1783 uint32_t flags, struct dlm_lksb *lksb);
1784 int (*ls_get_fd)(dlm_lshandle_t ls);
1785 int (*dispatch)(int fd);
1786};
1787
1788extern int get_cluster_name(char **name);
1789extern int dlm_funs_ready(void);
1790extern int cluster_get_dlmlock(void);
1791extern int cluster_release_dlmlock(void);
1792extern void set_dlm_hooks(void);
1793
1794#define MSEC_TO_NSEC(msec) ((msec) * 1000000)
1795#define USEC_TO_NSEC(usec) ((usec) * 1000)
1796extern void sleep_for(unsigned int sec, long nsec, bool wake_after_interrupt);
1797extern bool is_directory(const char *path);
1798extern bool is_file(const char *path);
1799extern int s_gethostname(char *buf, int buf_len);
1800
1801#define _ROUND_UP(val, base) (((val) + (base) - 1) & ~(base - 1))
1802#define ROUND_UP(val, base) _ROUND_UP(val, (typeof(val))(base))
1803#define ROUND_UP_PTR(ptr, base) ((typeof(ptr)) \
1804 (ROUND_UP((unsigned long)(ptr), base)))
1805
1806static inline int is_subarray(char *vers)
1807{
1808 /* The version string for a 'subarray' (an array in a container)
1809 * is
1810 * /containername/componentname for normal read-write arrays
1811 * -containername/componentname for arrays which mdmon must not
1812 * reconfigure. They might be read-only
1813 * or might be undergoing reshape etc.
1814 * containername is e.g. md0, md_d1
1815 * componentname is dependant on the metadata. e.g. '1' 'S1' ...
1816 */
1817 return (*vers == '/' || *vers == '-');
1818}
1819
1820static inline char *to_subarray(struct mdstat_ent *ent, char *container)
1821{
1822 return &ent->metadata_version[10+strlen(container)+1];
1823}
1824
1825/**
1826 * signal_s() - Wrapper for sigaction() with signal()-like interface.
1827 * @sig: The signal to set the signal handler to.
1828 * @handler: The signal handler.
1829 *
1830 * Return: previous handler or SIG_ERR on failure.
1831 */
1832static inline sighandler_t signal_s(int sig, sighandler_t handler)
1833{
1834 struct sigaction new_act = {0};
1835 struct sigaction old_act = {0};
1836
1837 new_act.sa_handler = handler;
1838
1839 if (sigaction(sig, &new_act, &old_act) == 0)
1840 return old_act.sa_handler;
1841
1842 return SIG_ERR;
1843}
1844
1845#ifdef DEBUG
1846#include <time.h>
1847
1848#define dprintf(fmt, arg...) \
1849 do { \
1850 struct timespec ts; \
1851 clock_gettime(CLOCK_MONOTONIC, &ts); \
1852 double timestamp = ts.tv_sec + ts.tv_nsec / 1e9; \
1853 fprintf(stderr, "[%10.5f] %s: %s: " fmt, timestamp, Name, __func__, ##arg); \
1854 } while (0)
1855
1856#define dprintf_cont(fmt, arg...) \
1857 fprintf(stderr, fmt, ##arg)
1858#else
1859#define dprintf(fmt, arg...) \
1860 do { } while (0)
1861#define dprintf_cont(fmt, arg...) \
1862 do { } while (0)
1863#endif
1864
1865static inline int xasprintf(char **strp, const char *fmt, ...) {
1866 va_list ap;
1867 int ret;
1868 va_start(ap, fmt);
1869 ret = vasprintf(strp, fmt, ap);
1870 va_end(ap);
1871 assert(ret >= 0);
1872 return ret;
1873}
1874
1875#ifdef DEBUG
1876#define pr_err(fmt, args...) fprintf(stderr, "%s: %s: "fmt, Name, __func__, ##args)
1877#else
1878#define pr_err(fmt, args...) fprintf(stderr, "%s: "fmt, Name, ##args)
1879#endif
1880#define cont_err(fmt ...) fprintf(stderr, " " fmt)
1881
1882#define pr_info(fmt, args...) printf("%s: "fmt, Name, ##args)
1883
1884#define pr_vrb(fmt, arg...) ((void)(verbose && pr_err(fmt, ##arg)))
1885
1886#define LEVEL_MULTIPATH (-4)
1887#define LEVEL_LINEAR (-1)
1888#define LEVEL_FAULTY (-5)
1889
1890/* kernel module doesn't know about these */
1891#define LEVEL_CONTAINER (-100)
1892#define LEVEL_UNSUPPORTED (-200)
1893
1894/* the kernel does know about this one ... */
1895#define LEVEL_NONE (-1000000)
1896
1897/* faulty stuff */
1898
1899#define WriteTransient 0
1900#define ReadTransient 1
1901#define WritePersistent 2
1902#define ReadPersistent 3
1903#define WriteAll 4 /* doesn't go to device */
1904#define ReadFixable 5
1905#define Modes 6
1906
1907#define ClearErrors 31
1908#define ClearFaults 30
1909
1910#define AllPersist 100 /* internal use only */
1911#define NoPersist 101
1912
1913#define ModeMask 0x1f
1914#define ModeShift 5
1915
1916#ifdef __TINYC__
1917#undef minor
1918#undef major
1919#undef makedev
1920#define minor(x) ((x)&0xff)
1921#define major(x) (((x)>>8)&0xff)
1922#define makedev(M,m) (((M)<<8) | (m))
1923#endif
1924
1925enum r0layout {
1926 RAID0_DANGEROUS_LAYOUT = 0, /* layout depends on kernel version */
1927 RAID0_ORIG_LAYOUT = 1,
1928 RAID0_ALT_MULTIZONE_LAYOUT = 2,
1929};
1930
1931/* for raid4/5/6 */
1932#define ALGORITHM_LEFT_ASYMMETRIC 0
1933#define ALGORITHM_RIGHT_ASYMMETRIC 1
1934#define ALGORITHM_LEFT_SYMMETRIC 2
1935#define ALGORITHM_RIGHT_SYMMETRIC 3
1936
1937/* Define non-rotating (raid4) algorithms. These allow
1938 * conversion of raid4 to raid5.
1939 */
1940#define ALGORITHM_PARITY_0 4 /* P or P,Q are initial devices */
1941#define ALGORITHM_PARITY_N 5 /* P or P,Q are final devices. */
1942
1943/* DDF RAID6 layouts differ from md/raid6 layouts in two ways.
1944 * Firstly, the exact positioning of the parity block is slightly
1945 * different between the 'LEFT_*' modes of md and the "_N_*" modes
1946 * of DDF.
1947 * Secondly, or order of datablocks over which the Q syndrome is computed
1948 * is different.
1949 * Consequently we have different layouts for DDF/raid6 than md/raid6.
1950 * These layouts are from the DDFv1.2 spec.
1951 * Interestingly DDFv1.2-Errata-A does not specify N_CONTINUE but
1952 * leaves RLQ=3 as 'Vendor Specific'
1953 */
1954
1955#define ALGORITHM_ROTATING_ZERO_RESTART 8 /* DDF PRL=6 RLQ=1 */
1956#define ALGORITHM_ROTATING_N_RESTART 9 /* DDF PRL=6 RLQ=2 */
1957#define ALGORITHM_ROTATING_N_CONTINUE 10 /*DDF PRL=6 RLQ=3 */
1958
1959/* For every RAID5 algorithm we define a RAID6 algorithm
1960 * with exactly the same layout for data and parity, and
1961 * with the Q block always on the last device (N-1).
1962 * This allows trivial conversion from RAID5 to RAID6
1963 */
1964#define ALGORITHM_LEFT_ASYMMETRIC_6 16
1965#define ALGORITHM_RIGHT_ASYMMETRIC_6 17
1966#define ALGORITHM_LEFT_SYMMETRIC_6 18
1967#define ALGORITHM_RIGHT_SYMMETRIC_6 19
1968#define ALGORITHM_PARITY_0_6 20
1969#define ALGORITHM_PARITY_N_6 ALGORITHM_PARITY_N
1970
1971/* Define PATH_MAX in case we don't use glibc or standard library does
1972 * not have PATH_MAX defined. Assume max path length is 4K characters.
1973 */
1974#ifndef PATH_MAX
1975#define PATH_MAX 4096
1976#endif
1977
1978/* The max string length necessary for decimal conversion, cannot be longer than count of bits */
1979#define INT_2_DEC_STR_MAX (sizeof(int) * 8)
1980
1981#define RESYNC_NONE -1
1982#define RESYNC_DELAYED -2
1983#define RESYNC_PENDING -3
1984#define RESYNC_REMOTE -4
1985#define RESYNC_UNKNOWN -5
1986
1987/* When using "GET_DISK_INFO" it isn't certain how high
1988 * we need to check. So we impose an absolute limit of
1989 * MAX_DISKS. This needs to be much more than the largest
1990 * number of devices any metadata can support. Currently
1991 * v1.x can support 1920
1992 */
1993#define MAX_DISKS 4096
1994
1995/* Sometimes the 'size' value passed needs to mean "Maximum".
1996 * In those cases with use MAX_SIZE
1997 */
1998#define MAX_SIZE 1
1999
2000/* We want to use unsigned numbers for sector counts, but need
2001 * a value for 'invalid'. Use '1'.
2002 */
2003#define INVALID_SECTORS 1
2004/* And another special number needed for --data_offset=variable */
2005#define VARIABLE_OFFSET 3
2006
2007/**
2008 * is_container() - check if @level is &LEVEL_CONTAINER
2009 * @level: level value
2010 *
2011 * return:
2012 * 1 if level is equal to &LEVEL_CONTAINER, 0 otherwise.
2013 */
2014static inline int is_container(const int level)
2015{
2016 if (level == LEVEL_CONTAINER)
2017 return 1;
2018 return 0;
2019}
2020
2021#define STR_COMMON_NONE "none"
2022
2023/**
2024 * str_is_none() - check if @str starts with "none".
2025 * @str: string
2026 *
2027 * return:
2028 * true if string starts with "none", false otherwise.
2029 */
2030static inline bool str_is_none(char *str)
2031{
2032 if (strncmp(str, STR_COMMON_NONE, sizeof(STR_COMMON_NONE) - 1) == 0)
2033 return true;
2034 return false;
2035}