From: NeilBrown Date: Wed, 7 Jan 2009 22:31:28 +0000 (+1100) Subject: Merge branch 'master' into scratch-3.0 X-Git-Tag: mdadm-3.0-devel3~55 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=78fbcc10312649f2f4f88283e3f19dce9b205733;p=thirdparty%2Fmdadm.git Merge branch 'master' into scratch-3.0 Conflicts: Assemble.c config.c --- 78fbcc10312649f2f4f88283e3f19dce9b205733 diff --cc config.c index 6ab5a346,78bbb9d2..7e09b5ca --- a/config.c +++ b/config.c @@@ -598,12 -558,10 +598,12 @@@ void mailfromline(char *line if (alert_mail_from == NULL) alert_mail_from = strdup(w); else { - char *t= NULL; - xasprintf(&t, "%s %s", alert_mail_from, w); - free(alert_mail_from); - alert_mail_from = t; + char *t = NULL; + - if (asprintf(&t, "%s %s", alert_mail_from, w) > 0) { ++ if (xasprintf(&t, "%s %s", alert_mail_from, w) > 0) { + free(alert_mail_from); + alert_mail_from = t; + } } } } diff --cc mapfile.c index 75095ec2,59cc6c6d..ca7072ec --- a/mapfile.c +++ b/mapfile.c @@@ -328,13 -244,8 +328,14 @@@ void RebuildMap(void st->ss->free_super(st); break; } + sysfs_free(sra); } - free_mdstat(mdstat); map_write(map); map_free(map); + for (md = mdstat ; md ; md = md->next) { + struct mdinfo *sra = sysfs_read(-1, md->devnum, GET_VERSION); + sysfs_uevent(sra, "change"); + sysfs_free(sra); + } ++ free_mdstat(mdstat); } diff --cc mdadm.c index a0d6097e,6609bf22..1f9b707c --- a/mdadm.c +++ b/mdadm.c @@@ -1233,14 -1213,11 +1233,15 @@@ int main(int argc, char *argv[] e->dev); continue; } - rv |= Detail(name, verbose>1?0:verbose+1, - export, test, homehost); + if (devmode == 'D') + rv |= Detail(name, v, + export, test, + homehost); + else + rv |= WaitClean(name, v); put_md_name(name); } + free_mdstat(ms); } else if (devmode == 'S' && scan) { /* apply --stop to all devices in /proc/mdstat */ /* Due to possible stacking of devices, repeat until diff --cc mdadm.h index e75648ba,b0a8c5e7..82205355 --- a/mdadm.h +++ b/mdadm.h @@@ -822,64 -524,21 +822,75 @@@ extern char *get_md_name(int dev) extern char DefaultConfFile[]; -extern int open_mddev(char *dev, int autof); -extern int open_mddev_devnum(char *devname, int devnum, char *name, - char *chosen_name, int parts); +extern int create_mddev(char *dev, char *name, int autof, int trustworthy, + char *chosen); +/* values for 'trustworthy' */ +#define LOCAL 1 +#define FOREIGN 2 +#define METADATA 3 +extern int open_mddev(char *dev, int report_errors); +extern int open_container(int fd); + +extern int mdmon_running(int devnum); +extern int signal_mdmon(int devnum); +extern int check_env(char *name); +extern int start_mdmon(int devnum); + +extern char *devnum2devname(int num); +extern int devname2devnum(char *name); +extern int stat2devnum(struct stat *st); +extern int fd2devnum(int fd); + +static inline int dev2major(int d) +{ + if (d >= 0) + return MD_MAJOR; + else + return get_mdp_major(); +} + +static inline int dev2minor(int d) +{ + if (d >= 0) + return d; + return (-1-d) << MdpMinorShift; +} + +static inline int ROUND_UP(int a, int base) +{ + return ((a+base-1)/base)*base; +} +static inline int is_subarray(char *vers) +{ + /* The version string for a 'subarray' (an array in a container) + * is + * /containername/componentname for normal read-write arrays + * -containername/componentname for read-only arrays. + * containername is e.g. md0, md_d1 + * componentname is dependant on the metadata. e.g. '1' 'S1' ... + */ + return (*vers == '/' || *vers == '-'); +} + +#ifdef DEBUG +#define dprintf(fmt, arg...) \ + fprintf(stderr, fmt, ##arg) +#else +#define dprintf(fmt, arg...) \ + ({ if (0) fprintf(stderr, fmt, ##arg); 0; }) +#endif + #include + #include + static inline int xasprintf(char **strp, const char *fmt, ...) { + va_list ap; + int ret; + va_start(ap, fmt); + ret = asprintf(strp, fmt, ap); + va_end(ap); + assert(ret >= 0); + return ret; + } #define LEVEL_MULTIPATH (-4) #define LEVEL_LINEAR (-1)