added --path <path_id> to give the information on the 'path-id' of removed device
<path-id> allows to identify the port to which given device is plugged in. In case of hot-removal, udev can pass this information for future use (eg. write this name as 'cookie' allowing to detect the fact of reinserting device to the same port). --path <path-id> parameter has been added to device removal handle (and char *path has been added to IncrementalRemove() to pass this value) in order to pass path-id to this handler. Signed-off-by: Przemyslaw Czarnowski <przemyslaw.hawrylewicz.czarnowski@intel.com> Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
parent
157e6e24b9
commit
950bc34477
|
@ -1351,17 +1351,23 @@ static int Incremental_container(struct supertype *st, char *devname,
|
||||||
* raid arrays, and if so first fail (if needed) and then remove the device.
|
* raid arrays, and if so first fail (if needed) and then remove the device.
|
||||||
*
|
*
|
||||||
* @devname - The device we want to remove
|
* @devname - The device we want to remove
|
||||||
|
* @id_path - name as found in /dev/disk/by-path for this device
|
||||||
*
|
*
|
||||||
* Note: the device name must be a kernel name like "sda", so
|
* Note: the device name must be a kernel name like "sda", so
|
||||||
* that we can find it in /proc/mdstat
|
* that we can find it in /proc/mdstat
|
||||||
*/
|
*/
|
||||||
int IncrementalRemove(char *devname, int verbose)
|
int IncrementalRemove(char *devname, char *id_path, int verbose)
|
||||||
{
|
{
|
||||||
int mdfd;
|
int mdfd;
|
||||||
int rv;
|
int rv;
|
||||||
struct mdstat_ent *ent;
|
struct mdstat_ent *ent;
|
||||||
struct mddev_dev devlist;
|
struct mddev_dev devlist;
|
||||||
|
|
||||||
|
if (!id_path)
|
||||||
|
dprintf(Name ": incremental removal without --path <id_path> "
|
||||||
|
"lacks the possibility to re-add new device in this "
|
||||||
|
"port\n");
|
||||||
|
|
||||||
if (strchr(devname, '/')) {
|
if (strchr(devname, '/')) {
|
||||||
fprintf(stderr, Name ": incremental removal requires a "
|
fprintf(stderr, Name ": incremental removal requires a "
|
||||||
"kernel device name, not a file: %s\n", devname);
|
"kernel device name, not a file: %s\n", devname);
|
||||||
|
|
2
ReadMe.c
2
ReadMe.c
|
@ -191,6 +191,8 @@ struct option long_options[] = {
|
||||||
|
|
||||||
/* For Incremental */
|
/* For Incremental */
|
||||||
{"rebuild-map", 0, 0, 'r'},
|
{"rebuild-map", 0, 0, 'r'},
|
||||||
|
{"path", 1, 0, IncrementalPath},
|
||||||
|
|
||||||
{0, 0, 0, 0}
|
{0, 0, 0, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
17
mdadm.c
17
mdadm.c
|
@ -104,6 +104,7 @@ int main(int argc, char *argv[])
|
||||||
int rebuild_map = 0;
|
int rebuild_map = 0;
|
||||||
int auto_update_home = 0;
|
int auto_update_home = 0;
|
||||||
char *subarray = NULL;
|
char *subarray = NULL;
|
||||||
|
char *remove_path = NULL;
|
||||||
|
|
||||||
int print_help = 0;
|
int print_help = 0;
|
||||||
FILE *outf;
|
FILE *outf;
|
||||||
|
@ -943,6 +944,9 @@ int main(int argc, char *argv[])
|
||||||
case O(INCREMENTAL, 'r'):
|
case O(INCREMENTAL, 'r'):
|
||||||
rebuild_map = 1;
|
rebuild_map = 1;
|
||||||
continue;
|
continue;
|
||||||
|
case O(INCREMENTAL, IncrementalPath):
|
||||||
|
remove_path = optarg;
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
/* We have now processed all the valid options. Anything else is
|
/* We have now processed all the valid options. Anything else is
|
||||||
* an error
|
* an error
|
||||||
|
@ -1586,12 +1590,13 @@ int main(int argc, char *argv[])
|
||||||
rv = 1;
|
rv = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (devmode == 'f') {
|
if (devmode == 'f')
|
||||||
rv = IncrementalRemove(devlist->devname, verbose-quiet);
|
rv = IncrementalRemove(devlist->devname, remove_path,
|
||||||
break;
|
verbose-quiet);
|
||||||
}
|
else
|
||||||
rv = Incremental(devlist->devname, verbose-quiet, runstop,
|
rv = Incremental(devlist->devname, verbose-quiet,
|
||||||
ss, homehost, require_homehost, autof);
|
runstop, ss, homehost,
|
||||||
|
require_homehost, autof);
|
||||||
break;
|
break;
|
||||||
case AUTODETECT:
|
case AUTODETECT:
|
||||||
autodetect();
|
autodetect();
|
||||||
|
|
3
mdadm.h
3
mdadm.h
|
@ -280,6 +280,7 @@ enum special_options {
|
||||||
DetailPlatform,
|
DetailPlatform,
|
||||||
KillSubarray,
|
KillSubarray,
|
||||||
UpdateSubarray, /* 16 */
|
UpdateSubarray, /* 16 */
|
||||||
|
IncrementalPath
|
||||||
};
|
};
|
||||||
|
|
||||||
/* structures read from config file */
|
/* structures read from config file */
|
||||||
|
@ -928,7 +929,7 @@ extern int Incremental(char *devname, int verbose, int runstop,
|
||||||
int autof);
|
int autof);
|
||||||
extern void RebuildMap(void);
|
extern void RebuildMap(void);
|
||||||
extern int IncrementalScan(int verbose);
|
extern int IncrementalScan(int verbose);
|
||||||
extern int IncrementalRemove(char *devname, int verbose);
|
extern int IncrementalRemove(char *devname, char *path, int verbose);
|
||||||
extern int CreateBitmap(char *filename, int force, char uuid[16],
|
extern int CreateBitmap(char *filename, int force, char uuid[16],
|
||||||
unsigned long chunksize, unsigned long daemon_sleep,
|
unsigned long chunksize, unsigned long daemon_sleep,
|
||||||
unsigned long write_behind,
|
unsigned long write_behind,
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
SUBSYSTEM!="block", GOTO="md_end"
|
SUBSYSTEM!="block", GOTO="md_end"
|
||||||
|
|
||||||
# handle potential components of arrays
|
# handle potential components of arrays
|
||||||
ENV{ID_FS_TYPE}=="linux_raid_member", ACTION=="remove", RUN+="/sbin/mdadm -If $name"
|
ENV{ID_FS_TYPE}=="linux_raid_member", ACTION=="remove", RUN+="/sbin/mdadm -If $name --path $env{ID_PATH}"
|
||||||
ENV{ID_FS_TYPE}=="linux_raid_member", ACTION=="add", RUN+="/sbin/mdadm --incremental $env{DEVNAME}"
|
ENV{ID_FS_TYPE}=="linux_raid_member", ACTION=="add", RUN+="/sbin/mdadm --incremental $env{DEVNAME}"
|
||||||
|
|
||||||
# handle md arrays
|
# handle md arrays
|
||||||
|
|
Loading…
Reference in New Issue