drivers/dma: handle sysfs errors
From: Jeff Garzik <jeff@garzik.org> Signed-off-by: Jeff Garzik <jeff@garzik.org> Signed-off-by: Chris Leech <christopher.leech@intel.com>
This commit is contained in:
parent
000725d56a
commit
ff487fb773
1 changed files with 20 additions and 2 deletions
|
@ -316,7 +316,7 @@ EXPORT_SYMBOL(dma_async_client_chan_request);
|
|||
int dma_async_device_register(struct dma_device *device)
|
||||
{
|
||||
static int id;
|
||||
int chancnt = 0;
|
||||
int chancnt = 0, rc;
|
||||
struct dma_chan* chan;
|
||||
|
||||
if (!device)
|
||||
|
@ -338,8 +338,15 @@ int dma_async_device_register(struct dma_device *device)
|
|||
snprintf(chan->class_dev.class_id, BUS_ID_SIZE, "dma%dchan%d",
|
||||
device->dev_id, chan->chan_id);
|
||||
|
||||
rc = class_device_register(&chan->class_dev);
|
||||
if (rc) {
|
||||
chancnt--;
|
||||
free_percpu(chan->local);
|
||||
chan->local = NULL;
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
kref_get(&device->refcount);
|
||||
class_device_register(&chan->class_dev);
|
||||
}
|
||||
|
||||
mutex_lock(&dma_list_mutex);
|
||||
|
@ -349,6 +356,17 @@ int dma_async_device_register(struct dma_device *device)
|
|||
dma_chans_rebalance();
|
||||
|
||||
return 0;
|
||||
|
||||
err_out:
|
||||
list_for_each_entry(chan, &device->channels, device_node) {
|
||||
if (chan->local == NULL)
|
||||
continue;
|
||||
kref_put(&device->refcount, dma_async_device_cleanup);
|
||||
class_device_unregister(&chan->class_dev);
|
||||
chancnt--;
|
||||
free_percpu(chan->local);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL(dma_async_device_register);
|
||||
|
||||
|
|
Loading…
Reference in a new issue