summaryrefslogtreecommitdiffstats
path: root/drivers/vhost/vhost.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/vhost/vhost.c')
-rw-r--r--drivers/vhost/vhost.c15
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;
1181err:
1182 vq->is_le = is_le;
1183 return r;
1177} 1184}
1178EXPORT_SYMBOL_GPL(vhost_init_used); 1185EXPORT_SYMBOL_GPL(vhost_init_used);
1179 1186