Re: Re: Re[2]: Bugreport mdadm-2.0-devel-1

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Thanks much, Neil, will try.

Thanks,

Maxim.

NB> On Saturday July 9, neilb@xxxxxxxxxxxxxxx wrote:
>> On Thursday July 7, maximkoz@xxxxxxxxxxxxxxxx wrote:
>> > Hi Neil!
>> > Thanks much for your help, array creation using devel-2 just works,
>> > however, the array can't be assembled again after it's stopped:(
>> 
>> Hmm, yeh, nor it can :-(
>> 
>> I'm not sure when I'll have time to look at this (I'm on leave at the
>> moment with family visiting and such) but I'll definitely get back to
>> you by Thursday if not before.

NB> Sorry for the delay.

NB> The following patch against -devel2 should fix these problems if
NB> (when?) you get more, please let me know.

NB> NeilBrown

NB> Signed-off-by: Neil Brown <neilb@xxxxxxxxxxxxxxx>

NB> ### Diffstat output
NB>  ./Assemble.c |   13 ++++++++++++-
NB>  ./Query.c    |   33 +++++++++++++++++++--------------
NB>  ./mdadm.h    |    2 +-
NB>  ./super0.c   |    1 +
NB>  ./super1.c   |    4 ++--
NB>  5 files changed, 35 insertions(+), 18 deletions(-)

NB> diff ./Assemble.c~current~ ./Assemble.c
NB> --- ./Assemble.c~current~       2005-07-15 10:13:04.000000000 +1000
NB> +++ ./Assemble.c        2005-07-15 10:37:59.000000000 +1000
NB> @@ -473,6 +473,7 @@ int Assemble(struct supertype *st, char 
NB>                 if (!devices[j].uptodate)
NB>                         continue;
NB>                 info.disk.number = i;
NB> +               info.disk.raid_disk = i;
NB>                 info.disk.state = desired_state;
 
NB>                 if (devices[j].uptodate &&
NB> @@ -526,7 +527,17 @@ int Assemble(struct supertype *st, char 
 
NB>         /* Almost ready to actually *do* something */
NB>         if (!old_linux) {
NB> -               if (ioctl(mdfd, SET_ARRAY_INFO, NULL) != 0) {
NB> +               int rv;
NB> +               if ((vers % 100) >= 1) { /* can use different versions */
NB> +                       mdu_array_info_t inf;
NB> +                       memset(&inf, 0, sizeof(inf));
NB> +                       inf.major_version = st->ss->major;
NB> +                       inf.minor_version = st->minor_version;
NB> +                       rv = ioctl(mdfd, SET_ARRAY_INFO, &inf);
NB> +               } else 
NB> +                       rv = ioctl(mdfd, SET_ARRAY_INFO, NULL);
NB> +
NB> +               if (rv) {
NB>                         fprintf(stderr, Name ":
NB> SET_ARRAY_INFO failed for %s: %s\n",
NB>                                 mddev, strerror(errno));
NB>                         return 1;

NB> diff ./Query.c~current~ ./Query.c
NB> --- ./Query.c~current~  2005-07-07 09:19:53.000000000 +1000
NB> +++ ./Query.c   2005-07-15 11:38:18.000000000 +1000
NB> @@ -105,26 +105,31 @@ int Query(char *dev)
NB>         if (superror == 0) {
NB>                 /* array might be active... */
NB>                 st->ss->getinfo_super(&info, super);
NB> -               mddev = get_md_name(info.array.md_minor);
NB> -               disc.number = info.disk.number;
NB> -               activity = "undetected";
NB> -               if (mddev && (fd = open(mddev, O_RDONLY))>=0) {
NB> -                       if (md_get_version(fd) >= 9000 &&       
NB> -                           ioctl(fd, GET_ARRAY_INFO, &array)>= 0) {
NB> -                               if (ioctl(fd, GET_DISK_INFO, &disc) >= 0 &&
NB> -                                  
NB> makedev((unsigned)disc.major,(unsigned)disc.minor) == stb.st_rdev)
NB> -                                       activity = "active";
NB> -                               else
NB> -                                       activity = "mismatch";
NB> +               if (st->ss->major == 0) {
NB> +                       mddev = get_md_name(info.array.md_minor);
NB> +                       disc.number = info.disk.number;
NB> +                       activity = "undetected";
NB> +                       if (mddev && (fd = open(mddev, O_RDONLY))>=0) {
NB> +                               if (md_get_version(fd) >= 9000 &&
NB> +                                   ioctl(fd, GET_ARRAY_INFO, &array)>= 0) {
NB> +                                       if (ioctl(fd, GET_DISK_INFO, &disc) >= 0 &&
NB> +                                          
NB> makedev((unsigned)disc.major,(unsigned)disc.minor) == stb.st_rdev)
NB> +                                               activity = "active";
NB> +                                       else
NB> +                                               activity = "mismatch";
NB> +                               }
NB> +                               close(fd);
NB>                         }
NB> -                       close(fd);
NB> +               } else {
NB> +                       activity = "unknown";
NB> +                       mddev = "array";
NB>                 }
NB> -               printf("%s: device %d in %d device %s %s
NB> md%d.  Use mdadm --examine for more detail.\n",
NB> +               printf("%s: device %d in %d device %s %s %s. 
NB> Use mdadm --examine for more detail.\n",
NB>                        dev, 
NB>                        info.disk.number, info.array.raid_disks,
NB>                        activity,
NB>                        map_num(pers, info.array.level),
NB> -                      info.array.md_minor);
NB> +                      mddev);
NB>         }
NB>         return 0;
NB>  }

NB> diff ./mdadm.h~current~ ./mdadm.h
NB> --- ./mdadm.h~current~  2005-07-07 09:19:53.000000000 +1000
NB> +++ ./mdadm.h   2005-07-15 10:15:51.000000000 +1000
NB> @@ -73,7 +73,7 @@ struct mdinfo {
NB>         mdu_array_info_t        array;
NB>         mdu_disk_info_t         disk;
NB>         __u64                   events;
NB> -       unsigned int            uuid[4];
NB> +       int                     uuid[4];
NB>  };
 
NB>  #define Name "mdadm"

NB> diff ./super0.c~current~ ./super0.c
NB> --- ./super0.c~current~ 2005-07-07 09:19:53.000000000 +1000
NB> +++ ./super0.c  2005-07-15 11:27:12.000000000 +1000
NB> @@ -205,6 +205,7 @@ static void getinfo_super0(struct mdinfo
NB>         info->disk.major = sb->this_disk.major;
NB>         info->disk.minor = sb->this_disk.minor;
NB>         info->disk.raid_disk = sb->this_disk.raid_disk;
+       info->>disk.number = sb->this_disk.number;
 
NB>         info->events = md_event(sb);
 

NB> diff ./super1.c~current~ ./super1.c
NB> --- ./super1.c~current~ 2005-07-07 09:19:53.000000000 +1000
NB> +++ ./super1.c  2005-07-15 11:25:04.000000000 +1000
NB> @@ -278,7 +278,7 @@ static void getinfo_super1(struct mdinfo
 
NB>         info->disk.major = 0;
NB>         info->disk.minor = 0;
NB> -
+       info->>disk.number = __le32_to_cpu(sb->dev_number);
NB>         if (__le32_to_cpu(sb->dev_number) >= __le32_to_cpu(sb->max_dev) ||
NB>             __le32_to_cpu(sb->max_dev) > 512)
NB>                 role = 0xfffe;
NB> @@ -303,7 +303,7 @@ static void getinfo_super1(struct mdinfo
 
NB>         for (i=0; i< __le32_to_cpu(sb->max_dev); i++) {
NB>                 role = __le16_to_cpu(sb->dev_roles[i]);
NB> -               if (role == 0xFFFF || role < info->array.raid_disks)
NB> +               if (/*role == 0xFFFF || */role < info->array.raid_disks)
NB>                         working++;
NB>         }


-
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux