diff options
author | NeilBrown <neilb@suse.de> | 2012-04-18 11:00:07 +1000 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2012-04-18 11:00:07 +1000 |
commit | c2ecf5f61aca2d73b7d5a6cb3a26973916d5c0d1 (patch) | |
tree | 747e82e252a746c42c01879ec41587ae6c336935 /Monitor.c | |
parent | 480f3566411675ec41f18e5f6e15429f891e144c (diff) |
Add --prefer option for --detail and --monitor
Both --detail and --monitor can report the names of member
devices on an array, and do so by searching /dev and finding
the shortest name that matches.
If
--prefer=foo
is given, they will instead prefer a name that contain /foo/.
So
mdadm --detail /dev/md0 --prefer=by-path
will list the component devices via their /dev/disk/by-path/xxx
names.
Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'Monitor.c')
-rw-r--r-- | Monitor.c | 18 |
1 files changed, 11 insertions, 7 deletions
@@ -69,7 +69,7 @@ static int check_one_sharer(int scan); static void alert(char *event, char *dev, char *disc, struct alert_info *info); static int check_array(struct state *st, struct mdstat_ent *mdstat, int test, struct alert_info *info, - int increments); + int increments, char *prefer); static int add_new_arrays(struct mdstat_ent *mdstat, struct state **statelist, int test, struct alert_info *info); static void try_spare_migration(struct state *statelist, struct alert_info *info); @@ -79,7 +79,7 @@ int Monitor(struct mddev_dev *devlist, char *mailaddr, char *alert_cmd, int period, int daemonise, int scan, int oneshot, int dosyslog, int test, char *pidfile, int increments, - int share) + int share, char *prefer) { /* * Every few seconds, scan every md device looking for changes @@ -221,7 +221,8 @@ int Monitor(struct mddev_dev *devlist, mdstat = mdstat_read(oneshot?0:1, 0); for (st=statelist; st; st=st->next) - if (check_array(st, mdstat, test, &info, increments)) + if (check_array(st, mdstat, test, &info, + increments, prefer)) anydegraded = 1; /* now check if there are any new devices found in mdstat */ @@ -445,7 +446,7 @@ static void alert(char *event, char *dev, char *disc, struct alert_info *info) static int check_array(struct state *st, struct mdstat_ent *mdstat, int test, struct alert_info *ainfo, - int increments) + int increments, char *prefer) { /* Update the state 'st' to reflect any changes shown in mdstat, * or found by directly examining the array, and return @@ -617,7 +618,9 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat, disc.major = disc.minor = 0; } else if (info[i].major || info[i].minor) { newstate = info[i].state; - dv = map_dev(info[i].major, info[i].minor, 1); + dv = map_dev_preferred( + info[i].major, info[i].minor, 1, + prefer); disc.state = newstate; disc.major = info[i].major; disc.minor = info[i].minor; @@ -629,8 +632,9 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat, disc.major = disc.minor = 0; } if (dv == NULL && st->devid[i]) - dv = map_dev(major(st->devid[i]), - minor(st->devid[i]), 1); + dv = map_dev_preferred( + major(st->devid[i]), + minor(st->devid[i]), 1, prefer); change = newstate ^ st->devstate[i]; if (st->utime && change && !st->err) { if (i < array.raid_disks && |