diff options
Diffstat (limited to 'drivers/memstick/core/memstick.c')
| -rw-r--r-- | drivers/memstick/core/memstick.c | 21 | 
1 files changed, 10 insertions, 11 deletions
diff --git a/drivers/memstick/core/memstick.c b/drivers/memstick/core/memstick.c index 56ff19cdc2ad..ffcb10ac4341 100644 --- a/drivers/memstick/core/memstick.c +++ b/drivers/memstick/core/memstick.c @@ -512,18 +512,17 @@ int memstick_add_host(struct memstick_host *host)  {  	int rc; -	while (1) { -		if (!idr_pre_get(&memstick_host_idr, GFP_KERNEL)) -			return -ENOMEM; +	idr_preload(GFP_KERNEL); +	spin_lock(&memstick_host_lock); -		spin_lock(&memstick_host_lock); -		rc = idr_get_new(&memstick_host_idr, host, &host->id); -		spin_unlock(&memstick_host_lock); -		if (!rc) -			break; -		else if (rc != -EAGAIN) -			return rc; -	} +	rc = idr_alloc(&memstick_host_idr, host, 0, 0, GFP_NOWAIT); +	if (rc >= 0) +		host->id = rc; + +	spin_unlock(&memstick_host_lock); +	idr_preload_end(); +	if (rc < 0) +		return rc;  	dev_set_name(&host->dev, "memstick%u", host->id);  |