~csurbhi/+junk/mdadm.fixes

« back to all changes in this revision

Viewing changes to mdadm.h

  • Committer: Surbhi Palande
  • Date: 2010-10-19 15:01:29 UTC
  • Revision ID: surbhi.palande@canonical.com-20101019150129-n40fnr8lnpt9f5h5
bzr repository initialized. Has mdadm auto-assembly related fixes

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * mdadm - manage Linux "md" devices aka RAID arrays.
 
3
 *
 
4
 * Copyright (C) 2001-2006 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@cse.unsw.edu.au>
 
23
 *    Paper: Neil Brown
 
24
 *           School of Computer Science and Engineering
 
25
 *           The University of New South Wales
 
26
 *           Sydney, 2052
 
27
 *           Australia
 
28
 */
 
29
 
 
30
#define _GNU_SOURCE
 
31
#define _FILE_OFFSET_BITS 64
 
32
#include        <unistd.h>
 
33
#if !defined(__dietlibc__) && !defined(__KLIBC__)
 
34
extern __off64_t lseek64 __P ((int __fd, __off64_t __offset, int __whence));
 
35
#else
 
36
# if defined(__NO_STAT64) || __WORDSIZE != 32
 
37
# define lseek64 lseek
 
38
# endif
 
39
#endif
 
40
 
 
41
#include        <sys/types.h>
 
42
#include        <sys/stat.h>
 
43
#include        <stdlib.h>
 
44
#include        <time.h>
 
45
#include        <sys/time.h>
 
46
#include        <getopt.h>
 
47
#include        <fcntl.h>
 
48
#include        <stdio.h>
 
49
#include        <errno.h>
 
50
#include        <string.h>
 
51
#include        <syslog.h>
 
52
#ifdef __dietlibc__
 
53
#include        <strings.h>
 
54
/* dietlibc has deprecated random and srandom!! */
 
55
#define random rand
 
56
#define srandom srand
 
57
#endif
 
58
 
 
59
 
 
60
#include        <linux/kdev_t.h>
 
61
/*#include      <linux/fs.h> */
 
62
#include        <sys/mount.h>
 
63
#include        <asm/types.h>
 
64
#include        <sys/ioctl.h>
 
65
#define MD_MAJOR 9
 
66
#define MdpMinorShift 6
 
67
 
 
68
#ifndef BLKGETSIZE64
 
69
#define BLKGETSIZE64 _IOR(0x12,114,size_t) /* return device size in bytes (u64 *arg) */
 
70
#endif
 
71
 
 
72
#define DEFAULT_BITMAP_CHUNK 4096
 
73
#define DEFAULT_BITMAP_DELAY 5
 
74
#define DEFAULT_MAX_WRITE_BEHIND 256
 
75
 
 
76
#include        "md_u.h"
 
77
#include        "md_p.h"
 
78
#include        "bitmap.h"
 
79
 
 
80
#include <endian.h>
 
81
/* Redhat don't like to #include <asm/byteorder.h>, and
 
82
 * some time include <linux/byteorder/xxx_endian.h> isn't enough,
 
83
 * and there is no standard conversion function so... */
 
84
/* And dietlibc doesn't think byteswap is ok, so.. */
 
85
/*  #include <byteswap.h> */
 
86
#define bswap_16(x) (((x) & 0x00ffU) << 8 | \
 
87
                     ((x) & 0xff00U) >> 8)
 
88
#define bswap_32(x) (((x) & 0x000000ffU) << 24 | \
 
89
                     ((x) & 0xff000000U) >> 24 | \
 
90
                     ((x) & 0x0000ff00U) << 8  | \
 
91
                     ((x) & 0x00ff0000U) >> 8)
 
92
#define bswap_64(x) (((x) & 0x00000000000000ffULL) << 56 | \
 
93
                     ((x) & 0xff00000000000000ULL) >> 56 | \
 
94
                     ((x) & 0x000000000000ff00ULL) << 40 | \
 
95
                     ((x) & 0x00ff000000000000ULL) >> 40 | \
 
96
                     ((x) & 0x0000000000ff0000ULL) << 24 | \
 
97
                     ((x) & 0x0000ff0000000000ULL) >> 24 | \
 
98
                     ((x) & 0x00000000ff000000ULL) << 8 | \
 
99
                     ((x) & 0x000000ff00000000ULL) >> 8)
 
