]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Merge branch 'master' into devel-3.0
authorNeilBrown <neilb@suse.de>
Fri, 17 Oct 2008 01:46:23 +0000 (12:46 +1100)
committerNeilBrown <neilb@suse.de>
Fri, 17 Oct 2008 01:46:23 +0000 (12:46 +1100)
Conflicts:

Manage.c

1  2 
Detail.c
Manage.c
bitmap.c
mdadm.8
mdadm.h
super0.c
super1.c
util.c

diff --cc Detail.c
Simple merge
diff --cc Manage.c
index a6e1072502c4f7e2c998094605fd1492faecf2e9,7b3fabe1d016e8f7813a9afa9a446fd2d5c01bf2..0018d8d37854f0d23912ac26d3a5e4fa4732f72d
+++ b/Manage.c
@@@ -445,23 -347,12 +445,16 @@@ int Manage_subdevs(char *devname, int f
                                return 1;
                        }
  
 -                      if (array.not_persistent == 0) {
 +                      if (array.not_persistent == 0 || tst->ss->external) {
-                               /* Make sure device is large enough */
-                               if (tst->ss->avail_size(tst, ldsize/512) <
-                                   array_size) {
-                                       fprintf(stderr, Name ": %s not large enough to join array\n",
-                                               dv->devname);
-                                       return 1;
-                               }
  
                                /* need to find a sample superblock to copy, and
 -                               * a spare slot to use
 +                               * a spare slot to use.
 +                               * For 'external' array (well, container based),
 +                               * We can just load the metadata for the array.
                                 */
 -                              for (j = 0; j < tst->max_devs; j++) {
 +                              if (tst->ss->external) {
 +                                      tst->ss->load_super(tst, fd, NULL);
 +                              } else for (j = 0; j < tst->max_devs; j++) {
                                        char *dev;
                                        int dfd;
                                        disc.number = j;
diff --cc bitmap.c
Simple merge
diff --cc mdadm.8
Simple merge
diff --cc mdadm.h
index aea722811141ca82b95d3063f83019b57d17c287,174ea395ad3002b3b7f8f26d628d69a66f9b12c0..ed0c115335bcdcdf8765fad51336847b62a443d5
+++ b/mdadm.h
@@@ -778,17 -510,11 +779,18 @@@ extern int enough(int level, int raid_d
  extern int ask(char *mesg);
  extern unsigned long long get_component_size(int fd);
  extern void remove_partitions(int fd);
 +extern unsigned long long calc_array_size(int level, int raid_disks, int layout,
 +                                 int chunksize, unsigned long long devsize);
 +extern int flush_metadata_updates(struct supertype *st);
 +extern void append_metadata_update(struct supertype *st, void *buf, int len);
  
 +extern int add_disk(int mdfd, struct supertype *st,
 +                  struct mdinfo *sra, struct mdinfo *info);
 +extern int set_array_info(int mdfd, struct supertype *st, struct mdinfo *info);
  
  extern char *human_size(long long bytes);
- char *human_size_brief(long long bytes);
+ extern char *human_size_brief(long long bytes);
+ extern void print_r10_layout(int layout);
  
  #define NoMdDev (1<<23)
  extern int find_free_devnum(int use_partitions);
diff --cc super0.c
Simple merge
diff --cc super1.c
Simple merge
diff --cc util.c
index f6e4dd0eb19fed3a9c2875d7a1531cddae77c85d,2d51de02ba4386ea3fae93a4cd41d7b7e998773b..379403d0546fb8eb8e5ae3103e0d80b132fbed0c
--- 1/util.c
--- 2/util.c
+++ b/util.c
@@@ -640,25 -606,26 +640,42 @@@ char *human_size_brief(long long bytes
                        );
        return buf;
  }
+ void print_r10_layout(int layout)
+ {
+       int near = layout & 255;
+       int far = (layout >> 8) & 255;
+       int offset = (layout&0x10000);
+       char *sep = "";
+       if (near != 1) {
+               printf("%s near=%d", sep, near);
+               sep = ",";
+       }
+       if (far != 1)
+               printf("%s %s=%d", sep, offset?"offset":"far", far);
+       if (near*far == 1)
+               printf("NO REDUNDANCY");
+ }
  #endif
  
 -#if !defined(MDASSEMBLE) || defined(MDASSEMBLE) && defined(MDASSEMBLE_AUTO)
 +unsigned long long calc_array_size(int level, int raid_disks, int layout,
 +                                 int chunksize, unsigned long long devsize)
 +{
 +      int data_disks = 0;
 +      switch (level) {
 +      case 0: data_disks = raid_disks; break;
 +      case 1: data_disks = 1; break;
 +      case 4:
 +      case 5: data_disks = raid_disks - 1; break;
 +      case 6: data_disks = raid_disks - 2; break;
 +      case 10: data_disks = raid_disks / (layout & 255) / ((layout>>8)&255);
 +              break;
 +      }
 +      devsize &= ~(unsigned long long)((chunksize>>9)-1);
 +      return data_disks * devsize;
 +}
 +
  int get_mdp_major(void)
  {
  static int mdp_major = -1;