virtio: fail adding buffer on broken queues.
Heinz points out that adding buffers to a broken virtqueue (which should "never happen") still works. Failing allows drivers to detect and complain about broken devices. Now drivers are robust, we can add this extra check. Reported-by: Heinz Graalfs <graalfs@linux.vnet.ibm.com> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
9914a76617
commit
70670444c2
@ -204,6 +204,11 @@ static inline int virtqueue_add(struct virtqueue *_vq,
|
|||||||
|
|
||||||
BUG_ON(data == NULL);
|
BUG_ON(data == NULL);
|
||||||
|
|
||||||
|
if (unlikely(vq->broken)) {
|
||||||
|
END_USE(vq);
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
{
|
{
|
||||||
ktime_t now = ktime_get();
|
ktime_t now = ktime_get();
|
||||||
@ -310,7 +315,7 @@ static inline int virtqueue_add(struct virtqueue *_vq,
|
|||||||
* Caller must ensure we don't call this with other virtqueue operations
|
* Caller must ensure we don't call this with other virtqueue operations
|
||||||
* at the same time (except where noted).
|
* at the same time (except where noted).
|
||||||
*
|
*
|
||||||
* Returns zero or a negative error (ie. ENOSPC, ENOMEM).
|
* Returns zero or a negative error (ie. ENOSPC, ENOMEM, EIO).
|
||||||
*/
|
*/
|
||||||
int virtqueue_add_sgs(struct virtqueue *_vq,
|
int virtqueue_add_sgs(struct virtqueue *_vq,
|
||||||
struct scatterlist *sgs[],
|
struct scatterlist *sgs[],
|
||||||
@ -348,7 +353,7 @@ EXPORT_SYMBOL_GPL(virtqueue_add_sgs);
|
|||||||
* Caller must ensure we don't call this with other virtqueue operations
|
* Caller must ensure we don't call this with other virtqueue operations
|
||||||
* at the same time (except where noted).
|
* at the same time (except where noted).
|
||||||
*
|
*
|
||||||
* Returns zero or a negative error (ie. ENOSPC, ENOMEM).
|
* Returns zero or a negative error (ie. ENOSPC, ENOMEM, EIO).
|
||||||
*/
|
*/
|
||||||
int virtqueue_add_outbuf(struct virtqueue *vq,
|
int virtqueue_add_outbuf(struct virtqueue *vq,
|
||||||
struct scatterlist sg[], unsigned int num,
|
struct scatterlist sg[], unsigned int num,
|
||||||
@ -370,7 +375,7 @@ EXPORT_SYMBOL_GPL(virtqueue_add_outbuf);
|
|||||||
* Caller must ensure we don't call this with other virtqueue operations
|
* Caller must ensure we don't call this with other virtqueue operations
|
||||||
* at the same time (except where noted).
|
* at the same time (except where noted).
|
||||||
*
|
*
|
||||||
* Returns zero or a negative error (ie. ENOSPC, ENOMEM).
|
* Returns zero or a negative error (ie. ENOSPC, ENOMEM, EIO).
|
||||||
*/
|
*/
|
||||||
int virtqueue_add_inbuf(struct virtqueue *vq,
|
int virtqueue_add_inbuf(struct virtqueue *vq,
|
||||||
struct scatterlist sg[], unsigned int num,
|
struct scatterlist sg[], unsigned int num,
|
||||||
|
Loading…
Reference in New Issue
Block a user