100
 
 
101
#if !defined(__KLIBC__)
 
102
#if BYTE_ORDER == LITTLE_ENDIAN
 
103
#define __cpu_to_le16(_x) (_x)
 
104
#define __cpu_to_le32(_x) (_x)
 
105
#define __cpu_to_le64(_x) (_x)
 
106
#define __le16_to_cpu(_x) (_x)
 
107
#define __le32_to_cpu(_x) (_x)
 
108
#define __le64_to_cpu(_x) (_x)
 
109
#elif BYTE_ORDER == BIG_ENDIAN
 
110
#define __cpu_to_le16(_x) bswap_16(_x)
 
111
#define __cpu_to_le32(_x) bswap_32(_x)
 
112
#define __cpu_to_le64(_x) bswap_64(_x)
 
113
#define __le16_to_cpu(_x) bswap_16(_x)
 
114
#define __le32_to_cpu(_x) bswap_32(_x)
 
115
#define __le64_to_cpu(_x) bswap_64(_x)
 
116
#else
 
117
#  error "unknown endianness."
 
118
#endif
 
119
#endif /* __KLIBC__ */
 
120
 
 
121
 
 
122
 
 
123
/* general information that might be extracted from a superblock */
 
124
struct mdinfo {
 
125
        mdu_array_info_t        array;
 
126
        mdu_disk_info_t         disk;
 
127
        __u64                   events;
 
128
        int                     uuid[4];
 
129
        char                    name[33];
 
130
        unsigned long long      data_offset;
 
131
        unsigned long long      component_size;
 
132
        int                     reshape_active;
 
133
        unsigned long long      reshape_progress;
 
134
        int                     new_level, delta_disks, new_layout, new_chunk;
 
135
        int                     errors;
 
136
        int                     cache_size; /* size of raid456 stripe cache*/
 
137
        int                     mismatch_cnt;
 
138
        char                    text_version[50];
 
139
 
 
140
        char            sys_name[20];
 
141
        struct mdinfo *devs;
 
142
        struct mdinfo *next;
 
143
};
 
144
 
 
145
struct createinfo {
 
146
        int     uid;
 
147
        int     gid;
 
148
        int     autof;
 
149
        int     mode;
 
150
        int     symlinks;
 
151
        struct supertype *supertype;
 
152
};
 
153
 
 
154
#define Name "mdadm"
 
155
 
 
156
enum mode {
 
157
        ASSEMBLE=1,
 
158
        BUILD,
 
159
        CREATE,
 
160
        MANAGE,
 
161
        MISC,
 
162
        MONITOR,
 
163
        GROW,
 
164
        INCREMENTAL,
 
165
        AUTODETECT,
 
166
};
 
167
 
 
168
extern char short_options[];
 
169
extern char short_bitmap_options[];
 
170
extern char short_bitmap_auto_options[];
 
171
extern struct option long_options[];
 
172
extern char Version[], Usage[], Help[], OptionHelp[],
 
173
        Help_create[], Help_build[], Help_assemble[], Help_grow[],
 
174
        Help_incr[],
 
175
        Help_manage[], Help_misc[], Help_monitor[], Help_config[];
 
176
 
 
177
/* for option that don't have short equivilents, we assign arbitrary
 
178
 * small numbers.  '1' means an undecorated option, so we start at '2'.
 
179
 */
 
180
enum special_options {
 
181
        AssumeClean = 2,
 
182
        BitmapChunk,
 
183
        WriteBehind,
 
184
        ReAdd,
 
185
        NoDegraded,
 
186
        Sparc22,
 
187
        BackupFile,
 
188
        HomeHost,
 
189
        AutoHomeHost,
 
190
        Symlinks,
 
191
        AutoDetect,
 
192
};
 
193
 
 
194
/* structures read from config file */
 
195
/* List of mddevice names and identifiers
 
196
 * Identifiers can be:
 
197
 *    uuid=128-hex-uuid
 
198
 *    super-minor=decimal-minor-number-from-superblock
 
199
 *    devices=comma,separated,list,of,device,names,with,wildcards
 
200
 *
 
201
 * If multiple fields are present, the intersection of all matching
 
202
 * devices is considered
 
203
 */
 
204
#define UnSet (0xfffe)
 
