diff options
| author | Tejun Heo <tj@kernel.org> | 2013-02-27 17:04:05 -0800 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-02-27 19:10:15 -0800 | 
| commit | 37b61890d757f606c25ac5a247572cb7d5efde96 (patch) | |
| tree | b81abfb289f4d2be4ee77a2b555c26bde6dae6e7 /drivers/firewire/core-cdev.c | |
| parent | 3bec60d511179853138836ae6e1b61fe34d9235f (diff) | |
| download | olio-linux-3.10-37b61890d757f606c25ac5a247572cb7d5efde96.tar.xz olio-linux-3.10-37b61890d757f606c25ac5a247572cb7d5efde96.zip  | |
firewire: convert to idr_alloc()
Convert to the much saner new idr interface.
v2: Stefan pointed out that add_client_resource() may be called from
    non-process context.  Preload iff @gfp_mask contains __GFP_WAIT.
    Also updated to include minor upper limit check.
[tim.gardner@canonical.com: fix accidentally orphaned 'minor'[
Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Signed-off-by: Tim Gardner <tim.gardner@canonical.com>
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/firewire/core-cdev.c')
| -rw-r--r-- | drivers/firewire/core-cdev.c | 19 | 
1 files changed, 10 insertions, 9 deletions
diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c index 68c31381cd0..27ac423ab25 100644 --- a/drivers/firewire/core-cdev.c +++ b/drivers/firewire/core-cdev.c @@ -487,27 +487,28 @@ static int ioctl_get_info(struct client *client, union ioctl_arg *arg)  static int add_client_resource(struct client *client,  			       struct client_resource *resource, gfp_t gfp_mask)  { +	bool preload = gfp_mask & __GFP_WAIT;  	unsigned long flags;  	int ret; - retry: -	if (idr_pre_get(&client->resource_idr, gfp_mask) == 0) -		return -ENOMEM; - +	if (preload) +		idr_preload(gfp_mask);  	spin_lock_irqsave(&client->lock, flags); +  	if (client->in_shutdown)  		ret = -ECANCELED;  	else -		ret = idr_get_new(&client->resource_idr, resource, -				  &resource->handle); +		ret = idr_alloc(&client->resource_idr, resource, 0, 0, +				GFP_NOWAIT);  	if (ret >= 0) { +		resource->handle = ret;  		client_get(client);  		schedule_if_iso_resource(resource);  	} -	spin_unlock_irqrestore(&client->lock, flags); -	if (ret == -EAGAIN) -		goto retry; +	spin_unlock_irqrestore(&client->lock, flags); +	if (preload) +		idr_preload_end();  	return ret < 0 ? ret : 0;  }  |