usr/src/uts/common/os/devcfg.c
changeset 12329 edd9b6e1b428
parent 12288 70ddea689280
child 12588 1cb8fb936e1f
equal deleted inserted replaced
12328:3c94f669d87d 12329:edd9b6e1b428
  8828 {
  8828 {
  8829 	alias_pair_t *pair;
  8829 	alias_pair_t *pair;
  8830 	char *curr;
  8830 	char *curr;
  8831 	dev_info_t *currdip = NULL;
  8831 	dev_info_t *currdip = NULL;
  8832 	char *aliasdup;
  8832 	char *aliasdup;
  8833 	int len;
  8833 	int rv, len;
  8834 
  8834 
  8835 	pair = &(ddi_aliases.dali_alias_pairs[i]);
  8835 	pair = &(ddi_aliases.dali_alias_pairs[i]);
  8836 	len = strlen(pair->pair_alias);
  8836 	len = strlen(pair->pair_alias);
  8837 
  8837 
  8838 	curr = NULL;
  8838 	curr = NULL;
  8846 		goto out;
  8846 		goto out;
  8847 
  8847 
  8848 	if (alias[len] != '/' && alias[len] != '\0')
  8848 	if (alias[len] != '/' && alias[len] != '\0')
  8849 		goto out;
  8849 		goto out;
  8850 
  8850 
  8851 
       
  8852 	curr = kmem_alloc(MAXPATHLEN, KM_NOSLEEP);
  8851 	curr = kmem_alloc(MAXPATHLEN, KM_NOSLEEP);
  8853 	if (curr == NULL) {
  8852 	if (curr == NULL) {
  8854 		cmn_err(CE_PANIC, "curr alloc failed");
  8853 		cmn_err(CE_PANIC, "curr alloc failed");
  8855 		/*NOTREACHED*/
  8854 		/*NOTREACHED*/
  8856 	}
  8855 	}
  8862 
  8861 
  8863 	currdip = path_to_dip(curr);
  8862 	currdip = path_to_dip(curr);
  8864 
  8863 
  8865 out:
  8864 out:
  8866 	if (currdip) {
  8865 	if (currdip) {
  8867 		(void) mod_hash_insert(ddi_aliases.dali_alias_TLB,
  8866 		rv = mod_hash_insert(ddi_aliases.dali_alias_TLB,
  8868 		    (mod_hash_key_t)aliasdup, (mod_hash_val_t)curr);
  8867 		    (mod_hash_key_t)aliasdup, (mod_hash_val_t)curr);
       
  8868 		if (rv != 0) {
       
  8869 			kmem_free(curr, MAXPATHLEN);
       
  8870 			strfree(aliasdup);
       
  8871 		}
  8869 	} else {
  8872 	} else {
  8870 		(void) mod_hash_insert(ddi_aliases.dali_alias_TLB,
  8873 		rv = mod_hash_insert(ddi_aliases.dali_alias_TLB,
  8871 		    (mod_hash_key_t)aliasdup, (mod_hash_val_t)NULL);
  8874 		    (mod_hash_key_t)aliasdup, (mod_hash_val_t)NULL);
       
  8875 		if (rv != 0) {
       
  8876 			strfree(aliasdup);
       
  8877 		}
  8872 		if (curr)
  8878 		if (curr)
  8873 			kmem_free(curr, MAXPATHLEN);
  8879 			kmem_free(curr, MAXPATHLEN);
  8874 	}
  8880 	}
  8875 
  8881 
  8876 	return (currdip);
  8882 	return (currdip);
  8881 {
  8887 {
  8882 	alias_pair_t	*pair;
  8888 	alias_pair_t	*pair;
  8883 	char		*alias;
  8889 	char		*alias;
  8884 	char		*currdup;
  8890 	char		*currdup;
  8885 	int		len;
  8891 	int		len;
       
  8892 	int		rv;
  8886 
  8893 
  8887 	pair = &(ddi_aliases.dali_curr_pairs[i]);
  8894 	pair = &(ddi_aliases.dali_curr_pairs[i]);
  8888 
  8895 
  8889 	len = strlen(pair->pair_curr);
  8896 	len = strlen(pair->pair_curr);
  8890 
  8897 
  8918 		kmem_free(alias, MAXPATHLEN);
  8925 		kmem_free(alias, MAXPATHLEN);
  8919 		alias = NULL;
  8926 		alias = NULL;
  8920 	}
  8927 	}
  8921 
  8928 
  8922 out:
  8929 out:
  8923 	(void) mod_hash_insert(ddi_aliases.dali_curr_TLB,
  8930 	rv = mod_hash_insert(ddi_aliases.dali_curr_TLB,
  8924 	    (mod_hash_key_t)currdup, (mod_hash_val_t)alias);
  8931 	    (mod_hash_key_t)currdup, (mod_hash_val_t)alias);
       
  8932 	if (rv != 0) {
       
  8933 		strfree(currdup);
       
  8934 	}
  8925 
  8935 
  8926 	return (alias);
  8936 	return (alias);
  8927 }
  8937 }
  8928 
  8938 
  8929 dev_info_t *
  8939 dev_info_t *
  8930 ddi_alias_redirect(char *alias)
  8940 ddi_alias_redirect(char *alias)
  8931 {
  8941 {
  8932 	char		*curr;
  8942 	char		*curr;
  8933 	char		*aliasdup;
       
  8934 	dev_info_t	*currdip;
  8943 	dev_info_t	*currdip;
  8935 	int		i;
  8944 	int		i;
  8936 
  8945 
  8937 	if (ddi_aliases_present == B_FALSE)
  8946 	if (ddi_aliases_present == B_FALSE)
  8938 		return (NULL);
  8947 		return (NULL);
  8948 	curr = NULL;
  8957 	curr = NULL;
  8949 	if (mod_hash_find(ddi_aliases.dali_alias_TLB,
  8958 	if (mod_hash_find(ddi_aliases.dali_alias_TLB,
  8950 	    (mod_hash_key_t)alias, (mod_hash_val_t *)&curr) == 0) {
  8959 	    (mod_hash_key_t)alias, (mod_hash_val_t *)&curr) == 0) {
  8951 		currdip = curr ? path_to_dip(curr) : NULL;
  8960 		currdip = curr ? path_to_dip(curr) : NULL;
  8952 		goto out;
  8961 		goto out;
  8953 	}
       
  8954 
       
  8955 	aliasdup = ddi_strdup(alias, KM_NOSLEEP);
       
  8956 	if (aliasdup == NULL) {
       
  8957 		cmn_err(CE_PANIC, "aliasdup alloc failed");
       
  8958 		/*NOTREACHED*/
       
  8959 	}
  8962 	}
  8960 
  8963 
  8961 	/* The TLB has no translation, do it the hard way */
  8964 	/* The TLB has no translation, do it the hard way */
  8962 	currdip = NULL;
  8965 	currdip = NULL;
  8963 	for (i = ddi_aliases.dali_num_pairs - 1; i >= 0; i--) {
  8966 	for (i = ddi_aliases.dali_num_pairs - 1; i >= 0; i--) {