qcow2: Remove request from in-flight list after error
If we complete a request with a failure we need to remove it from the list of requests that are in flight. If we don't do it, the next time the same AIOCB is used for a cluster allocation it will create a loop in the list and qemu will hang in an endless loop. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
		
							parent
							
								
									171e3d6b99
								
							
						
					
					
						commit
						c644db3d53
					
				| 
						 | 
				
			
			@ -811,6 +811,7 @@ int qcow2_alloc_cluster_offset(BlockDriverState *bs, uint64_t offset,
 | 
			
		|||
 | 
			
		||||
    cluster_offset = qcow2_alloc_clusters(bs, nb_clusters * s->cluster_size);
 | 
			
		||||
    if (cluster_offset < 0) {
 | 
			
		||||
        QLIST_REMOVE(m, next_in_flight);
 | 
			
		||||
        return cluster_offset;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -625,11 +625,15 @@ static void qcow_aio_write_cb(void *opaque, int ret)
 | 
			
		|||
                                    qcow_aio_write_cb, acb);
 | 
			
		||||
    if (acb->hd_aiocb == NULL) {
 | 
			
		||||
        ret = -EIO;
 | 
			
		||||
        goto done;
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
fail:
 | 
			
		||||
    if (acb->l2meta.nb_clusters != 0) {
 | 
			
		||||
        QLIST_REMOVE(&acb->l2meta, next_in_flight);
 | 
			
		||||
    }
 | 
			
		||||
done:
 | 
			
		||||
    if (acb->qiov->niov > 1)
 | 
			
		||||
        qemu_vfree(acb->orig_buf);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue