summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2005-07-18 01:30:42 +0000
committerNeil Brown <neilb@suse.de>2005-07-18 01:30:42 +0000
commitfbf8a0b7a6f107c0fcecb6fea5640ffb1bc0d9c2 (patch)
tree6de8349d9242cfe11ad7ea0c3ac394a530315cf6
parentbea93430e8b9327688fa9f6d5220d9250546a292 (diff)
downloadmdadm-fbf8a0b7a6f107c0fcecb6fea5640ffb1bc0d9c2.tar.gz
mdadm-fbf8a0b7a6f107c0fcecb6fea5640ffb1bc0d9c2.tar.xz
mdadm-fbf8a0b7a6f107c0fcecb6fea5640ffb1bc0d9c2.zip
Document this...
Signed-off-by: Neil Brown <neilb@cse.unsw.edu.au>
-rw-r--r--Assemble.c13
-rw-r--r--Query.c33
-rw-r--r--mdadm.h2
-rw-r--r--super0.c1
-rw-r--r--super1.c4
5 files changed, 35 insertions, 18 deletions
diff --git a/Assemble.c b/Assemble.c
index 5bf58ab..89086e3 100644
--- a/Assemble.c
+++ b/Assemble.c
@@ -473,6 +473,7 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
if (!devices[j].uptodate)
continue;
info.disk.number = i;
+ info.disk.raid_disk = i;
info.disk.state = desired_state;
if (devices[j].uptodate &&
@@ -526,7 +527,17 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
/* Almost ready to actually *do* something */
if (!old_linux) {
- if (ioctl(mdfd, SET_ARRAY_INFO, NULL) != 0) {
+ int rv;
+ if ((vers % 100) >= 1) { /* can use different versions */
+ mdu_array_info_t inf;
+ memset(&inf, 0, sizeof(inf));
+ inf.major_version = st->ss->major;
+ inf.minor_version = st->minor_version;
+ rv = ioctl(mdfd, SET_ARRAY_INFO, &inf);
+ } else
+ rv = ioctl(mdfd, SET_ARRAY_INFO, NULL);
+
+ if (rv) {
fprintf(stderr, Name ": SET_ARRAY_INFO failed for %s: %s\n",
mddev, strerror(errno));
return 1;
diff --git a/Query.c b/Query.c
index 4c2c7bf..d2bfb05 100644
--- a/Query.c
+++ b/Query.c
@@ -105,26 +105,31 @@ int Query(char *dev)
if (superror == 0) {
/* array might be active... */
st->ss->getinfo_super(&info, super);
- mddev = get_md_name(info.array.md_minor);
- disc.number = info.disk.number;
- activity = "undetected";
- if (mddev && (fd = open(mddev, O_RDONLY))>=0) {
- if (md_get_version(fd) >= 9000 &&
- ioctl(fd, GET_ARRAY_INFO, &array)>= 0) {
- if (ioctl(fd, GET_DISK_INFO, &disc) >= 0 &&
- makedev((unsigned)disc.major,(unsigned)disc.minor) == stb.st_rdev)
- activity = "active";
- else
- activity = "mismatch";
+ if (st->ss->major == 0) {
+ mddev = get_md_name(info.array.md_minor);
+ disc.number = info.disk.number;
+ activity = "undetected";
+ if (mddev && (fd = open(mddev, O_RDONLY))>=0) {
+ if (md_get_version(fd) >= 9000 &&
+ ioctl(fd, GET_ARRAY_INFO, &array)>= 0) {
+ if (ioctl(fd, GET_DISK_INFO, &disc) >= 0 &&
+ makedev((unsigned)disc.major,(unsigned)disc.minor) == stb.st_rdev)
+ activity = "active";
+ else
+ activity = "mismatch";
+ }
+ close(fd);
}
- close(fd);
+ } else {
+ activity = "unknown";
+ mddev = "array";
}
- printf("%s: device %d in %d device %s %s md%d. Use mdadm --examine for more detail.\n",
+ printf("%s: device %d in %d device %s %s %s. Use mdadm --examine for more detail.\n",
dev,
info.disk.number, info.array.raid_disks,
activity,
map_num(pers, info.array.level),
- info.array.md_minor);
+ mddev);
}
return 0;
}
diff --git a/mdadm.h b/mdadm.h
index 1451c33..ac3feb1 100644
--- a/mdadm.h
+++ b/mdadm.h
@@ -73,7 +73,7 @@ struct mdinfo {
mdu_array_info_t array;
mdu_disk_info_t disk;
__u64 events;
- unsigned int uuid[4];
+ int uuid[4];
};
#define Name "mdadm"
diff --git a/super0.c b/super0.c
index ada598a..7e1b58d 100644
--- a/super0.c
+++ b/super0.c
@@ -205,6 +205,7 @@ static void getinfo_super0(struct mdinfo *info, void *sbv)
info->disk.major = sb->this_disk.major;
info->disk.minor = sb->this_disk.minor;
info->disk.raid_disk = sb->this_disk.raid_disk;
+ info->disk.number = sb->this_disk.number;
info->events = md_event(sb);
diff --git a/super1.c b/super1.c
index 31cf9a3..6bd5cec 100644
--- a/super1.c
+++ b/super1.c
@@ -278,7 +278,7 @@ static void getinfo_super1(struct mdinfo *info, void *sbv)
info->disk.major = 0;
info->disk.minor = 0;
-
+ info->disk.number = __le32_to_cpu(sb->dev_number);
if (__le32_to_cpu(sb->dev_number) >= __le32_to_cpu(sb->max_dev) ||
__le32_to_cpu(sb->max_dev) > 512)
role = 0xfffe;
@@ -303,7 +303,7 @@ static void getinfo_super1(struct mdinfo *info, void *sbv)
for (i=0; i< __le32_to_cpu(sb->max_dev); i++) {
role = __le16_to_cpu(sb->dev_roles[i]);
- if (role == 0xFFFF || role < info->array.raid_disks)
+ if (/*role == 0xFFFF || */role < info->array.raid_disks)
working++;
}