diff options
Diffstat (limited to 'drivers/vhost/vhost.c')
-rw-r--r-- | drivers/vhost/vhost.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c index ad2146a9ab2d..236553e81027 100644 --- a/drivers/vhost/vhost.c +++ b/drivers/vhost/vhost.c | |||
@@ -1156,6 +1156,8 @@ int vhost_init_used(struct vhost_virtqueue *vq) | |||
1156 | { | 1156 | { |
1157 | __virtio16 last_used_idx; | 1157 | __virtio16 last_used_idx; |
1158 | int r; | 1158 | int r; |
1159 | bool is_le = vq->is_le; | ||
1160 | |||
1159 | if (!vq->private_data) { | 1161 | if (!vq->private_data) { |
1160 | vq->is_le = virtio_legacy_is_little_endian(); | 1162 | vq->is_le = virtio_legacy_is_little_endian(); |
1161 | return 0; | 1163 | return 0; |
@@ -1165,15 +1167,20 @@ int vhost_init_used(struct vhost_virtqueue *vq) | |||
1165 | 1167 | ||
1166 | r = vhost_update_used_flags(vq); | 1168 | r = vhost_update_used_flags(vq); |
1167 | if (r) | 1169 | if (r) |
1168 | return r; | 1170 | goto err; |
1169 | vq->signalled_used_valid = false; | 1171 | vq->signalled_used_valid = false; |
1170 | if (!access_ok(VERIFY_READ, &vq->used->idx, sizeof vq->used->idx)) | 1172 | if (!access_ok(VERIFY_READ, &vq->used->idx, sizeof vq->used->idx)) { |
1171 | return -EFAULT; | 1173 | r = -EFAULT; |
1174 | goto err; | ||
1175 | } | ||
1172 | r = __get_user(last_used_idx, &vq->used->idx); | 1176 | r = __get_user(last_used_idx, &vq->used->idx); |
1173 | if (r) | 1177 | if (r) |
1174 | return r; | 1178 | goto err; |
1175 | vq->last_used_idx = vhost16_to_cpu(vq, last_used_idx); | 1179 | vq->last_used_idx = vhost16_to_cpu(vq, last_used_idx); |
1176 | return 0; | 1180 | return 0; |
1181 | err: | ||
1182 | vq->is_le = is_le; | ||
1183 | return r; | ||
1177 | } | 1184 | } |
1178 | EXPORT_SYMBOL_GPL(vhost_init_used); | 1185 | EXPORT_SYMBOL_GPL(vhost_init_used); |
1179 | 1186 | ||