]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Merge branch 'master' into devel-3.0
authorNeilBrown <neilb@suse.de>
Thu, 18 Dec 2008 05:56:13 +0000 (16:56 +1100)
committerNeilBrown <neilb@suse.de>
Thu, 18 Dec 2008 05:56:13 +0000 (16:56 +1100)
Conflicts:

Assemble.c
Incremental.c
Kill.c
ReadMe.c
inventory
mapfile.c
mdadm.8
mdadm.spec
mdassemble.8

1  2 
Assemble.c
Incremental.c
Kill.c
inventory
mapfile.c
mdadm.conf.5

diff --cc Assemble.c
index cac273ea82c251d4346c94f12fcbafd2ad09c763,0cdeeda36e6306d4bda49dfb0c828bdcb31f9793..4933520d04f2b502128869a843b48d1ca6b6f39f
@@@ -1088,10 -934,23 +1090,24 @@@ int Assemble(struct supertype *st, cha
                                                fprintf(stderr, " and %d spare%s", sparecnt, sparecnt==1?"":"s");
                                        fprintf(stderr, ".\n");
                                }
 -                              if (info.reshape_active &&
 -                                  info.array.level >= 4 &&
 -                                  info.array.level <= 6) {
++                              if (content->reshape_active &&
++                                  content->array.level >= 4 &&
++                                  content->array.level <= 6) {
+                                       /* might need to increase the size
+                                        * of the stripe cache - default is 256
+                                        */
 -                                      if (256 < 4 * (info.array.chunk_size/4096)) {
++                                      if (256 < 4 * (content->array.chunk_size/4096)) {
+                                               struct mdinfo *sra = sysfs_read(mdfd, 0, 0);
+                                               if (sra)
+                                                       sysfs_set_num(sra, NULL,
+                                                                     "stripe_cache_size",
 -                                                                    (4 * info.array.chunk_size / 4096) + 1);
++                                                                    (4 * content->array.chunk_size / 4096) + 1);
+                                       }
+                               }
 -                              if (must_close) {
 +                              close(mdfd);
 +                              wait_for(mddev);
 +                              if (auto_assem) {
                                        int usecs = 1;
 -                                      close(mdfd);
                                        /* There is a nasty race with 'mdadm --monitor'.
                                         * If it opens this device before we close it,
                                         * it gets an incomplete open on which IO
diff --cc Incremental.c
Simple merge
diff --cc Kill.c
index d5c1e36df4d3724e6cf060238902cb897e01bfed,b1e19b56dd8bbdb57d7b4ac9268c8656fff5d0d5..96b270f278db10d6361a8c45d17798db75dd3068
--- 1/Kill.c
--- 2/Kill.c
+++ b/Kill.c
@@@ -44,7 -44,7 +44,9 @@@ int Kill(char *dev, int force, int quie
        int fd, rv = 0;
        struct supertype *st;
  
-       fd = open(dev, O_DIRECT | (noexcl ? O_RDWR : (O_RDWR|O_EXCL)));
++      if (force)
++              noexcl = 1;
+       fd = open(dev, O_RDWR|(force ? 0 : O_EXCL));
        if (fd < 0) {
                if (!quiet)
                        fprintf(stderr, Name ": Couldn't open %s for write - not zeroing\n",
diff --cc inventory
index 2d86d3aa30680276d04353c41fa853bb0b676cb1,90f494d6278455aa545a52014091a993d3446951..dffe802a70ca50d65caba803f3a16d596e6c9caf
+++ b/inventory
@@@ -22,8 -22,7 +22,9 @@@ ANNOUNCE-2.6.
  ANNOUNCE-2.6.5
  ANNOUNCE-2.6.6
  ANNOUNCE-2.6.7
+ ANNOUNCE-2.6.8
 +ANNOUNCE-3.0-devel1
 +ANNOUNCE-3.0-devel2
  Assemble.c
  bitmap.c
  bitmap.h
diff --cc mapfile.c
index 89836cf1c6e57fb0d78bc43363fe7ed9bbf34940,0d0aa398c7d90cd1cf9511e03085b71f9c7cfa0b..75095ec2ab444014b47b19f1b29d5274e8f1c44d
+++ b/mapfile.c
@@@ -230,52 -195,56 +236,105 @@@ struct map_ent *map_by_uuid(struct map_
        if (!*map)
                map_read(map);
  
 -      for (mp = *map ; mp ; mp = mp->next)
 -              if (memcmp(uuid, mp->uuid, 16) == 0)
 -                      return mp;
 +      for (mp = *map ; mp ; mp = mp->next) {
 +              if (memcmp(uuid, mp->uuid, 16) != 0)
 +                      continue;
 +              if (!mddev_busy(mp->devnum)) {
 +                      mp->bad = 1;
 +                      continue;
 +              }
 +              return mp;
 +      }
        return NULL;
 +}
  
 +struct map_ent *map_by_devnum(struct map_ent **map, int devnum)
 +{
 +      struct map_ent *mp;
 +      if (!*map)
 +              map_read(map);
 +
 +      for (mp = *map ; mp ; mp = mp->next) {
 +              if (mp->devnum != devnum)
 +                      continue;
 +              if (!mddev_busy(mp->devnum)) {
 +                      mp->bad = 1;
 +                      continue;
 +              }
 +              return mp;
 +      }
 +      return NULL;
 +}
 +
 +struct map_ent *map_by_name(struct map_ent **map, char *name)
 +{
 +      struct map_ent *mp;
 +      if (!*map)
 +              map_read(map);
 +
 +      for (mp = *map ; mp ; mp = mp->next) {
 +              if (strncmp(mp->path, "/dev/md/", 8) != 0)
 +                      continue;
 +              if (strcmp(mp->path+8, name) != 0)
 +                      continue;
 +              if (!mddev_busy(mp->devnum)) {
 +                      mp->bad = 1;
 +                      continue;
 +              }
 +              return mp;
 +      }
 +      return NULL;
  }
 -                      map_add(&map, md->devnum, st->ss->major,
 -                              st->minor_version,
+ void RebuildMap(void)
+ {
+       struct mdstat_ent *mdstat = mdstat_read(0, 0);
+       struct mdstat_ent *md;
+       struct map_ent *map = NULL;
+       int mdp = get_mdp_major();
+       for (md = mdstat ; md ; md = md->next) {
+               struct mdinfo *sra = sysfs_read(-1, md->devnum, GET_DEVS);
+               struct mdinfo *sd;
+               for (sd = sra->devs ; sd ; sd = sd->next) {
+                       char dn[30];
+                       int dfd;
+                       int ok;
+                       struct supertype *st;
+                       char *path;
+                       struct mdinfo info;
+                       sprintf(dn, "%d:%d", sd->disk.major, sd->disk.minor);
+                       dfd = dev_open(dn, O_RDONLY);
+                       if (dfd < 0)
+                               continue;
+                       st = guess_super(dfd);
+                       if ( st == NULL)
+                               ok = -1;
+                       else
+                               ok = st->ss->load_super(st, dfd, NULL);
+                       close(dfd);
+                       if (ok != 0)
+                               continue;
+                       st->ss->getinfo_super(st, &info);
+                       if (md->devnum > 0)
+                               path = map_dev(MD_MAJOR, md->devnum, 0);
+                       else
+                               path = map_dev(mdp, (-1-md->devnum)<< 6, 0);
++                      map_add(&map, md->devnum,
++                              info.text_version,
+                               info.uuid, path ? : "/unknown");
+                       st->ss->free_super(st);
+                       break;
+               }
++              sysfs_free(sra);
+       }
+       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);
++      }
+ }
diff --cc mdadm.conf.5
Simple merge