--- /dev/null
+Subject: ANNOUNCE: mdadm 2.1 - A tool for managing Soft RAID under Linux
+
+I am pleased to announce the availability of
+ mdadm version 2.1
+
+It is available at the usual places:
+ http://www.cse.unsw.edu.au/~neilb/source/mdadm/
+and
+ http://www.{countrycode}.kernel.org/pub/linux/utils/raid/mdadm/
+
+mdadm is a tool for creating, managing and monitoring
+device arrays using the "md" driver in Linux, also
+known as Software RAID arrays.
+
+Release 2.1 fixes a few problems found after the release of 2.0.
+If you are using raid10 or version-1 superblocks and upgrade is
+recommended.
+
+Specifically:
+ - Fix assembling of raid10 array when devices are missing.
+ mdadm now correctly detects if a array is workable or not
+ depending on which devices are present, and so will correctly
+ handle "--assemble --force" if multiple devices have failed.
+ - Report raid10 layout in --examine output.
+ - Fix assembling of arrays that use the version-1 superblock and
+ have spares. Previously the spares would be ignored.
+ - Fix bug so that multiple drives can be re-added at once.
+ - Fix problem with hot-adding a bitmap to version-1-superblock
+ arrays.
+
+
+Development of mdadm is sponsored by
+ SUSE Labs, Novell Inc.
+
+NeilBrown 12th September 2005
+
+
#include "mdadm.h"
-char Version[] = Name " - v2.0 - 25 August 2005\n";
+char Version[] = Name " - v2.1 - 12 September 2005\n";
/*
* File: ReadMe.c
.\" -*- nroff -*-
-.TH MDADM 8 "" v2.0m
+.TH MDADM 8 "" v2.1
.SH NAME
mdadm \- manage MD devices
.I aka
Summary: mdadm is used for controlling Linux md devices (aka RAID arrays)
Name: mdadm
-Version: 2.0
+Version: 2.1
Release: 1
Source: http://www.cse.unsw.edu.au/~neilb/source/mdadm/mdadm-%{version}.tgz
URL: http://www.cse.unsw.edu.au/~neilb/source/mdadm/
mdu_disk_info_t *dinfo, char *devname)
{
struct mdp_superblock_1 *sb = sbv;
- struct mdp_superblock_1 *refsb = NULL;
+ void *refsbv = NULL;
int fd = open(devname, O_RDWR | O_EXCL);
int rfd;
int rv;
if (rfd >= 0) close(rfd);
sb->events = 0;
- if (load_super1(st, fd, (void**)&refsb, NULL)==0) {
+ if (load_super1(st, fd, &refsbv, NULL)==0) {
+ struct mdp_superblock_1 *refsb = refsbv;
+
memcpy(sb->device_uuid, refsb->device_uuid, 16);
if (memcmp(sb->set_uuid, refsb->set_uuid, 16)==0) {
/* same array, so preserve events and dev_number */
unsigned long long offset;
struct mdp_superblock_1 *sb;
- if (sbv)
- sb = sbv;
- else {
- if (st->ss->load_super(st, fd, (void**)&sb, NULL))
+ if (!sbv)
+ if (st->ss->load_super(st, fd, sbv, NULL))
return; /* no error I hope... */
- }
+
+ sb = sbv;
+
offset = __le64_to_cpu(sb->super_offset);
offset += (long) __le32_to_cpu(sb->bitmap_offset);
if (!sbv)