Hello community,

here is the log from the commit of package mdadm for openSUSE:Factory checked 
in at 2012-05-21 08:07:29
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/mdadm (Old)
 and      /work/SRC/openSUSE:Factory/.mdadm.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "mdadm", Maintainer is "nfbr...@suse.com"

Changes:
--------
--- /work/SRC/openSUSE:Factory/mdadm/mdadm.changes      2012-05-09 
18:32:05.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.mdadm.new/mdadm.changes 2012-05-21 
08:07:33.000000000 +0200
@@ -1,0 +2,7 @@
+Fri May 18 07:16:59 UTC 2012 - nfbr...@suse.com
+
+- New upstream version: 3.2.5.  Serious regression
+  in 3.2.4 necessitated a new release.  Only significant
+  fix is that "--add" now works again.
+
+-------------------------------------------------------------------

Old:
----
  mdadm-3.2.4.tar.bz2

New:
----
  mdadm-3.2.5.tar.bz2

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ mdadm.spec ++++++
--- /var/tmp/diff_new_pack.38bI0h/_old  2012-05-21 08:08:14.000000000 +0200
+++ /var/tmp/diff_new_pack.38bI0h/_new  2012-05-21 08:08:14.000000000 +0200
@@ -17,8 +17,9 @@
 
 
 Name:           mdadm
-Version:        3.2.4
+Version:        3.2.5
 Release:        0
+BuildRequires:  binutils-devel
 BuildRequires:  sgmltool
 PreReq:         %fillup_prereq %insserv_prereq /sbin/mkinitrd
 Obsoletes:      raidtools

++++++ mdadm-3.2.4.tar.bz2 -> mdadm-3.2.5.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mdadm-3.2.4/ANNOUNCE-3.2.5 
new/mdadm-3.2.5/ANNOUNCE-3.2.5
--- old/mdadm-3.2.4/ANNOUNCE-3.2.5      1970-01-01 01:00:00.000000000 +0100
+++ new/mdadm-3.2.5/ANNOUNCE-3.2.5      2012-05-18 09:10:03.000000000 +0200
@@ -0,0 +1,31 @@
+Subject:  ANNOUNCE: mdadm 3.2.5 - A tool for managing Soft RAID under Linux
+
+I am somewhat disappointed to have to announce the availability of
+   mdadm version 3.2.5
+
+It is available at the usual places, now including github:
+   countrycode=xx.
+   http://www.${countrycode}kernel.org/pub/linux/utils/raid/mdadm/
+and via git at
+   git://github.com/neilbrown/mdadm
+   git://neil.brown.name/mdadm
+   http://neil.brown.name/git/mdadm
+
+This release primarily fixes a serious regression in 3.2.4.
+This regression does *not* cause any risk to data.  It simply
+means that adding a device with "--add" would sometime fail
+when it should not.
+
+The fix also includes a couple of minor fixes such as making
+the "--layout=preserve" option to "--grow" work again.
+
+A reminder that the default location for runtime files is now
+"/run/mdadm".  If you compile this for a distro that does not
+have "/run", you will need to compile with an alternate setting for
+MAP_DIR. e.g.
+   make MAP_DIR=/var/run/mdadm
+or
+   make MAP_DIR=/dev/.mdadm
+
+NeilBrown 18th May 2012
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mdadm-3.2.4/Assemble.c new/mdadm-3.2.5/Assemble.c
--- old/mdadm-3.2.4/Assemble.c  2012-05-09 01:42:57.000000000 +0200
+++ new/mdadm-3.2.5/Assemble.c  2012-05-18 09:10:03.000000000 +0200
@@ -1069,6 +1069,7 @@
                        int j = best[i];
                        if (j >= 0 &&
                            !devices[j].uptodate &&
+                           devices[j].i.recovery_start == MaxSector &&
                            devices[j].i.events == current_events) {
                                chosen_drive = j;
                                goto add_another;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mdadm-3.2.4/Grow.c new/mdadm-3.2.5/Grow.c
--- old/mdadm-3.2.4/Grow.c      2012-05-09 01:42:57.000000000 +0200
+++ new/mdadm-3.2.5/Grow.c      2012-05-18 09:10:03.000000000 +0200
@@ -623,8 +623,6 @@
 
                if (sra)
                        sysfs_set_str(sra, NULL, "sync_action", "idle");
-               else
-                       fprintf(stderr, Name ": failed to unfreeze array\n");
                sysfs_free(sra);
        }
 }
