diff options
| -rw-r--r-- | drivers/pps/kapi.c | 2 | ||||
| -rw-r--r-- | drivers/pps/pps.c | 36 | 
2 files changed, 15 insertions, 23 deletions
diff --git a/drivers/pps/kapi.c b/drivers/pps/kapi.c index f197e8ea185..cdad4d95b20 100644 --- a/drivers/pps/kapi.c +++ b/drivers/pps/kapi.c @@ -102,7 +102,7 @@ struct pps_device *pps_register_source(struct pps_source_info *info,  		goto pps_register_source_exit;  	} -	/* These initializations must be done before calling idr_get_new() +	/* These initializations must be done before calling idr_alloc()  	 * in order to avoid reces into pps_event().  	 */  	pps->params.api_version = PPS_API_VERS; diff --git a/drivers/pps/pps.c b/drivers/pps/pps.c index 6437703eb10..7173e3ad475 100644 --- a/drivers/pps/pps.c +++ b/drivers/pps/pps.c @@ -295,29 +295,21 @@ int pps_register_cdev(struct pps_device *pps)  	dev_t devt;  	mutex_lock(&pps_idr_lock); -	/* Get new ID for the new PPS source */ -	if (idr_pre_get(&pps_idr, GFP_KERNEL) == 0) { -		mutex_unlock(&pps_idr_lock); -		return -ENOMEM; -	} - -	/* Now really allocate the PPS source. -	 * After idr_get_new() calling the new source will be freely available -	 * into the kernel. +	/* +	 * Get new ID for the new PPS source.  After idr_alloc() calling +	 * the new source will be freely available into the kernel.  	 */ -	err = idr_get_new(&pps_idr, pps, &pps->id); -	mutex_unlock(&pps_idr_lock); - -	if (err < 0) -		return err; - -	pps->id &= MAX_IDR_MASK; -	if (pps->id >= PPS_MAX_SOURCES) { -		pr_err("%s: too many PPS sources in the system\n", -					pps->info.name); -		err = -EBUSY; -		goto free_idr; +	err = idr_alloc(&pps_idr, pps, 0, PPS_MAX_SOURCES, GFP_KERNEL); +	if (err < 0) { +		if (err == -ENOSPC) { +			pr_err("%s: too many PPS sources in the system\n", +			       pps->info.name); +			err = -EBUSY; +		} +		goto out_unlock;  	} +	pps->id = err; +	mutex_unlock(&pps_idr_lock);  	devt = MKDEV(MAJOR(pps_devt), pps->id); @@ -351,8 +343,8 @@ del_cdev:  free_idr:  	mutex_lock(&pps_idr_lock);  	idr_remove(&pps_idr, pps->id); +out_unlock:  	mutex_unlock(&pps_idr_lock); -  	return err;  }  |