diff --git a/scst/src/dev_handlers/scst_user.c b/scst/src/dev_handlers/scst_user.c index 2b54b2604..56e5f667f 100644 --- a/scst/src/dev_handlers/scst_user.c +++ b/scst/src/dev_handlers/scst_user.c @@ -2356,29 +2356,27 @@ out: return res; } -static int dev_user_reply_get_multi(struct file *file, void __user *arg) +static int dev_user_reply_get_multi(struct file *file, + struct scst_user_get_multi __user* gm) { int res = 0, rc; - struct scst_user_dev *dev; + struct scst_user_dev *dev = file->private_data; struct scst_user_reply_cmd __user *replies; int16_t i, replies_cnt, replies_done = 0, cmds_cnt = 0; TRACE_ENTRY(); - dev = (struct scst_user_dev *)file->private_data; res = dev_user_check_reg(dev); if (unlikely(res != 0)) goto out; - res = get_user(replies_cnt, (int16_t __user *) - &((struct scst_user_get_multi __user *)arg)->replies_cnt); + res = get_user(replies_cnt, &gm->replies_cnt); if (unlikely(res < 0)) { PRINT_ERROR("%s", "Unable to get replies_cnt"); goto out; } - res = get_user(cmds_cnt, (int16_t __user *) - &((struct scst_user_get_multi __user *)arg)->cmds_cnt); + res = get_user(cmds_cnt, &gm->cmds_cnt); if (unlikely(res < 0)) { PRINT_ERROR("%s", "Unable to get cmds_cnt"); goto out; @@ -2391,8 +2389,7 @@ static int dev_user_reply_get_multi(struct file *file, void __user *arg) goto get_cmds; /* get_user() can't be used with 64-bit values on x86_32 */ - rc = copy_from_user(&replies, (uint64_t __user *) - &((struct scst_user_get_multi __user *)arg)->preplies, sizeof(replies)); + rc = copy_from_user(&replies, &gm->preplies, sizeof(replies)); if (unlikely(rc != 0)) { PRINT_ERROR("%s", "Unable to get preply"); res = -EFAULT; @@ -2419,15 +2416,13 @@ static int dev_user_reply_get_multi(struct file *file, void __user *arg) } TRACE_DBG("Returning %d replies_done", replies_done); - res = put_user(replies_done, (int16_t __user *) - &((struct scst_user_get_multi __user *)arg)->replies_done); + res = put_user(replies_done, &gm->replies_done); if (unlikely(res < 0)) goto out; get_cmds: for (i = 0; i < cmds_cnt; i++) { - res = dev_user_get_cmd_to_user(dev, - &((struct scst_user_get_multi __user *)arg)->cmds[i], i == 0); + res = dev_user_get_cmd_to_user(dev, &gm->cmds[i], i == 0); if (res != 0) { if ((res == -EAGAIN) && (i > 0)) res = 0; @@ -2436,8 +2431,7 @@ get_cmds: } TRACE_DBG("Returning %d cmds_ret", i); - rc = put_user(i, (int16_t __user *) - &((struct scst_user_get_multi __user *)arg)->cmds_cnt); + rc = put_user(i, &gm->cmds_cnt); if (unlikely(rc < 0)) { res = rc; /* this error is more important */ goto out; @@ -2449,10 +2443,8 @@ out: out_part_replies_done: TRACE_DBG("Partial returning %d replies_done", replies_done); - put_user(replies_done, (int16_t __user *) - &((struct scst_user_get_multi __user *)arg)->replies_done); - rc = put_user(0, (int16_t __user *) - &((struct scst_user_get_multi __user *)arg)->cmds_cnt); + put_user(replies_done, &gm->replies_done); + rc = put_user(0, &gm->cmds_cnt); goto out; }