forked from Minki/linux
cdc-wdm: unify error handling in write
This makes sure the error handling path is the same for all error conditions, thus reducing code duplication. Signed-off-by: Oliver Neukum <oneukum@suse.de>0 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
4132cd02db
commit
28965e17ee
@ -349,30 +349,25 @@ static ssize_t wdm_write
|
||||
|
||||
r = copy_from_user(buf, buffer, count);
|
||||
if (r > 0) {
|
||||
kfree(buf);
|
||||
rv = -EFAULT;
|
||||
goto outnl;
|
||||
goto out_free_mem;
|
||||
}
|
||||
|
||||
/* concurrent writes and disconnect */
|
||||
r = mutex_lock_interruptible(&desc->wlock);
|
||||
rv = -ERESTARTSYS;
|
||||
if (r) {
|
||||
kfree(buf);
|
||||
goto outnl;
|
||||
}
|
||||
if (r)
|
||||
goto out_free_mem;
|
||||
|
||||
if (test_bit(WDM_DISCONNECTING, &desc->flags)) {
|
||||
kfree(buf);
|
||||
rv = -ENODEV;
|
||||
goto outnp;
|
||||
goto out_free_mem_lock;
|
||||
}
|
||||
|
||||
r = usb_autopm_get_interface(desc->intf);
|
||||
if (r < 0) {
|
||||
kfree(buf);
|
||||
rv = usb_translate_errors(r);
|
||||
goto outnp;
|
||||
goto out_free_mem_lock;
|
||||
}
|
||||
|
||||
if (!(file->f_flags & O_NONBLOCK))
|
||||
@ -386,9 +381,8 @@ static ssize_t wdm_write
|
||||
r = -EIO;
|
||||
|
||||
if (r < 0) {
|
||||
kfree(buf);
|
||||
rv = r;
|
||||
goto out;
|
||||
goto out_free_mem_pm;
|
||||
}
|
||||
|
||||
req = desc->orq;
|
||||
@ -415,21 +409,28 @@ static ssize_t wdm_write
|
||||
|
||||
rv = usb_submit_urb(desc->command, GFP_KERNEL);
|
||||
if (rv < 0) {
|
||||
kfree(buf);
|
||||
desc->outbuf = NULL;
|
||||
clear_bit(WDM_IN_USE, &desc->flags);
|
||||
dev_err(&desc->intf->dev, "Tx URB error: %d\n", rv);
|
||||
rv = usb_translate_errors(rv);
|
||||
goto out_free_mem_pm;
|
||||
} else {
|
||||
dev_dbg(&desc->intf->dev, "Tx URB has been submitted index=%d",
|
||||
req->wIndex);
|
||||
}
|
||||
out:
|
||||
|
||||
usb_autopm_put_interface(desc->intf);
|
||||
outnp:
|
||||
mutex_unlock(&desc->wlock);
|
||||
outnl:
|
||||
return rv < 0 ? rv : count;
|
||||
|
||||
out_free_mem_pm:
|
||||
usb_autopm_put_interface(desc->intf);
|
||||
out_free_mem_lock:
|
||||
mutex_unlock(&desc->wlock);
|
||||
out_free_mem:
|
||||
kfree(buf);
|
||||
return rv;
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user