Skip to content

Commit

Permalink
cdc-wdm: unify error handling in write
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Oliver Neukum authored and gregkh committed Mar 26, 2015
1 parent 4132cd0 commit 28965e1
Showing 1 changed file with 16 additions and 15 deletions.
31 changes: 16 additions & 15 deletions drivers/usb/class/cdc-wdm.c
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand All @@ -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;
Expand All @@ -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;
}

/*
Expand Down

0 comments on commit 28965e1

Please sign in to comment.