Skip to content

Commit

Permalink
ipmi: Properly release srcu locks on error conditions
Browse files Browse the repository at this point in the history
When SRCU was added for handling hotplug, some error conditions
were not handled properly.

Signed-off-by: Corey Minyard <cminyard@mvista.com>
  • Loading branch information
Corey Minyard committed May 24, 2018
1 parent 58aae18 commit 048f7c3
Showing 1 changed file with 25 additions and 18 deletions.
43 changes: 25 additions & 18 deletions drivers/char/ipmi/ipmi_msghandler.c
Original file line number Diff line number Diff line change
Expand Up @@ -1291,53 +1291,56 @@ int ipmi_set_my_address(struct ipmi_user *user,
unsigned int channel,
unsigned char address)
{
int index;
int index, rv = 0;

user = acquire_ipmi_user(user, &index);
if (!user)
return -ENODEV;

if (channel >= IPMI_MAX_CHANNELS)
return -EINVAL;
user->intf->addrinfo[channel].address = address;
rv = -EINVAL;
else
user->intf->addrinfo[channel].address = address;
release_ipmi_user(user, index);

return 0;
return rv;
}
EXPORT_SYMBOL(ipmi_set_my_address);

int ipmi_get_my_address(struct ipmi_user *user,
unsigned int channel,
unsigned char *address)
{
int index;
int index, rv = 0;

user = acquire_ipmi_user(user, &index);
if (!user)
return -ENODEV;

if (channel >= IPMI_MAX_CHANNELS)
return -EINVAL;
*address = user->intf->addrinfo[channel].address;
rv = -EINVAL;
else
*address = user->intf->addrinfo[channel].address;
release_ipmi_user(user, index);

return 0;
return rv;
}
EXPORT_SYMBOL(ipmi_get_my_address);

int ipmi_set_my_LUN(struct ipmi_user *user,
unsigned int channel,
unsigned char LUN)
{
int index;
int index, rv = 0;

user = acquire_ipmi_user(user, &index);
if (!user)
return -ENODEV;

if (channel >= IPMI_MAX_CHANNELS)
return -EINVAL;
user->intf->addrinfo[channel].lun = LUN & 0x3;
rv = -EINVAL;
else
user->intf->addrinfo[channel].lun = LUN & 0x3;
release_ipmi_user(user, index);

return 0;
Expand All @@ -1348,18 +1351,19 @@ int ipmi_get_my_LUN(struct ipmi_user *user,
unsigned int channel,
unsigned char *address)
{
int index;
int index, rv = 0;

user = acquire_ipmi_user(user, &index);
if (!user)
return -ENODEV;

if (channel >= IPMI_MAX_CHANNELS)
return -EINVAL;
*address = user->intf->addrinfo[channel].lun;
rv = -EINVAL;
else
*address = user->intf->addrinfo[channel].lun;
release_ipmi_user(user, index);

return 0;
return rv;
}
EXPORT_SYMBOL(ipmi_get_my_LUN);

Expand Down Expand Up @@ -1540,8 +1544,10 @@ int ipmi_register_for_cmd(struct ipmi_user *user,
return -ENODEV;

rcvr = kmalloc(sizeof(*rcvr), GFP_KERNEL);
if (!rcvr)
return -ENOMEM;
if (!rcvr) {
rv = -ENOMEM;
goto out_release;
}
rcvr->cmd = cmd;
rcvr->netfn = netfn;
rcvr->chans = chans;
Expand All @@ -1559,10 +1565,11 @@ int ipmi_register_for_cmd(struct ipmi_user *user,

list_add_rcu(&rcvr->link, &intf->cmd_rcvrs);

out_unlock:
out_unlock:
mutex_unlock(&intf->cmd_rcvrs_mutex);
if (rv)
kfree(rcvr);
out_release:
release_ipmi_user(user, index);

return rv;
Expand Down

0 comments on commit 048f7c3

Please sign in to comment.