diff options
author | Karol Wachowski <karol.wachowski@intel.com> | 2020-12-18 14:22:09 +0300 |
---|---|---|
committer | Wachowski, Karol <karol.wachowski@intel.com> | 2021-01-08 11:17:14 +0300 |
commit | f08c4b68288abc0b52f6f96d8179179e1c319b61 (patch) | |
tree | fd37482576cb4127c5218becda71bcc57e77d3b0 | |
parent | 9f8a78c6a5891daeefcc059e03d0088868ad9807 (diff) | |
download | linux-f08c4b68288abc0b52f6f96d8179179e1c319b61.tar.xz |
fixup! aspeed-mctp: Add EID information related ioctls
Fix error when swapping two empty lists.
Copy count in ASPEED_MCTP_GET_EID_INFO to userbuf instead of
incorrectly returning it by value.
Change-Id: I8549a3a988d1f44106582729b9a6eca650ded256
Signed-off-by: Karol Wachowski <karol.wachowski@intel.com>
-rw-r--r-- | drivers/soc/aspeed/aspeed-mctp.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/drivers/soc/aspeed/aspeed-mctp.c b/drivers/soc/aspeed/aspeed-mctp.c index 453ede400349..f7e59c5fc615 100644 --- a/drivers/soc/aspeed/aspeed-mctp.c +++ b/drivers/soc/aspeed/aspeed-mctp.c @@ -175,6 +175,9 @@ struct aspeed_mctp { spinlock_t clients_lock; struct list_head endpoints; size_t endpoints_count; + /* + * endpoints_lock protects list of endpoints + */ struct mutex endpoints_lock; struct { struct regmap *map; @@ -994,11 +997,11 @@ static int aspeed_mctp_get_eid_info(struct aspeed_mctp *priv, void __user *userbuf) { int count = 0; + int ret = 0; struct aspeed_mctp_get_eid_info get_eid; struct aspeed_mctp_endpoint *endpoint; struct aspeed_mctp_eid_info *user_ptr; size_t count_to_copy; - int ret; if (copy_from_user(&get_eid, userbuf, sizeof(get_eid))) { dev_err(priv->dev, "copy from user failed\n"); @@ -1008,7 +1011,7 @@ aspeed_mctp_get_eid_info(struct aspeed_mctp *priv, void __user *userbuf) mutex_lock(&priv->endpoints_lock); if (get_eid.count == 0) { - ret = priv->endpoints_count; + count = priv->endpoints_count; goto out_unlock; } @@ -1027,8 +1030,14 @@ aspeed_mctp_get_eid_info(struct aspeed_mctp *priv, void __user *userbuf) } count++; } - ret = count; + out_unlock: + get_eid.count = count; + if (copy_to_user(userbuf, &get_eid, sizeof(get_eid))) { + dev_err(priv->dev, "copy to user failed\n"); + ret = -EFAULT; + } + mutex_unlock(&priv->endpoints_lock); return ret; } @@ -1127,7 +1136,10 @@ aspeed_mctp_set_eid_info(struct aspeed_mctp *priv, void __user *userbuf) } mutex_lock(&priv->endpoints_lock); - list_swap(&priv->endpoints, &list); + if (list_empty(&priv->endpoints)) + list_splice_init(&list, &priv->endpoints); + else + list_swap(&list, &priv->endpoints); priv->endpoints_count = set_eid.count; mutex_unlock(&priv->endpoints_lock); out: |