|
@@ -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;
|
|
|
}
|