205
typedef struct mddev_ident_s {
 
206
        char    *devname;
 
207
 
 
208
        int     uuid_set;
 
209
        int     uuid[4];
 
210
        char    name[33];
 
211
 
 
212
        unsigned int super_minor;
 
213
 
 
214
        char    *devices;       /* comma separated list of device
 
215
                                 * names with wild cards
 
216
                                 */
 
217
        int     level;
 
218
        unsigned int raid_disks;
 
219
        unsigned int spare_disks;
 
220
        struct supertype *st;
 
221
        int     autof;          /* 1 for normal, 2 for partitioned */
 
222
        char    *spare_group;
 
223
        char    *bitmap_file;
 
224
        int     bitmap_fd;
 
225
 
 
226
        struct mddev_ident_s *next;
 
227
} *mddev_ident_t;
 
228
 
 
229
/* List of device names - wildcards expanded */
 
230
typedef struct mddev_dev_s {
 
231
        char *devname;
 
232
        char disposition;       /* 'a' for add, 'r' for remove, 'f' for fail.
 
233
                                 * Not set for names read from .config
 
234
                                 */
 
235
        char writemostly;
 
236
        char re_add;
 
237
        char used;              /* set when used */
 
238
        struct mddev_dev_s *next;
 
239
} *mddev_dev_t;
 
240
 
 
241
typedef struct mapping {
 
242
        char *name;
 
243
        int num;
 
244
} mapping_t;
 
245
 
 
246
 
 
247
struct mdstat_ent {
 
248
        char            *dev;
 
249
        int             devnum;
 
250
        int             active;
 
251
        char            *level;
 
252
        char            *pattern; /* U or up, _ for down */
 
253
        int             percent; /* -1 if no resync */
 
254
        int             resync; /* 1 if resync, 0 if recovery */
 
255
        struct mdstat_ent *next;
 
256
};
 
257
 
 
258
extern struct mdstat_ent *mdstat_read(int hold, int start);
 
259
extern void free_mdstat(struct mdstat_ent *ms);
 
260
extern void mdstat_wait(int seconds);
 
261
extern int mddev_busy(int devnum);
 
262
 
 
263
struct map_ent {
 
264
        struct map_ent *next;
 
265
        int     devnum;
 
266
        int     major,minor;
 
267
        int     uuid[4];
 
268
        char    *path;
 
269
};
 
270
extern int map_update(struct map_ent **mpp, int devnum, int major, int minor,
 
271
                      int uuid[4], char *path);
 
272
extern struct map_ent *map_by_uuid(struct map_ent **map, int uuid[4]);
 
273
extern void map_read(struct map_ent **melp);
 
274
extern int map_write(struct map_ent *mel);
 
275
extern void map_delete(struct map_ent **mapp, int devnum);
 
276
extern void map_free(struct map_ent *map);
 
277
extern void map_add(struct map_ent **melp,
 
278
                    int devnum, int major, int minor, int uuid[4], char *path);
 
279
extern int map_lock(struct map_ent **melp);
 
280
extern void map_unlock(struct map_ent **melp);
 
281
 
 
282
/* various details can be requested */
 
283
#define GET_LEVEL       1
 
284
#define GET_LAYOUT      2
 
285
#define GET_COMPONENT   4
 
286
#define GET_CHUNK       8
 
287
#define GET_CACHE       16
 
288
#define GET_MISMATCH    32
 
289
#define GET_VERSION     64
 
290
 
 
291
#define GET_DEVS        1024 /* gets role, major, minor */
 
292
#define GET_OFFSET      2048
 
293
#define GET_SIZE        4096
 
294
#define GET_STATE       8192
 
295
#define GET_ERROR       16384
 
296
 
 
297
/* If fd >= 0, get the array it is open on,
 
298
 * else use devnum. >=0 -> major9. <0.....
 
299
 */
 
300
extern void sysfs_free(struct mdinfo *sra);
 
301
extern struct mdinfo *sysfs_read(int fd, int devnum, unsigned long options);
 
302
extern int sysfs_set_str(struct mdinfo *sra, struct mdinfo *dev,
 
303
                         char *name, char *val);
 
304
extern int sysfs_set_num(struct mdinfo *sra, struct mdinfo *dev,
 
305
                         char *name, unsigned long long val);
 
306
extern int sysfs_get_ll(struct mdinfo *sra, struct mdinfo *dev,
 
307
                        char *name, unsigned long long *val);
 