@@ -1885,9 +1883,37 @@
                                *h = 0;
                                info.new_layout = map_name(r6layout, l);
                        }
+               } else {
+                       fprintf(stderr, Name
+                               ": %s is only meaningful when reshaping"
+                               " a RAID6 array.\n", layout_str);
+                       rv = 1;
+                       goto release;
                }
        } else if (strcmp(layout_str, "preserve") == 0) {
-               info.new_layout = UnSet;
+               /* This means that a non-standard RAID6 layout
+                * is OK.
+                * In particular:
+                * - When reshape a RAID6 (e.g. adding a device)
+                *   which is in a non-standard layout, it is OK
+                *   to preserve that layout.
+                * - When converting a RAID5 to RAID6, leave it in
+                *   the XXX-6 layout, don't re-layout.
+                */
+               if (info.array.level == 6 && info.new_level == UnSet)
+                       info.new_layout = info.array.layout;
+               else if (info.array.level == 5 && info.new_level == 6) {
+                       char l[40];
+                       strcpy(l, map_num(r5layout, info.array.layout));
+                       strcat(l, "-6");
+                       info.new_layout = map_name(r6layout, l);
+               } else {
+                       fprintf(stderr, Name
+                               ": %s in only meaningful when reshaping"
+                               " to RAID6\n", layout_str);
+                       rv = 1;
+                       goto release;
+               }
        } else {
                int l = info.new_level;
                if (l == UnSet)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mdadm-3.2.4/ReadMe.c new/mdadm-3.2.5/ReadMe.c
--- old/mdadm-3.2.4/ReadMe.c    2012-05-09 01:42:57.000000000 +0200
+++ new/mdadm-3.2.5/ReadMe.c    2012-05-18 09:10:03.000000000 +0200
@@ -24,7 +24,7 @@
 
 #include "mdadm.h"
 
-char Version[] = Name " - v3.2.4 - 9th May 2012\n";
+char Version[] = Name " - v3.2.5 - 18th May 2012\n";
 
 /*
  * File: ReadMe.c
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mdadm-3.2.4/inventory new/mdadm-3.2.5/inventory
--- old/mdadm-3.2.4/inventory   2012-05-09 01:42:57.000000000 +0200
+++ new/mdadm-3.2.5/inventory   2012-05-18 09:10:03.000000000 +0200
@@ -15,6 +15,7 @@
 ANNOUNCE-3.2.2
 ANNOUNCE-3.2.3
 ANNOUNCE-3.2.4
+ANNOUNCE-3.2.5
 Assemble.c
 Build.c
 COPYING
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mdadm-3.2.4/mapfile.c new/mdadm-3.2.5/mapfile.c
--- old/mdadm-3.2.4/mapfile.c   2012-05-09 01:42:57.000000000 +0200
+++ new/mdadm-3.2.5/mapfile.c   2012-05-18 09:10:03.000000000 +0200
@@ -404,6 +404,8 @@
                        if (ok != 0)
                                continue;
                        info = st->ss->container_content(st, subarray);
+                       if (!info)
+                               continue;
 
                        if (md->devnum >= 0)
                                path = map_dev(MD_MAJOR, md->devnum, 0);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mdadm-3.2.4/mdadm.8.in new/mdadm-3.2.5/mdadm.8.in
--- old/mdadm-3.2.4/mdadm.8.in  2012-05-09 01:42:57.000000000 +0200
+++ new/mdadm-3.2.5/mdadm.8.in  2012-05-18 09:10:03.000000000 +0200
@@ -5,7 +5,7 @@
 .\"   the Free Software Foundation; either version 2 of the License, or
 .\"   (at your option) any later version.
 .\" See file COPYING in distribution for details.
-.TH MDADM 8 "" v3.2.4
+.TH MDADM 8 "" v3.2.5
 .SH NAME
 mdadm \- manage MD devices
 .I aka
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mdadm-3.2.4/mdadm.conf.5 new/mdadm-3.2.5/mdadm.conf.5
--- old/mdadm-3.2.4/mdadm.conf.5        2012-05-09 01:42:57.000000000 +0200
+++ new/mdadm-3.2.5/mdadm.conf.5        2012-05-18 09:10:03.000000000 +0200
@@ -53,7 +53,7 @@
 
 Alternatively, a
 .B device
-line can contain either of both of the  words
+line can contain either or both of the  words
 .B containers
 and
 .BR partitions .
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mdadm-3.2.4/mdadm.spec new/mdadm-3.2.5/mdadm.spec
--- old/mdadm-3.2.4/mdadm.spec  2012-05-09 01:42:57.000000000 +0200
+++ new/mdadm-3.2.5/mdadm.spec  2012-05-18 09:10:03.000000000 +0200
@@ -1,6 +1,6 @@
 Summary:     mdadm is used for controlling Linux md devices (aka RAID arrays)
 Name:        mdadm
-Version:     3.2.4
+Version:     3.2.5
 Release:     1
 Source:      
http://www.kernel.org/pub/linux/utils/raid/mdadm/mdadm-%{version}.tar.gz
 URL:         http://neil.brown.name/blog/mdadm
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mdadm-3.2.4/mdassemble.8 new/mdadm-3.2.5/mdassemble.8
--- old/mdadm-3.2.4/mdassemble.8        2012-05-09 01:42:57.000000000 +0200
+++ new/mdadm-3.2.5/mdassemble.8        2012-05-18 09:10:03.000000000 +0200
@@ -1,5 +1,5 @@
 .\" -*- nroff -*-
-.TH MDASSEMBLE 8 "" v3.2.4
+.TH MDASSEMBLE 8 "" v3.2.5
 .SH NAME
 mdassemble \- assemble MD devices
 .I aka
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mdadm-3.2.4/mdmon.8 new/mdadm-3.2.5/mdmon.8
--- old/mdadm-3.2.4/mdmon.8     2012-05-09 01:42:57.000000000 +0200
+++ new/mdadm-3.2.5/mdmon.8     2012-05-18 09:10:03.000000000 +0200
@@ -1,5 +1,5 @@
 .\" See file COPYING in distribution for details.
-.TH MDMON 8 "" v3.2.4
+.TH MDMON 8 "" v3.2.5
 .SH NAME
 mdmon \- monitor MD external metadata arrays
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mdadm-3.2.4/sha1.c new/mdadm-3.2.5/sha1.c
--- old/mdadm-3.2.4/sha1.c      2012-05-09 01:42:57.000000000 +0200
+++ new/mdadm-3.2.5/sha1.c      2012-05-18 09:10:03.000000000 +0200
@@ -1,7 +1,8 @@
 /* sha1.c - Functions to compute SHA1 message digest of files or
    memory blocks according to the NIST specification FIPS-180-1.
 
-   Copyright (C) 2000, 2001, 2003, 2004, 2005 Free Software Foundation, Inc.
+   Copyright (C) 2000, 2001, 2003, 2004, 2005, 2006, 2008 Free Software
+   Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify it
    under the terms of the GNU General Public License as published by the
@@ -22,9 +23,7 @@
       Robert Klep <rob...@ilse.nl>  -- Expansion function fix
 */
 
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
+//#include <config.h>
 
 #include "sha1.h"
 
@@ -35,9 +34,6 @@
 # include "unlocked-io.h"
 #endif
 
-/* SWAP does an endian swap on architectures that are little-endian,
-   as SHA1 needs some data in a big-endian form.  */
-
 #ifdef WORDS_BIGENDIAN
 # define SWAP(n) (n)
 #else
@@ -55,11 +51,9 @@
 static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ...  */ };
 
 
