summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarol Wachowski <karol.wachowski@intel.com>2020-12-18 14:22:09 +0300
committerWachowski, Karol <karol.wachowski@intel.com>2021-01-08 11:17:14 +0300
commitf08c4b68288abc0b52f6f96d8179179e1c319b61 (patch)
treefd37482576cb4127c5218becda71bcc57e77d3b0
parent9f8a78c6a5891daeefcc059e03d0088868ad9807 (diff)
downloadlinux-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.c20
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: