summaryrefslogtreecommitdiffstats
path: root/super-intel.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2008-09-18 08:07:32 +0200
committerNeilBrown <neilb@suse.de>2008-09-18 08:07:32 +0200
commit51006d85865f8fd1bb495bfc37fb83414117f149 (patch)
tree3c08ad154aa8e3cd2cb1e7f254d6484d025f7cbc /super-intel.c
parentAllow metadata handler to report that it doesn't record homehost. (diff)
downloadmdadm-51006d85865f8fd1bb495bfc37fb83414117f149.tar.xz
mdadm-51006d85865f8fd1bb495bfc37fb83414117f149.zip
Add uuid support for super-intel.
'imsm' does not provide any real uuid, so we synthesise one from various stable bits of the superblock.
Diffstat (limited to 'super-intel.c')
-rw-r--r--super-intel.c47
1 files changed, 42 insertions, 5 deletions
diff --git a/super-intel.c b/super-intel.c
index f632bcfe..4571b869 100644
--- a/super-intel.c
+++ b/super-intel.c
@@ -17,8 +17,10 @@
* 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
*/
+#define HAVE_STDINT_H 1
#include "mdadm.h"
#include "mdmon.h"
+#include "sha1.h"
#include <values.h>
#include <scsi/sg.h>
#include <ctype.h>
@@ -583,13 +585,46 @@ static int match_home_imsm(struct supertype *st, char *homehost)
static void uuid_from_super_imsm(struct supertype *st, int uuid[4])
{
- /* imsm does not track uuid's so just make sure we never return
- * the same value twice to break uuid matching in Manage_subdevs
- * FIXME what about the use of uuid's with bitmap's?
+ /* The uuid returned here is used for:
+ * uuid to put into bitmap file (Create, Grow)
+ * uuid for backup header when saving critical section (Grow)
+ * comparing uuids when re-adding a device into an array
+ * In these cases the uuid required is that of the data-array,
+ * not the device-set.
+ * uuid to recognise same set when adding a missing device back
+ * to an array. This is a uuid for the device-set.
+ *
+ * For each of these we can make do with a truncated
+ * or hashed uuid rather than the original, as long as
+ * everyone agrees.
+ * In each case the uuid required is that of the data-array,
+ * not the device-set.
*/
- static int dummy_id = 0;
+ /* imsm does not track uuid's so we synthesis one using sha1 on
+ * - The signature (Which is constant for all imsm array, but no matter)
+ * - the family_num of the container
+ * - the index number of the volume
+ * - the 'serial' number of the volume.
+ * Hopefully these are all constant.
+ */
+ struct intel_super *super = st->sb;
- uuid[0] = dummy_id++;
+ char buf[20];
+ struct sha1_ctx ctx;
+ struct imsm_dev *dev = NULL;
+
+ sha1_init_ctx(&ctx);
+ sha1_process_bytes(super->anchor->sig, MAX_SIGNATURE_LENGTH, &ctx);
+ sha1_process_bytes(&super->anchor->family_num, sizeof(__u32), &ctx);
+ if (super->current_vol >= 0)
+ dev = get_imsm_dev(super, super->current_vol);
+ if (dev) {
+ __u32 vol = super->current_vol;
+ sha1_process_bytes(&vol, sizeof(vol), &ctx);
+ sha1_process_bytes(dev->volume, MAX_RAID_SERIAL_LEN, &ctx);
+ }
+ sha1_finish_ctx(&ctx, buf);
+ memcpy(uuid, buf, 4*4);
}
#if 0
@@ -673,6 +708,7 @@ static void getinfo_super_imsm_volume(struct supertype *st, struct mdinfo *info)
devnum2devname(st->container_dev),
info->container_member);
info->safe_mode_delay = 4000; /* 4 secs like the Matrix driver */
+ uuid_from_super_imsm(st, info->uuid);
}
@@ -722,6 +758,7 @@ static void getinfo_super_imsm(struct supertype *st, struct mdinfo *info)
info->disk.state |= s & FAILED_DISK ? (1 << MD_DISK_FAULTY) : 0;
info->disk.state |= s & USABLE_DISK ? (1 << MD_DISK_SYNC) : 0;
}
+ uuid_from_super_imsm(st, info->uuid);
}
static int update_super_imsm(struct supertype *st, struct mdinfo *info,