diff options
Diffstat (limited to 'usr/src/cmd/devfsadm/misc_link.c')
| -rw-r--r-- | usr/src/cmd/devfsadm/misc_link.c | 47 | 
1 files changed, 45 insertions, 2 deletions
| diff --git a/usr/src/cmd/devfsadm/misc_link.c b/usr/src/cmd/devfsadm/misc_link.c index 5f241df296..49be9e9b2d 100644 --- a/usr/src/cmd/devfsadm/misc_link.c +++ b/usr/src/cmd/devfsadm/misc_link.c @@ -21,7 +21,7 @@  /*   * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.   * Copyright 2011 Nexenta Systems, Inc.  All rights reserved. - * Copyright (c) 2015, Joyent, Inc. All rights reserved. + * Copyright 2019 Joyent, Inc.   */  #include <regex.h> @@ -32,6 +32,7 @@  #include <limits.h>  #include <sys/zone.h>  #include <sys/zcons.h> +#include <sys/zfd.h>  #include <sys/cpuid_drv.h>  static int display(di_minor_t minor, di_node_t node); @@ -53,6 +54,7 @@ static int av_create(di_minor_t minor, di_node_t node);  static int tsalarm_create(di_minor_t minor, di_node_t node);  static int ntwdt_create(di_minor_t minor, di_node_t node);  static int zcons_create(di_minor_t minor, di_node_t node); +static int zfd_create(di_minor_t minor, di_node_t node);  static int cpuid(di_minor_t minor, di_node_t node);  static int glvc(di_minor_t minor, di_node_t node);  static int ses_callback(di_minor_t minor, di_node_t node); @@ -114,12 +116,15 @@ static devfsadm_create_t misc_cbt[] = {  	    "(^nca$)|(^rds$)|(^sdp$)|(^ipnet$)|(^dlpistub$)|(^bpf$)",  	    TYPE_EXACT | DRV_RE, ILEVEL_1, minor_name  	}, +	{ "pseudo", "ddi_pseudo", "inotify", +	    TYPE_EXACT | DRV_EXACT, ILEVEL_0, minor_name +	},  	{ "pseudo", "ddi_pseudo", "ipd",  	    TYPE_EXACT | DRV_EXACT, ILEVEL_0, minor_name  	},  	{ "pseudo", "ddi_pseudo",  	    "(^ipf$)|(^ipnat$)|(^ipstate$)|(^ipauth$)|" -	    "(^ipsync$)|(^ipscan$)|(^iplookup$)", +	    "(^ipsync$)|(^ipscan$)|(^iplookup$)|(^ipfev$)",  	    TYPE_EXACT | DRV_RE, ILEVEL_0, minor_name,  	},  	{ "pseudo", "ddi_pseudo", "dld", @@ -180,6 +185,9 @@ static devfsadm_create_t misc_cbt[] = {  	{ "pseudo", "ddi_pseudo", "zcons",  	    TYPE_EXACT | DRV_EXACT, ILEVEL_0, zcons_create,  	}, +	{ "pseudo", "ddi_pseudo", "zfd", +	    TYPE_EXACT | DRV_EXACT, ILEVEL_0, zfd_create, +	},  	{ "pseudo", "ddi_pseudo", CPUID_DRIVER_NAME,  	    TYPE_EXACT | DRV_EXACT, ILEVEL_0, cpuid,  	}, @@ -204,6 +212,9 @@ static devfsadm_create_t misc_cbt[] = {  	{ "pseudo", "ddi_pseudo", "tpm",  	    TYPE_EXACT | DRV_EXACT, ILEVEL_0, minor_name  	}, +	{ "pseudo", "ddi_pseudo", "overlay", +	    TYPE_EXACT | DRV_EXACT, ILEVEL_0, minor_name +	}  };  DEVFSADM_CREATE_INIT_V0(misc_cbt); @@ -228,6 +239,9 @@ static devfsadm_remove_t misc_remove_cbt[] = {  		ZCONS_SLAVE_NAME ")$",  	    RM_PRE | RM_HOT | RM_ALWAYS, ILEVEL_0, devfsadm_rm_all  	}, +	{ "pseudo", "^zfd/" ZONENAME_REGEXP "/(master|slave)/[0-9]+$", +	    RM_PRE | RM_HOT | RM_ALWAYS, ILEVEL_0, devfsadm_rm_all +	},  	{ "pseudo", "^" CPUID_SELF_NAME "$", RM_ALWAYS | RM_PRE | RM_HOT,  	    ILEVEL_0, devfsadm_rm_all  	}, @@ -675,6 +689,35 @@ zcons_create(di_minor_t minor, di_node_t node)  	return (DEVFSADM_CONTINUE);  } +static int +zfd_create(di_minor_t minor, di_node_t node) +{ +	char	*minor_str; +	char	*zonename; +	int	*id; +	char	path[MAXPATHLEN]; + +	minor_str = di_minor_name(minor); + +	if (di_prop_lookup_strings(DDI_DEV_T_ANY, node, "zfd_zname", +	    &zonename) == -1) +		return (DEVFSADM_CONTINUE); + +	if (di_prop_lookup_ints(DDI_DEV_T_ANY, node, "zfd_id", &id) == -1) +		return (DEVFSADM_CONTINUE); + +	if (strncmp(minor_str, "slave", 5) == 0) { +		(void) snprintf(path, sizeof (path), "zfd/%s/slave/%d", +		    zonename, id[0]); +	} else { +		(void) snprintf(path, sizeof (path), "zfd/%s/master/%d", +		    zonename, id[0]); +	} +	(void) devfsadm_mklink(path, node, minor, 0); + +	return (DEVFSADM_CONTINUE); +} +  /*   *	/dev/cpu/self/cpuid 	->	/devices/pseudo/cpuid@0:self   */ | 
