X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fmdadm.git;a=blobdiff_plain;f=mdadm.h;h=a9ae698d36a1b2e7fe07f7b8e15050387b4454cc;hp=f03454df7afc039dffc7372c0a1b029f1b0ab01b;hb=16c6fa807c1e43a1a12bbeb7668b4166d14b2cc8;hpb=5dd497eecbb7dc453e6e1353e0e77bb4faeaeb3f diff --git a/mdadm.h b/mdadm.h index f03454df..a9ae698d 100644 --- a/mdadm.h +++ b/mdadm.h @@ -71,12 +71,32 @@ char *strncpy(char *dest, const char *src, size_t n) __THROW; #include "md_p.h" #include "bitmap.h" +#include +/* #include "asm/byteorder.h" Redhat don't like this so... */ +#if __BYTE_ORDER == __LITTLE_ENDIAN +# include +#elif __BYTE_ORDER == __BIG_ENDIAN +# include +#elif __BYTE_ORDER == __PDP_ENDIAN +# include +#else +# error "unknown endianness." +#endif + + + /* general information that might be extracted from a superblock */ struct mdinfo { mdu_array_info_t array; mdu_disk_info_t disk; __u64 events; int uuid[4]; + char name[33]; + unsigned long long data_offset; + unsigned long long component_size; + int reshape_active; + unsigned long long reshape_progress; + int new_level, delta_disks, new_layout, new_chunk; }; #define Name "mdadm" @@ -160,10 +180,62 @@ struct mdstat_ent { struct mdstat_ent *next; }; -extern struct mdstat_ent *mdstat_read(int); +extern struct mdstat_ent *mdstat_read(int hold, int start); extern void free_mdstat(struct mdstat_ent *ms); extern void mdstat_wait(int seconds); +/* Data structure for holding info read from sysfs */ +struct sysdev { + char name[20]; + int role; + int major, minor; + unsigned long long offset, size; + int state; + int errors; + struct sysdev *next; +}; +struct sysarray { + char name[20]; + struct sysdev *devs; + int chunk; + unsigned long long component_size; + int layout; + int level; + int spares; +}; +/* various details can be requested */ +#define GET_LEVEL 1 +#define GET_LAYOUT 2 +#define GET_COMPONENT 4 +#define GET_CHUNK 8 + +#define GET_DEVS 1024 /* gets role, major, minor */ +#define GET_OFFSET 2048 +#define GET_SIZE 4096 +#define GET_STATE 8192 +#define GET_ERROR 16384 + +/* If fd >= 0, get the array it is open on, + * else use devnum. >=0 -> major9. <0..... + */ +extern struct sysarray *sysfs_read(int fd, int devnum, unsigned long options); +extern int sysfs_set_str(struct sysarray *sra, struct sysdev *dev, + char *name, char *val); +extern int sysfs_set_num(struct sysarray *sra, struct sysdev *dev, + char *name, unsigned long long val); +extern int sysfs_get_ll(struct sysarray *sra, struct sysdev *dev, + char *name, unsigned long long *val); + + +extern int save_stripes(int *source, unsigned long long *offsets, + int raid_disks, int chunk_size, int level, int layout, + int nwrites, int *dest, + unsigned long long start, unsigned long long length); +extern int restore_stripes(int *dest, unsigned long long *offsets, + int raid_disks, int chunk_size, int level, int layout, + int source, unsigned long long read_offset, + unsigned long long start, unsigned long long length); + #ifndef Sendmail #define Sendmail "/usr/lib/sendmail -t" #endif @@ -174,7 +246,7 @@ extern char *map_num(mapping_t *map, int num); extern int map_name(mapping_t *map, char *name); extern mapping_t r5layout[], pers[], modes[], faultylayout[]; -extern char *map_dev(int major, int minor); +extern char *map_dev(int major, int minor, int create); extern struct superswitch { @@ -183,7 +255,7 @@ extern struct superswitch { void (*detail_super)(void *sbv); void (*brief_detail_super)(void *sbv); void (*uuid_from_super)(int uuid[4], void *sbv); - void (*getinfo_super)(struct mdinfo *info, mddev_ident_t ident, void *sbv); + void (*getinfo_super)(struct mdinfo *info, void *sbv); int (*update_super)(struct mdinfo *info, void *sbv, char *update, char *devname, int verbose); __u64 (*event_super)(void *sbv); int (*init_super)(struct supertype *st, void **sbp, mdu_array_info_t *info, unsigned long long size, char *name); @@ -236,13 +308,18 @@ extern int Manage_reconfig(char *devname, int fd, int layout); extern int Manage_subdevs(char *devname, int fd, mddev_dev_t devlist, int verbose); extern int Grow_Add_device(char *devname, int fd, char *newdev); -extern int Grow_addbitmap(char *devname, int fd, char *file, int chunk, int delay, int write_behind); +extern int Grow_addbitmap(char *devname, int fd, char *file, int chunk, int delay, int write_behind, int force); +extern int Grow_reshape(char *devname, int fd, int quiet, char *backup_file, + long long size, + int level, int layout, int chunksize, int raid_disks); +extern int Grow_restart(struct supertype *st, struct mdinfo *info, + int *fdlist, int cnt, char *backup_file); extern int Assemble(struct supertype *st, char *mddev, int mdfd, mddev_ident_t ident, char *conffile, - mddev_dev_t devlist, + mddev_dev_t devlist, char *backup_file, int readonly, int runstop, char *update, int verbose, int force); @@ -305,6 +382,7 @@ extern unsigned long calc_csum(void *super, int bytes); extern int enough(int level, int raid_disks, int layout, char *avail, int avail_disks); extern int ask(char *mesg); +extern unsigned long long get_component_size(int fd); extern char *human_size(long long bytes); @@ -352,3 +430,8 @@ extern int open_mddev(char *dev, int autof); #define makedev(M,m) (((M)<<8) | (m)) #endif +/* for raid5 */ +#define ALGORITHM_LEFT_ASYMMETRIC 0 +#define ALGORITHM_RIGHT_ASYMMETRIC 1 +#define ALGORITHM_LEFT_SYMMETRIC 2 +#define ALGORITHM_RIGHT_SYMMETRIC 3