-/*
-  Takes a pointer to a 160 bit block of data (five 32 bit ints) and
-  intializes it to the start constants of the SHA1 algorithm.  This
-  must be called before using hash in the call to sha1_hash.
-*/
+/* Take a pointer to a 160 bit block of data (five 32 bit ints) and
+   initialize it to the start constants of the SHA1 algorithm.  This
+   must be called before using hash in the call to sha1_hash.  */
 void
 sha1_init_ctx (struct sha1_ctx *ctx)
 {
@@ -77,15 +71,15 @@
    must be in little endian byte order.
 
    IMPORTANT: On some systems it is required that RESBUF is correctly
-   aligned for a 32 bits value.  */
+   aligned for a 32-bit value.  */
 void *
 sha1_read_ctx (const struct sha1_ctx *ctx, void *resbuf)
 {
-  ((md5_uint32 *) resbuf)[0] = SWAP (ctx->A);
-  ((md5_uint32 *) resbuf)[1] = SWAP (ctx->B);
-  ((md5_uint32 *) resbuf)[2] = SWAP (ctx->C);
-  ((md5_uint32 *) resbuf)[3] = SWAP (ctx->D);
-  ((md5_uint32 *) resbuf)[4] = SWAP (ctx->E);
+  ((sha1_uint32 *) resbuf)[0] = SWAP (ctx->A);
+  ((sha1_uint32 *) resbuf)[1] = SWAP (ctx->B);
+  ((sha1_uint32 *) resbuf)[2] = SWAP (ctx->C);
+  ((sha1_uint32 *) resbuf)[3] = SWAP (ctx->D);
+  ((sha1_uint32 *) resbuf)[4] = SWAP (ctx->E);
 
   return resbuf;
 }
@@ -94,31 +88,27 @@
    prolog according to the standard and write the result to RESBUF.
 
    IMPORTANT: On some systems it is required that RESBUF is correctly
-   aligned for a 32 bits value.  */
+   aligned for a 32-bit value.  */
 void *
 sha1_finish_ctx (struct sha1_ctx *ctx, void *resbuf)
 {
   /* Take yet unprocessed bytes into account.  */
-  md5_uint32 bytes = ctx->buflen;
-  size_t pad;
-  md5_uint32 *ptr;
+  sha1_uint32 bytes = ctx->buflen;
+  size_t size = (bytes < 56) ? 64 / 4 : 64 * 2 / 4;
 
   /* Now count remaining bytes.  */
   ctx->total[0] += bytes;
   if (ctx->total[0] < bytes)
     ++ctx->total[1];
 
-  pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes;
-  memcpy (&ctx->buffer[bytes], fillbuf, pad);
-
   /* Put the 64-bit file length in *bits* at the end of the buffer.  */
-  ptr = (md5_uint32 *) &ctx->buffer[bytes + pad + 4];
-  *ptr = SWAP (ctx->total[0] << 3);
-  ptr = (md5_uint32 *) &ctx->buffer[bytes + pad];
-  *ptr = SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29));
+  ctx->buffer[size - 2] = SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29));
+  ctx->buffer[size - 1] = SWAP (ctx->total[0] << 3);
+
+  memcpy (&((char *) ctx->buffer)[bytes], fillbuf, (size - 2) * 4 - bytes);
 
   /* Process last bytes.  */
