diff options
author | Jerry Gilliam <Jerry.Gilliam@Sun.COM> | 2009-02-16 12:06:27 -0800 |
---|---|---|
committer | Jerry Gilliam <Jerry.Gilliam@Sun.COM> | 2009-02-16 12:06:27 -0800 |
commit | 6532b9600e063234d62bca681503353c01abad20 (patch) | |
tree | 0635e04a2713cfe39a3bcf0eb7396722060a76ff /usr/src/cmd/devfsadm/devfsadm.c | |
parent | d35886f1bd1fe7bb59fc0efda96f064aba885f75 (diff) | |
download | illumos-joyent-6532b9600e063234d62bca681503353c01abad20.tar.gz |
4854243 update_drv -d requires reboot
Diffstat (limited to 'usr/src/cmd/devfsadm/devfsadm.c')
-rw-r--r-- | usr/src/cmd/devfsadm/devfsadm.c | 43 |
1 files changed, 30 insertions, 13 deletions
diff --git a/usr/src/cmd/devfsadm/devfsadm.c b/usr/src/cmd/devfsadm/devfsadm.c index 662f5de021..03e512a3f4 100644 --- a/usr/src/cmd/devfsadm/devfsadm.c +++ b/usr/src/cmd/devfsadm/devfsadm.c @@ -516,12 +516,16 @@ parse_args(int argc, char *argv[]) int num_aliases = 0; int len; int retval; - int add_bind = FALSE; + int config = TRUE; + int bind = FALSE; + int force_flag = FALSE; struct aliases *ap = NULL; struct aliases *a_head = NULL; struct aliases *a_tail = NULL; struct modconfig mc; + (void) bzero(&mc, sizeof (mc)); + if (strcmp(prog, DISKS) == 0) { compat_class = "disk"; get_linkcompat_opts = TRUE; @@ -596,7 +600,7 @@ parse_args(int argc, char *argv[]) build_dev = FALSE; while ((opt = - getopt(argc, argv, "a:bdc:i:m:np:R:r:svV:")) != EOF) { + getopt(argc, argv, "a:bcd:fi:m:np:R:r:suvV:")) != EOF) { switch (opt) { case 'a': ap = calloc(sizeof (struct aliases), 1); @@ -616,10 +620,10 @@ parse_args(int argc, char *argv[]) } a_tail = ap; num_aliases++; - add_bind = TRUE; + bind = TRUE; break; case 'b': - add_bind = TRUE; + bind = TRUE; break; case 'c': (void) strcpy(mc.drvclass, optarg); @@ -630,6 +634,9 @@ parse_args(int argc, char *argv[]) * do nothing. */ break; + case 'f': + force_flag = TRUE; + break; case 'i': single_drv = TRUE; (void) strcpy(mc.drvname, optarg); @@ -672,6 +679,14 @@ parse_args(int argc, char *argv[]) file_mods = FALSE; flush_path_to_inst_enable = FALSE; break; + case 'u': + /* + * Invoked via update_drv(1m) to update + * the kernel's driver/alias binding + * when removing one or more aliases. + */ + config = FALSE; + break; case 'v': /* documented verbose flag */ add_verbose_id(VERBOSE_MID); @@ -689,18 +704,20 @@ parse_args(int argc, char *argv[]) usage(); } - if ((add_bind == TRUE) && (mc.major == -1 || - mc.drvname[0] == NULL)) { - err_print(MAJOR_AND_B_FLAG); - devfsadm_exit(1); - /*NOTREACHED*/ - } - if (add_bind == TRUE) { + if (bind == TRUE) { + if ((mc.major == -1) || (mc.drvname[0] == NULL)) { + err_print(MAJOR_AND_B_FLAG); + devfsadm_exit(1); + /*NOTREACHED*/ + } + mc.flags = (force_flag) ? MOD_UNBIND_OVERRIDE : 0; mc.num_aliases = num_aliases; mc.ap = a_head; - retval = modctl(MODADDMAJBIND, NULL, (caddr_t)&mc); + retval = modctl((config == TRUE) ? MODADDMAJBIND : + MODREMDRVALIAS, NULL, (caddr_t)&mc); if (retval < 0) { - err_print(MODCTL_ADDMAJBIND); + err_print((config == TRUE) ? MODCTL_ADDMAJBIND : + MODCTL_REMMAJBIND); } devfsadm_exit(retval); /*NOTREACHED*/ |