308
 
 
309
 
 
310
extern int save_stripes(int *source, unsigned long long *offsets,
 
311
                        int raid_disks, int chunk_size, int level, int layout,
 
312
                        int nwrites, int *dest,
 
313
                        unsigned long long start, unsigned long long length);
 
314
extern int restore_stripes(int *dest, unsigned long long *offsets,
 
315
                           int raid_disks, int chunk_size, int level, int layout,
 
316
                           int source, unsigned long long read_offset,
 
317
                           unsigned long long start, unsigned long long length);
 
318
 
 
319
#ifndef Sendmail
 
320
#define Sendmail "/usr/lib/sendmail -t"
 
321
#endif
 
322
 
 
323
#define SYSLOG_FACILITY LOG_DAEMON
 
324
 
 
325
extern char *map_num(mapping_t *map, int num);
 
326
extern int map_name(mapping_t *map, char *name);
 
327
extern mapping_t r5layout[], pers[], modes[], faultylayout[];
 
328
 
 
329
extern char *map_dev(int major, int minor, int create);
 
330
 
 
331
 
 
332
extern struct superswitch {
 
333
        void (*examine_super)(struct supertype *st, char *homehost);
 
334
        void (*brief_examine_super)(struct supertype *st);
 
335
        void (*export_examine_super)(struct supertype *st);
 
336
        void (*detail_super)(struct supertype *st, char *homehost);
 
337
        void (*brief_detail_super)(struct supertype *st);
 
338
        void (*export_detail_super)(struct supertype *st);
 
339
        void (*uuid_from_super)(struct supertype *st, int uuid[4]);
 
340
        void (*getinfo_super)(struct supertype *st, struct mdinfo *info);
 
341
        int (*match_home)(struct supertype *st, char *homehost);
 
342
        int (*update_super)(struct supertype *st, struct mdinfo *info,
 
343
                            char *update,
 
344
                            char *devname, int verbose,
 
345
                            int uuid_set, char *homehost);
 
346
        int (*init_super)(struct supertype *st, mdu_array_info_t *info,
 
347
                          unsigned long long size, char *name,
 
348
                          char *homehost, int *uuid);
 
349
        void (*add_to_super)(struct supertype *st, mdu_disk_info_t *dinfo);
 
350
        int (*store_super)(struct supertype *st, int fd);
 
351
        int (*write_init_super)(struct supertype *st, mdu_disk_info_t *dinfo,
 
352
                                char *devname);
 
353
        int (*compare_super)(struct supertype *st, struct supertype *tst);
 
354
        int (*load_super)(struct supertype *st, int fd, char *devname);
 
355
        struct supertype * (*match_metadata_desc)(char *arg);
 
356
        __u64 (*avail_size)(struct supertype *st, __u64 size);
 
357
        int (*add_internal_bitmap)(struct supertype *st, int *chunkp,
 
358
                                   int delay, int write_behind,
 
359
                                   unsigned long long size, int may_change, int major);
 
360
        void (*locate_bitmap)(struct supertype *st, int fd);
 
361
        int (*write_bitmap)(struct supertype *st, int fd);
 
362
        void (*free_super)(struct supertype *st);
 
363
        int major;
 
364
        int swapuuid; /* true if uuid is bigending rather than hostendian */
 
365
} super0, super1, *superlist[];
 
366
 
 
367
struct supertype {
 
368
        struct superswitch *ss;
 
369
        int minor_version;
 
370
        int max_devs;
 
371
        void *sb;
 
372
};
 
373
 
 
374
extern struct supertype *super_by_fd(int fd);
 
375
extern struct supertype *guess_super(int fd);
 
376
extern struct supertype *dup_super(struct supertype *st);
 
377
extern int get_dev_size(int fd, char *dname, unsigned long long *sizep);
 
378
extern void get_one_disk(int mdfd, mdu_array_info_t *ainf,
 
379
                         mdu_disk_info_t *disk);
 
380
 
 
381
#if __GNUC__ < 3
 
382
struct stat64;
 
383
#endif
 
384
 
 
385
#define HAVE_NFTW  we assume
 
386
#define HAVE_FTW
 
387
 
 
388
#ifdef UCLIBC
 
389
# include <features.h>
 
390
# ifndef  __UCLIBC_HAS_FTW__
 