-  sha1_process_block (ctx->buffer, bytes + pad + 8, ctx);
+  sha1_process_block (ctx->buffer, size * 4, ctx);
 
   return sha1_read_ctx (ctx, resbuf);
 }
@@ -189,7 +179,7 @@
   return 0;
 }
 
-/* Compute MD5 message digest for LEN bytes beginning at BUFFER.  The
+/* Compute SHA1 message digest for LEN bytes beginning at BUFFER.  The
    result is always in little endian byte order, so that a byte-wise
    output yields to the wanted ASCII representation of the message
    digest.  */
@@ -218,7 +208,7 @@
       size_t left_over = ctx->buflen;
       size_t add = 128 - left_over > len ? len : 128 - left_over;
 
-      memcpy (&ctx->buffer[left_over], buffer, add);
+      memcpy (&((char *) ctx->buffer)[left_over], buffer, add);
       ctx->buflen += add;
 
       if (ctx->buflen > 64)
@@ -227,7 +217,8 @@
 
          ctx->buflen &= 63;
          /* The regions in the following copy operation cannot overlap.  */
-         memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~63],
+         memcpy (ctx->buffer,
+                 &((char *) ctx->buffer)[(left_over + add) & ~63],
                  ctx->buflen);
        }
 
@@ -240,7 +231,7 @@
     {
 #if !_STRING_ARCH_unaligned
 # define alignof(type) offsetof (struct { char c; type x; }, x)
-# define UNALIGNED_P(p) (((size_t) p) % alignof (md5_uint32) != 0)
+# define UNALIGNED_P(p) (((size_t) p) % alignof (sha1_uint32) != 0)
       if (UNALIGNED_P (buffer))
        while (len > 64)
          {
@@ -262,13 +253,13 @@
     {
       size_t left_over = ctx->buflen;
 
-      memcpy (&ctx->buffer[left_over], buffer, len);
+      memcpy (&((char *) ctx->buffer)[left_over], buffer, len);
       left_over += len;
       if (left_over >= 64)
        {
          sha1_process_block (ctx->buffer, 64, ctx);
          left_over -= 64;
-         memcpy (ctx->buffer, &ctx->buffer[64], left_over);
+         memcpy (ctx->buffer, &ctx->buffer[16], left_over);
        }
       ctx->buflen = left_over;
     }
@@ -277,10 +268,10 @@
 /* --- Code below is the primary difference between md5.c and sha1.c --- */
 
 /* SHA1 round constants */
-#define K1 0x5a827999L
-#define K2 0x6ed9eba1L
-#define K3 0x8f1bbcdcL
-#define K4 0xca62c1d6L
+#define K1 0x5a827999
+#define K2 0x6ed9eba1
+#define K3 0x8f1bbcdc
+#define K4 0xca62c1d6
 
 /* Round functions.  Note that F2 is the same as F4.  */
 #define F1(B,C,D) ( D ^ ( B & ( C ^ D ) ) )
@@ -295,15 +286,15 @@
 void
 sha1_process_block (const void *buffer, size_t len, struct sha1_ctx *ctx)
 {
-  const md5_uint32 *words = buffer;
-  size_t nwords = len / sizeof (md5_uint32);
-  const md5_uint32 *endp = words + nwords;
-  md5_uint32 x[16];
-  md5_uint32 a = ctx->A;
-  md5_uint32 b = ctx->B;
-  md5_uint32 c = ctx->C;
-  md5_uint32 d = ctx->D;
-  md5_uint32 e = ctx->E;
+  const sha1_uint32 *words = (const sha1_uint32*) buffer;
+  size_t nwords = len / sizeof (sha1_uint32);
+  const sha1_uint32 *endp = words + nwords;
+  sha1_uint32 x[16];
+  sha1_uint32 a = ctx->A;
+  sha1_uint32 b = ctx->B;
+  sha1_uint32 c = ctx->C;
+  sha1_uint32 d = ctx->D;
+  sha1_uint32 e = ctx->E;
 
   /* First increment the byte count.  RFC 1321 specifies the possible
      length of the file up to 2^64 bits.  Here we only compute the
@@ -312,7 +303,7 @@
   if (ctx->total[0] < len)
     ++ctx->total[1];
 
-#define rol(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
+#define rol(x, n) (((x) << (n)) | ((sha1_uint32) (x) >> (32 - (n))))
 
 #define M(I) ( tm =   x[I&0x0f] ^ x[(I-14)&0x0f] \
                    ^ x[(I-8)&0x0f] ^ x[(I-3)&0x0f] \
@@ -327,7 +318,7 @@
 
   while (words < endp)
     {
-      md5_uint32 tm;
+      sha1_uint32 tm;
       int t;
       for (t = 0; t < 16; t++)
        {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mdadm-3.2.4/sha1.h new/mdadm-3.2.5/sha1.h
--- old/mdadm-3.2.4/sha1.h      2012-05-09 01:42:57.000000000 +0200
+++ new/mdadm-3.2.5/sha1.h      2012-05-18 09:10:03.000000000 +0200
@@ -1,10 +1,11 @@
 /* Declarations of functions and data types used for SHA1 sum
    library functions.
-   Copyright (C) 2000, 2001, 2003, 2005 Free Software Foundation, Inc.
+   Copyright (C) 2000, 2001, 2003, 2005, 2006, 2008, 2010
+   Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify it
    under the terms of the GNU General Public License as published by the
-   Free Software Foundation; either version 2, or (at your option) any
+   Free Software Foundation; either version 3, or (at your option) any
    later version.
 
    This program is distributed in the hope that it will be useful,
@@ -19,21 +20,70 @@
 #ifndef SHA1_H
 # define SHA1_H 1
 
-# include <stdio.h>
-# include "md5.h"
+#include <stdio.h>
+
+#if defined HAVE_LIMITS_H || _LIBC
+# include <limits.h>
+#endif
+
+#include "ansidecl.h"
+
+/* The following contortions are an attempt to use the C preprocessor
+   to determine an unsigned integral type that is 32 bits wide.  An
+   alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but
+   doing that would require that the configure script compile and *run*
+   the resulting executable.  Locally running cross-compiled executables
+   is usually not possible.  */
+
+#ifdef _LIBC
+# include <sys/types.h>
+typedef u_int32_t sha1_uint32;
+typedef uintptr_t sha1_uintptr;
+#else
+#  define INT_MAX_32_BITS 2147483647
+
+/* If UINT_MAX isn't defined, assume it's a 32-bit type.
+   This should be valid for all systems GNU cares about because
+   that doesn't include 16-bit systems, and only modern systems
+   (that certainly have <limits.h>) have 64+-bit integral types.  */
+
+# ifndef INT_MAX
+#  define INT_MAX INT_MAX_32_BITS
+# endif
+
+# if INT_MAX == INT_MAX_32_BITS
+   typedef unsigned int sha1_uint32;
+# else
+#  if SHRT_MAX == INT_MAX_32_BITS
+    typedef unsigned short sha1_uint32;
+#  else
+#   if LONG_MAX == INT_MAX_32_BITS
+     typedef unsigned long sha1_uint32;
+#   else
+     /* The following line is intended to evoke an error.
+        Using #error is not portable enough.  */
+     "Cannot determine unsigned 32-bit data type."
+#   endif
+#  endif
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
 
 /* Structure to save state of computation between the single steps.  */
 struct sha1_ctx
 {
-  md5_uint32 A;
-  md5_uint32 B;
-  md5_uint32 C;
-  md5_uint32 D;
-  md5_uint32 E;
-
-  md5_uint32 total[2];
-  md5_uint32 buflen;
-  char buffer[128] __attribute__ ((__aligned__ (__alignof__ (md5_uint32))));
+  sha1_uint32 A;
+  sha1_uint32 B;
+  sha1_uint32 C;
+  sha1_uint32 D;
+  sha1_uint32 E;
+
+  sha1_uint32 total[2];
+  sha1_uint32 buflen;
+  sha1_uint32 buffer[32];
 };
 
 
@@ -84,4 +134,8 @@
    digest.  */
 extern void *sha1_buffer (const char *buffer, size_t len, void *resblock);
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mdadm-3.2.4/super-intel.c 
new/mdadm-3.2.5/super-intel.c
--- old/mdadm-3.2.4/super-intel.c       2012-05-09 01:42:57.000000000 +0200
+++ new/mdadm-3.2.5/super-intel.c       2012-05-18 09:10:03.000000000 +0200
@@ -9902,6 +9902,9 @@
        struct imsm_dev *dev;
        struct intel_super *super;
        long long current_size;
+       unsigned long long free_size;
+       long long max_size;
+       int rv;
 
        getinfo_super_imsm_volume(st, &info, NULL);
        if ((geo->level != info.array.level) &&
@@ -10015,28 +10018,33 @@
                                super->current_vol, st->devnum);
                        goto analyse_change_exit;
                }
+               /* check the maximum available size
+                */
+               rv =  imsm_get_free_size(st, dev->vol.map->num_members,
+                                        0, chunk, &free_size);
+               if (rv == 0)
+                       /* Cannot find maximum available space
+                        */
+                       max_size = 0;
+               else {
+                       max_size = free_size + current_size;
+                       /* align component size
+                        */
+                       max_size = imsm_component_size_aligment_check(
+                                       get_imsm_raid_level(dev->vol.map),
+                                       chunk * 1024,
+                                       max_size);
+               }
                if (geo->size == 0) {
                        /* requested size change to the maximum available size
                         */
-                       unsigned long long freesize;
-                       int rv;
-
-                       rv =  imsm_get_free_size(st, dev->vol.map->num_members,
-                                                0, chunk, &freesize);
-                       if (rv == 0) {
+                       if (max_size == 0) {
                                fprintf(stderr, Name " Error. Cannot find "
                                        "maximum available space.\n");
                                change = -1;
                                goto analyse_change_exit;
-                       }
-                       geo->size = freesize + current_size;
-
-                       /* align component size
-                        */
-                       geo->size = imsm_component_size_aligment_check(
-                                             get_imsm_raid_level(dev->vol.map),
-                                             chunk * 1024,
-                                             geo->size);
+                       } else
+                               geo->size = max_size;
                }
 
                if ((direction == ROLLBACK_METADATA_CHANGES)) {
@@ -10051,12 +10059,21 @@
                                geo->size );
                        if (current_size >= geo->size) {
                                fprintf(stderr,
-                                       Name " Error. Size expanssion is "
+                                       Name " Error. Size expansion is "
                                        "supported only (current size is %llu, "
                                        "requested size /rounded/ is %llu).\n",
                                        current_size, geo->size);
                                goto analyse_change_exit;
                        }
+                       if (max_size && geo->size > max_size) {
+                               fprintf(stderr,
+                                       Name " Error. Requested size is larger "
+                                       "than maximum available size (maximum "
+                                       "available size is %llu, "
+                                       "requested size /rounded/ is %llu).\n",
+                                       max_size, geo->size);
+                               goto analyse_change_exit;
+                       }
                }
                geo->size *= data_disks;
                geo->raid_disks = dev->vol.map->num_members;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mdadm-3.2.4/super1.c new/mdadm-3.2.5/super1.c
--- old/mdadm-3.2.4/super1.c    2012-05-09 01:42:57.000000000 +0200
+++ new/mdadm-3.2.5/super1.c    2012-05-18 09:10:03.000000000 +0200
@@ -1189,40 +1189,42 @@
                case 1:
                        sb->super_offset = __cpu_to_le64(0);
                        reserved = bm_space + 4*2;
+                       if (reserved < headroom)
+                               reserved = headroom;
+                       if (reserved + array_size > dsize)
+                               reserved = dsize - array_size;
                        /* Try for multiple of 1Meg so it is nicely aligned */
                        #define ONE_MEG (2*1024)
-                       reserved = ((reserved + ONE_MEG-1)/ONE_MEG) * ONE_MEG;
-                       if (reserved + __le64_to_cpu(sb->size) > dsize)
-                               reserved = dsize - __le64_to_cpu(sb->size);
+                       if (reserved > ONE_MEG)
+                               reserved = (reserved/ONE_MEG) * ONE_MEG;
+
                        /* force 4K alignment */
                        reserved &= ~7ULL;
 
-                       if (reserved < headroom)
-                               reserved = headroom;
-
                        sb->data_offset = __cpu_to_le64(reserved);
                        sb->data_size = __cpu_to_le64(dsize - reserved);
                        break;
                case 2:
                        sb_offset = 4*2;
                        sb->super_offset = __cpu_to_le64(4*2);
-                       if (4*2 + 4*2 + bm_space + __le64_to_cpu(sb->size)
+                       if (4*2 + 4*2 + bm_space + array_size
                            > dsize)
-                               bm_space = dsize - __le64_to_cpu(sb->size)
+                               bm_space = dsize - array_size
                                        - 4*2 - 4*2;
 
                        reserved = bm_space + 4*2 + 4*2;
+                       if (reserved < headroom)
+                               reserved = headroom;
+                       if (reserved + array_size > dsize)
+                               reserved = dsize - array_size;
                        /* Try for multiple of 1Meg so it is nicely aligned */
                        #define ONE_MEG (2*1024)
-                       reserved = ((reserved + ONE_MEG-1)/ONE_MEG) * ONE_MEG;
-                       if (reserved + __le64_to_cpu(sb->size) > dsize)
-                               reserved = dsize - __le64_to_cpu(sb->size);
+                       if (reserved > ONE_MEG)
+                               reserved = (reserved/ONE_MEG) * ONE_MEG;
+
                        /* force 4K alignment */
                        reserved &= ~7ULL;
 
-                       if (reserved < headroom)
-                               reserved = headroom;
-
                        sb->data_offset = __cpu_to_le64(reserved);
                        sb->data_size = __cpu_to_le64(dsize - reserved);
                        break;
@@ -1234,7 +1236,6 @@
                        goto out;
                }
 
-
                sb->sb_csum = calc_sb_1_csum(sb);
                rv = store_super1(st, di->fd);
                if (rv == 0 && (__le32_to_cpu(sb->feature_map) & 1))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mdadm-3.2.4/test new/mdadm-3.2.5/test
--- old/mdadm-3.2.4/test        2012-05-09 01:42:57.000000000 +0200
+++ new/mdadm-3.2.5/test        2012-05-18 09:10:03.000000000 +0200
@@ -37,12 +37,12 @@
 mdsize1a=19988
 mdsize12=19988
 # super1.2 for linear: round to multiple of 2, subtract 4
-mdsize1_l=18976
-mdsize2_l=18976
+mdsize1_l=19996
+mdsize2_l=19996
 # subtract another 4 for bitmaps
 mdsize1b=19988
 mdsize11=19992
-mdsize11a=18944
+mdsize11a=19456
 mdsize12=19988
 
 # ddf needs bigger devices as 32Meg is reserved!
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mdadm-3.2.4/tests/07autoassemble 
new/mdadm-3.2.5/tests/07autoassemble
--- old/mdadm-3.2.4/tests/07autoassemble        2012-05-09 01:42:57.000000000 
+0200
+++ new/mdadm-3.2.5/tests/07autoassemble        2012-05-18 09:10:03.000000000 
+0200
@@ -20,5 +20,5 @@
 mdadm -Ss
 mdadm -As -c /dev/null --homehost=testing -vvv
 testdev $md1 1 $mdsize1a 64
-testdev $md0 1 $[mdsize1a+mdsize11a-1024] 512
+testdev $md0 1 $[mdsize1a+mdsize11a] 512
 mdadm -Ss

-- 
To unsubscribe, e-mail: opensuse-commit+unsubscr...@opensuse.org
For additional commands, e-mail: opensuse-commit+h...@opensuse.org

Reply via email to