X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=Incremental.c;h=8c686f7e8e6bde1d426d8731f3bdeca8a9d5c1d3;hb=080fd00521590cef01e4b6d8268fd998e15698cf;hp=c5ec6340e0efe5c9a4ae865ebee27de1a379eea8;hpb=0ac91628b93b31636979b637c1ac7258064dea4e;p=thirdparty%2Fmdadm.git diff --git a/Incremental.c b/Incremental.c index c5ec6340..8c686f7e 100644 --- a/Incremental.c +++ b/Incremental.c @@ -2,7 +2,7 @@ * Incremental.c - support --incremental. Part of: * mdadm - manage Linux "md" devices aka RAID arrays. * - * Copyright (C) 2006 Neil Brown + * Copyright (C) 2006-2009 Neil Brown * * * This program is free software; you can redistribute it and/or modify @@ -260,12 +260,8 @@ int Incremental(char *devname, int verbose, int runstop, return Incremental_container(st, devname, verbose, runstop, autof, trustworthy); } - name_to_use = strchr(info.name, ':'); - if (name_to_use) - name_to_use++; - else - name_to_use = info.name; + name_to_use = info.name; if (name_to_use[0] == 0 && info.array.level == LEVEL_CONTAINER && trustworthy == LOCAL) { @@ -277,20 +273,19 @@ int Incremental(char *devname, int verbose, int runstop, conf_name_is_free(name_to_use)) trustworthy = LOCAL; + /* strip "hostname:" prefix from name if we have decided + * to treat it as LOCAL + */ + if (trustworthy == LOCAL && strchr(name_to_use, ':') != NULL) + name_to_use = strchr(name_to_use, ':')+1; + /* 4/ Check if array exists. */ map_lock(&map); mp = map_by_uuid(&map, info.uuid); - if (mp) { - mdfd = open_mddev(mp->path, 0); - if (mdfd < 0 && mddev_busy(mp->devnum)) { - /* maybe udev hasn't created it yet. */ - char buf[50]; - sprintf(buf, "%d:%d", dev2major(mp->devnum), - dev2minor(mp->devnum)); - mdfd = dev_open(buf, O_RDWR); - } - } else + if (mp) + mdfd = open_dev(mp->devnum); + else mdfd = -1; if (mdfd < 0) { @@ -355,7 +350,10 @@ int Incremental(char *devname, int verbose, int runstop, struct supertype *st2; struct mdinfo info2, *d; - strcpy(chosen_name, mp->path); + if (mp->path) + strcpy(chosen_name, mp->path); + else + strcpy(chosen_name, devnum2devname(mp->devnum)); sra = sysfs_read(mdfd, fd2devnum(mdfd), (GET_DEVS | GET_STATE)); @@ -393,14 +391,14 @@ int Incremental(char *devname, int verbose, int runstop, /* add disk needs to know about containers */ if (st->ss->external) sra->array.level = LEVEL_CONTAINER; - err = add_disk(mdfd, st2, sra, &info2); + err = add_disk(mdfd, st, sra, &info2); if (err < 0 && errno == EBUSY) { /* could be another device present with the same * disk.number. Find and reject any such */ find_reject(mdfd, st, sra, info.disk.number, info.events, verbose, chosen_name); - err = add_disk(mdfd, st2, sra, &info2); + err = add_disk(mdfd, st, sra, &info2); } if (err < 0) { fprintf(stderr, Name ": failed to add %s to %s: %s.\n", @@ -660,7 +658,7 @@ int IncrementalScan(int verbose) mdu_array_info_t array; mdu_bitmap_file_t bmf; struct mdinfo *sra; - int mdfd = open_mddev(me->path, 0); + int mdfd = open_dev(me->devnum); if (mdfd < 0) continue; @@ -671,8 +669,8 @@ int IncrementalScan(int verbose) } /* Ok, we can try this one. Maybe it needs a bitmap */ for (mddev = devs ; mddev ; mddev = mddev->next) - if (mddev->devname - && strcmp(mddev->devname, me->path) == 0) + if (mddev->devname && me->path + && devname_matches(mddev->devname, me->path)) break; if (mddev && mddev->bitmap_file) { /* @@ -706,11 +704,12 @@ int IncrementalScan(int verbose) if (verbose >= 0) fprintf(stderr, Name ": started array %s\n", - me->path); + me->path ?: devnum2devname(me->devnum)); } else { fprintf(stderr, Name ": failed to start array %s: %s\n", - me->path, strerror(errno)); + me->path ?: devnum2devname(me->devnum), + strerror(errno)); rv = 1; } } @@ -766,7 +765,10 @@ int Incremental_container(struct supertype *st, char *devname, int verbose, if (mp) { mdfd = open_dev(mp->devnum); - strcpy(chosen_name, mp->path); + if (mp->path) + strcpy(chosen_name, mp->path); + else + strcpy(chosen_name, devnum2devname(mp->devnum)); } else { /* Check in mdadm.conf for container == devname and