| From a4929ccc771f5763db091007feabd16fdf4c54d3 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 20 Sep 2018 10:29:13 +0800 |
| Subject: misc: genwqe: should return proper error value. |
| |
| From: zhong jiang <zhongjiang@huawei.com> |
| |
| [ Upstream commit 02241995b004faa7d9ff628e97f24056190853f8 ] |
| |
| The function should return -EFAULT when copy_from_user fails. Even |
| though the caller does not distinguish them. but we should keep backward |
| compatibility. |
| |
| Signed-off-by: zhong jiang <zhongjiang@huawei.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/misc/genwqe/card_utils.c | 13 +++++++------ |
| 1 file changed, 7 insertions(+), 6 deletions(-) |
| |
| diff --git a/drivers/misc/genwqe/card_utils.c b/drivers/misc/genwqe/card_utils.c |
| index f68435df76d48..22301bba8c495 100644 |
| --- a/drivers/misc/genwqe/card_utils.c |
| +++ b/drivers/misc/genwqe/card_utils.c |
| @@ -298,7 +298,7 @@ static int genwqe_sgl_size(int num_pages) |
| int genwqe_alloc_sync_sgl(struct genwqe_dev *cd, struct genwqe_sgl *sgl, |
| void __user *user_addr, size_t user_size, int write) |
| { |
| - int rc; |
| + int ret = -ENOMEM; |
| struct pci_dev *pci_dev = cd->pci_dev; |
| |
| sgl->fpage_offs = offset_in_page((unsigned long)user_addr); |
| @@ -318,7 +318,7 @@ int genwqe_alloc_sync_sgl(struct genwqe_dev *cd, struct genwqe_sgl *sgl, |
| if (get_order(sgl->sgl_size) > MAX_ORDER) { |
| dev_err(&pci_dev->dev, |
| "[%s] err: too much memory requested!\n", __func__); |
| - return -ENOMEM; |
| + return ret; |
| } |
| |
| sgl->sgl = __genwqe_alloc_consistent(cd, sgl->sgl_size, |
| @@ -326,7 +326,7 @@ int genwqe_alloc_sync_sgl(struct genwqe_dev *cd, struct genwqe_sgl *sgl, |
| if (sgl->sgl == NULL) { |
| dev_err(&pci_dev->dev, |
| "[%s] err: no memory available!\n", __func__); |
| - return -ENOMEM; |
| + return ret; |
| } |
| |
| /* Only use buffering on incomplete pages */ |
| @@ -339,7 +339,7 @@ int genwqe_alloc_sync_sgl(struct genwqe_dev *cd, struct genwqe_sgl *sgl, |
| /* Sync with user memory */ |
| if (copy_from_user(sgl->fpage + sgl->fpage_offs, |
| user_addr, sgl->fpage_size)) { |
| - rc = -EFAULT; |
| + ret = -EFAULT; |
| goto err_out; |
| } |
| } |
| @@ -352,7 +352,7 @@ int genwqe_alloc_sync_sgl(struct genwqe_dev *cd, struct genwqe_sgl *sgl, |
| /* Sync with user memory */ |
| if (copy_from_user(sgl->lpage, user_addr + user_size - |
| sgl->lpage_size, sgl->lpage_size)) { |
| - rc = -EFAULT; |
| + ret = -EFAULT; |
| goto err_out2; |
| } |
| } |
| @@ -374,7 +374,8 @@ int genwqe_alloc_sync_sgl(struct genwqe_dev *cd, struct genwqe_sgl *sgl, |
| sgl->sgl = NULL; |
| sgl->sgl_dma_addr = 0; |
| sgl->sgl_size = 0; |
| - return -ENOMEM; |
| + |
| + return ret; |
| } |
| |
| int genwqe_setup_sgl(struct genwqe_dev *cd, struct genwqe_sgl *sgl, |
| -- |
| 2.20.1 |
| |