diff options
Diffstat (limited to 'drivers/misc/cxl/file.c')
| -rw-r--r-- | drivers/misc/cxl/file.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/drivers/misc/cxl/file.c b/drivers/misc/cxl/file.c index e9f2f10dbb37..b15d8113877c 100644 --- a/drivers/misc/cxl/file.c +++ b/drivers/misc/cxl/file.c | |||
| @@ -140,18 +140,20 @@ static long afu_ioctl_start_work(struct cxl_context *ctx, | |||
| 140 | 140 | ||
| 141 | pr_devel("%s: pe: %i\n", __func__, ctx->pe); | 141 | pr_devel("%s: pe: %i\n", __func__, ctx->pe); |
| 142 | 142 | ||
| 143 | mutex_lock(&ctx->status_mutex); | 143 | /* Do this outside the status_mutex to avoid a circular dependency with |
| 144 | if (ctx->status != OPENED) { | 144 | * the locking in cxl_mmap_fault() */ |
| 145 | rc = -EIO; | ||
| 146 | goto out; | ||
| 147 | } | ||
| 148 | |||
| 149 | if (copy_from_user(&work, uwork, | 145 | if (copy_from_user(&work, uwork, |
| 150 | sizeof(struct cxl_ioctl_start_work))) { | 146 | sizeof(struct cxl_ioctl_start_work))) { |
| 151 | rc = -EFAULT; | 147 | rc = -EFAULT; |
| 152 | goto out; | 148 | goto out; |
| 153 | } | 149 | } |
| 154 | 150 | ||
| 151 | mutex_lock(&ctx->status_mutex); | ||
| 152 | if (ctx->status != OPENED) { | ||
| 153 | rc = -EIO; | ||
| 154 | goto out; | ||
| 155 | } | ||
| 156 | |||
| 155 | /* | 157 | /* |
| 156 | * if any of the reserved fields are set or any of the unused | 158 | * if any of the reserved fields are set or any of the unused |
| 157 | * flags are set it's invalid | 159 | * flags are set it's invalid |