391
#  undef HAVE_FTW
 
392
#  undef HAVE_NFTW
 
393
# endif
 
394
#endif
 
395
 
 
396
#ifdef __dietlibc__
 
397
# undef HAVE_NFTW
 
398
#endif
 
399
 
 
400
#if defined(__KLIBC__)
 
401
# undef HAVE_NFTW
 
402
# undef HAVE_FTW
 
403
#endif
 
404
 
 
405
#ifndef HAVE_NFTW
 
406
# define FTW_PHYS 1
 
407
# ifndef HAVE_FTW
 
408
  struct FTW {};
 
409
# endif
 
410
#endif
 
411
 
 
412
#ifdef HAVE_FTW
 
413
# include <ftw.h>
 
414
#endif
 
415
 
 
416
extern int add_dev(const char *name, const struct stat *stb, int flag, struct FTW *s);
 
417
 
 
418
 
 
419
extern int Manage_ro(char *devname, int fd, int readonly);
 
420
extern int Manage_runstop(char *devname, int fd, int runstop, int quiet);
 
421
extern int Manage_resize(char *devname, int fd, long long size, int raid_disks);
 
422
extern int Manage_reconfig(char *devname, int fd, int layout);
 
423
extern int Manage_subdevs(char *devname, int fd,
 
424
                          mddev_dev_t devlist, int verbose);
 
425
extern int autodetect(void);
 
426
extern int Grow_Add_device(char *devname, int fd, char *newdev);
 
427
extern int Grow_addbitmap(char *devname, int fd, char *file, int chunk, int delay, int write_behind, int force);
 
428
extern int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
 
429
                        long long size,
 
430
                        int level, int layout, int chunksize, int raid_disks);
 
431
extern int Grow_restart(struct supertype *st, struct mdinfo *info,
 
432
                        int *fdlist, int cnt, char *backup_file);
 
433
 
 
434
 
 
435
extern int Assemble(struct supertype *st, char *mddev, int mdfd,
 
436
                    mddev_ident_t ident,
 
437
                    mddev_dev_t devlist, char *backup_file,
 
438
                    int readonly, int runstop,
 
439
                    char *update, char *homehost,
 
440
                    int verbose, int force);
 
441
 
 
442
extern int Build(char *mddev, int mdfd, int chunk, int level, int layout,
 
443
                 int raiddisks,
 
444
                 mddev_dev_t devlist, int assume_clean,
 
445
                 char *bitmap_file, int bitmap_chunk, int write_behind, int delay, int verbose);
 
446
 
 
447
 
 
448
extern int Create(struct supertype *st, char *mddev, int mdfd,
 
449
                  int chunk, int level, int layout, unsigned long long size, int raiddisks, int sparedisks,
 
450
                  char *name, char *homehost, int *uuid,
 
451
                  int subdevs, mddev_dev_t devlist,
 
452
                  int runstop, int verbose, int force, int assume_clean,
 
453
                  char *bitmap_file, int bitmap_chunk, int write_behind, int delay);
 
454
 
 
455
extern int Detail(char *dev, int brief, int export, int test, char *homehost);
 
456
extern int Query(char *dev);
 
457
extern int Examine(mddev_dev_t devlist, int brief, int export, int scan,
 
458
                   int SparcAdjust, struct supertype *forcest, char *homehost);
 
459
extern int Monitor(mddev_dev_t devlist,
 
460
                   char *mailaddr, char *alert_cmd,
 
461
                   int period, int daemonise, int scan, int oneshot,
 
462
                   int dosyslog, int test, char *pidfile);
 
463
 
 
464
extern int Kill(char *dev, int force, int quiet);
 
465
extern int Wait(char *dev);
 
466
 
 
467
extern int Incremental(char *devname, int verbose, int runstop,
 
468
                       struct supertype *st, char *homehost, int autof);
 
469
extern void RebuildMap(void);
 
470
extern int IncrementalScan(int verbose);
 
471
 
 
472
extern int CreateBitmap(char *filename, int force, char uuid[16],
 
473
                        unsigned long chunksize, unsigned long daemon_sleep,
 
474
                        unsigned long write_behind,
 
475
                        unsigned long long array_size,
 
476
                        int major);
 
477
extern int ExamineBitmap(char *filename, int brief, struct supertype *st);
 
478
extern int bitmap_update_uuid(int fd, int *uuid, int swap);
 
479
extern unsigned long bitmap_sectors(struct bitmap_super_s *bsb);
 
480
 
 
481
extern int md_get_version(int fd);
 
482
extern int get_linux_version(void);
 
483
extern int parse_uuid(char *str, int uuid[4]);
 
484
extern int check_ext2(int fd, char *name);
 
485
extern int check_reiser(int fd, char *name);
 
486
extern int check_raid(int fd, char *name);
 
487
 
 
488
extern int get_mdp_major(void);
 
489
extern int dev_open(char *dev, int flags);
 
490
extern int is_standard(char *dev, int *nump);
 
491
 
 
492
extern int parse_auto(char *str, char *msg, int config);
 
493
extern mddev_ident_t conf_get_ident(char *dev);
 
494
extern mddev_dev_t conf_get_devs(void);
 
495
extern int conf_test_dev(char *devname);
 
496
extern struct createinfo *conf_get_create_info(void);
 
497
extern void set_conffile(char *file);
 
498
extern char *conf_get_mailaddr(void);
 
499
extern char *conf_get_mailfrom(void);
 
500
extern char *conf_get_program(void);
 
501
extern char *conf_get_homehost(void);
 
502
extern char *conf_line(FILE *file);
 
503
extern char *conf_word(FILE *file, int allow_key);
 
504
extern struct mddev_ident_s *conf_match(struct mdinfo *info, struct supertype *st);
 
505
extern void free_line(char *line);
 
506
extern int match_oneof(char *devices, char *devname);
 
507
extern void uuid_from_super(int uuid[4], mdp_super_t *super);
 
508
extern int same_uuid(int a[4], int b[4], int swapuuid);
 
509
extern void copy_uuid(void *a, int b[4], int swapuuid);
 
510
extern unsigned long calc_csum(void *super, int bytes);
 
511
extern int enough(int level, int raid_disks, int layout, int clean,
 
512
                   char *avail, int avail_disks);
 
513
extern int ask(char *mesg);
 
514
extern unsigned long long get_component_size(int fd);
 
515
extern void remove_partitions(int fd);
 
516
 
 
517
 
 
518
extern char *human_size(long long bytes);
 
519
char *human_size_brief(long long bytes);
 
520
 
 
521
#define NoMdDev (1<<23)
 
522
extern int find_free_devnum(int use_partitions);
 
523
 
 
524
extern void put_md_name(char *name);
 
525
extern char *get_md_name(int dev);
 
526
 
 
527
extern char DefaultConfFile[];
 
528
 
 
529
extern int create_mddev(char *dev, int autof);
 
530
extern int create_mddev_devnum(char *devname, int devnum, char *name,
 
531
                             char *chosen_name, int parts);
 
532
 
 
533
 
 
534
#define LEVEL_MULTIPATH         (-4)
 
535
#define LEVEL_LINEAR            (-1)
 
536
#define LEVEL_FAULTY            (-5)
 
537
 
 
538
 
 
539
/* faulty stuff */
 
540
 
 
541
#define WriteTransient  0
 
542
#define ReadTransient   1
 
543
#define WritePersistent 2
 
544
#define ReadPersistent  3
 
545
#define WriteAll        4 /* doesn't go to device */
 
546
#define ReadFixable     5
 
547
#define Modes   6
 
548
 
 
549
#define ClearErrors     31
 
550
#define ClearFaults     30
 
551
 
 
552
#define AllPersist      100 /* internal use only */
 
553
#define NoPersist       101
 
554
 
 
555
#define ModeMask        0x1f
 
556
#define ModeShift       5
 
557
 
 
558
 
 
559
#ifdef __TINYC__
 
560
#undef minor
 
561
#undef major
 
562
#undef makedev
 
563
#define minor(x) ((x)&0xff)
 
564
#define major(x) (((x)>>8)&0xff)
 
565
#define makedev(M,m) (((M)<<8) | (m))
 
566
#endif
 
567
 
 
568
/* for raid5 */
 
569
#define ALGORITHM_LEFT_ASYMMETRIC       0
 
570
#define ALGORITHM_RIGHT_ASYMMETRIC      1
 
571
#define ALGORITHM_LEFT_SYMMETRIC        2
 
572
#define ALGORITHM_RIGHT_SYMMETRIC       3