block: Allow BDRV_REQ_FUA through blk_pwrite()
We have several block drivers that understand BDRV_REQ_FUA, and emulate it in the block layer for the rest by a full flush. But without a way to actually request BDRV_REQ_FUA during a pass-through blk_pwrite(), FUA-aware block drivers like NBD are forced to repeat the emulation logic of a full flush regardless of whether the backend they are writing to could do it more efficiently. This patch just wires up a flags argument; followup patches will actually make use of it in the NBD driver and in qemu-io. Signed-off-by: Eric Blake <eblake@redhat.com> Acked-by: Denis V. Lunev <den@openvz.org> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
		
							parent
							
								
									0e01b76e7c
								
							
						
					
					
						commit
						8341f00dc2
					
				@ -953,9 +953,11 @@ int blk_pread(BlockBackend *blk, int64_t offset, void *buf, int count)
 | 
				
			|||||||
    return count;
 | 
					    return count;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int blk_pwrite(BlockBackend *blk, int64_t offset, const void *buf, int count)
 | 
					int blk_pwrite(BlockBackend *blk, int64_t offset, const void *buf, int count,
 | 
				
			||||||
 | 
					               BdrvRequestFlags flags)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int ret = blk_prw(blk, offset, (void*) buf, count, blk_write_entry, 0);
 | 
					    int ret = blk_prw(blk, offset, (void *) buf, count, blk_write_entry,
 | 
				
			||||||
 | 
					                      flags);
 | 
				
			||||||
    if (ret < 0) {
 | 
					    if (ret < 0) {
 | 
				
			||||||
        return ret;
 | 
					        return ret;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -91,7 +91,7 @@ static ssize_t block_crypto_write_func(QCryptoBlock *block,
 | 
				
			|||||||
    struct BlockCryptoCreateData *data = opaque;
 | 
					    struct BlockCryptoCreateData *data = opaque;
 | 
				
			||||||
    ssize_t ret;
 | 
					    ssize_t ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ret = blk_pwrite(data->blk, offset, buf, buflen);
 | 
					    ret = blk_pwrite(data->blk, offset, buf, buflen, 0);
 | 
				
			||||||
    if (ret < 0) {
 | 
					    if (ret < 0) {
 | 
				
			||||||
        error_setg_errno(errp, -ret, "Could not write encryption header");
 | 
					        error_setg_errno(errp, -ret, "Could not write encryption header");
 | 
				
			||||||
        return ret;
 | 
					        return ret;
 | 
				
			||||||
 | 
				
			|||||||
@ -512,7 +512,7 @@ static int parallels_create(const char *filename, QemuOpts *opts, Error **errp)
 | 
				
			|||||||
    memset(tmp, 0, sizeof(tmp));
 | 
					    memset(tmp, 0, sizeof(tmp));
 | 
				
			||||||
    memcpy(tmp, &header, sizeof(header));
 | 
					    memcpy(tmp, &header, sizeof(header));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ret = blk_pwrite(file, 0, tmp, BDRV_SECTOR_SIZE);
 | 
					    ret = blk_pwrite(file, 0, tmp, BDRV_SECTOR_SIZE, 0);
 | 
				
			||||||
    if (ret < 0) {
 | 
					    if (ret < 0) {
 | 
				
			||||||
        goto exit;
 | 
					        goto exit;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -853,14 +853,14 @@ static int qcow_create(const char *filename, QemuOpts *opts, Error **errp)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* write all the data */
 | 
					    /* write all the data */
 | 
				
			||||||
    ret = blk_pwrite(qcow_blk, 0, &header, sizeof(header));
 | 
					    ret = blk_pwrite(qcow_blk, 0, &header, sizeof(header), 0);
 | 
				
			||||||
    if (ret != sizeof(header)) {
 | 
					    if (ret != sizeof(header)) {
 | 
				
			||||||
        goto exit;
 | 
					        goto exit;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (backing_file) {
 | 
					    if (backing_file) {
 | 
				
			||||||
        ret = blk_pwrite(qcow_blk, sizeof(header),
 | 
					        ret = blk_pwrite(qcow_blk, sizeof(header),
 | 
				
			||||||
            backing_file, backing_filename_len);
 | 
					                         backing_file, backing_filename_len, 0);
 | 
				
			||||||
        if (ret != backing_filename_len) {
 | 
					        if (ret != backing_filename_len) {
 | 
				
			||||||
            goto exit;
 | 
					            goto exit;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -869,8 +869,8 @@ static int qcow_create(const char *filename, QemuOpts *opts, Error **errp)
 | 
				
			|||||||
    tmp = g_malloc0(BDRV_SECTOR_SIZE);
 | 
					    tmp = g_malloc0(BDRV_SECTOR_SIZE);
 | 
				
			||||||
    for (i = 0; i < ((sizeof(uint64_t)*l1_size + BDRV_SECTOR_SIZE - 1)/
 | 
					    for (i = 0; i < ((sizeof(uint64_t)*l1_size + BDRV_SECTOR_SIZE - 1)/
 | 
				
			||||||
        BDRV_SECTOR_SIZE); i++) {
 | 
					        BDRV_SECTOR_SIZE); i++) {
 | 
				
			||||||
        ret = blk_pwrite(qcow_blk, header_size +
 | 
					        ret = blk_pwrite(qcow_blk, header_size + BDRV_SECTOR_SIZE * i,
 | 
				
			||||||
            BDRV_SECTOR_SIZE*i, tmp, BDRV_SECTOR_SIZE);
 | 
					                         tmp, BDRV_SECTOR_SIZE, 0);
 | 
				
			||||||
        if (ret != BDRV_SECTOR_SIZE) {
 | 
					        if (ret != BDRV_SECTOR_SIZE) {
 | 
				
			||||||
            g_free(tmp);
 | 
					            g_free(tmp);
 | 
				
			||||||
            goto exit;
 | 
					            goto exit;
 | 
				
			||||||
 | 
				
			|||||||
@ -2207,7 +2207,7 @@ static int qcow2_create2(const char *filename, int64_t total_size,
 | 
				
			|||||||
            cpu_to_be64(QCOW2_COMPAT_LAZY_REFCOUNTS);
 | 
					            cpu_to_be64(QCOW2_COMPAT_LAZY_REFCOUNTS);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ret = blk_pwrite(blk, 0, header, cluster_size);
 | 
					    ret = blk_pwrite(blk, 0, header, cluster_size, 0);
 | 
				
			||||||
    g_free(header);
 | 
					    g_free(header);
 | 
				
			||||||
    if (ret < 0) {
 | 
					    if (ret < 0) {
 | 
				
			||||||
        error_setg_errno(errp, -ret, "Could not write qcow2 header");
 | 
					        error_setg_errno(errp, -ret, "Could not write qcow2 header");
 | 
				
			||||||
@ -2217,7 +2217,7 @@ static int qcow2_create2(const char *filename, int64_t total_size,
 | 
				
			|||||||
    /* Write a refcount table with one refcount block */
 | 
					    /* Write a refcount table with one refcount block */
 | 
				
			||||||
    refcount_table = g_malloc0(2 * cluster_size);
 | 
					    refcount_table = g_malloc0(2 * cluster_size);
 | 
				
			||||||
    refcount_table[0] = cpu_to_be64(2 * cluster_size);
 | 
					    refcount_table[0] = cpu_to_be64(2 * cluster_size);
 | 
				
			||||||
    ret = blk_pwrite(blk, cluster_size, refcount_table, 2 * cluster_size);
 | 
					    ret = blk_pwrite(blk, cluster_size, refcount_table, 2 * cluster_size, 0);
 | 
				
			||||||
    g_free(refcount_table);
 | 
					    g_free(refcount_table);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (ret < 0) {
 | 
					    if (ret < 0) {
 | 
				
			||||||
 | 
				
			|||||||
@ -601,18 +601,18 @@ static int qed_create(const char *filename, uint32_t cluster_size,
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    qed_header_cpu_to_le(&header, &le_header);
 | 
					    qed_header_cpu_to_le(&header, &le_header);
 | 
				
			||||||
    ret = blk_pwrite(blk, 0, &le_header, sizeof(le_header));
 | 
					    ret = blk_pwrite(blk, 0, &le_header, sizeof(le_header), 0);
 | 
				
			||||||
    if (ret < 0) {
 | 
					    if (ret < 0) {
 | 
				
			||||||
        goto out;
 | 
					        goto out;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    ret = blk_pwrite(blk, sizeof(le_header), backing_file,
 | 
					    ret = blk_pwrite(blk, sizeof(le_header), backing_file,
 | 
				
			||||||
                     header.backing_filename_size);
 | 
					                     header.backing_filename_size, 0);
 | 
				
			||||||
    if (ret < 0) {
 | 
					    if (ret < 0) {
 | 
				
			||||||
        goto out;
 | 
					        goto out;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    l1_table = g_malloc0(l1_size);
 | 
					    l1_table = g_malloc0(l1_size);
 | 
				
			||||||
    ret = blk_pwrite(blk, header.l1_table_offset, l1_table, l1_size);
 | 
					    ret = blk_pwrite(blk, header.l1_table_offset, l1_table, l1_size, 0);
 | 
				
			||||||
    if (ret < 0) {
 | 
					    if (ret < 0) {
 | 
				
			||||||
        goto out;
 | 
					        goto out;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -1681,7 +1681,7 @@ static int sd_prealloc(const char *filename, Error **errp)
 | 
				
			|||||||
        if (ret < 0) {
 | 
					        if (ret < 0) {
 | 
				
			||||||
            goto out;
 | 
					            goto out;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ret = blk_pwrite(blk, idx * buf_size, buf, buf_size);
 | 
					        ret = blk_pwrite(blk, idx * buf_size, buf, buf_size, 0);
 | 
				
			||||||
        if (ret < 0) {
 | 
					        if (ret < 0) {
 | 
				
			||||||
            goto out;
 | 
					            goto out;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
				
			|||||||
@ -827,7 +827,7 @@ static int vdi_create(const char *filename, QemuOpts *opts, Error **errp)
 | 
				
			|||||||
    vdi_header_print(&header);
 | 
					    vdi_header_print(&header);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
    vdi_header_to_le(&header);
 | 
					    vdi_header_to_le(&header);
 | 
				
			||||||
    ret = blk_pwrite(blk, offset, &header, sizeof(header));
 | 
					    ret = blk_pwrite(blk, offset, &header, sizeof(header), 0);
 | 
				
			||||||
    if (ret < 0) {
 | 
					    if (ret < 0) {
 | 
				
			||||||
        error_setg(errp, "Error writing header to %s", filename);
 | 
					        error_setg(errp, "Error writing header to %s", filename);
 | 
				
			||||||
        goto exit;
 | 
					        goto exit;
 | 
				
			||||||
@ -848,7 +848,7 @@ static int vdi_create(const char *filename, QemuOpts *opts, Error **errp)
 | 
				
			|||||||
                bmap[i] = VDI_UNALLOCATED;
 | 
					                bmap[i] = VDI_UNALLOCATED;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        ret = blk_pwrite(blk, offset, bmap, bmap_size);
 | 
					        ret = blk_pwrite(blk, offset, bmap, bmap_size, 0);
 | 
				
			||||||
        if (ret < 0) {
 | 
					        if (ret < 0) {
 | 
				
			||||||
            error_setg(errp, "Error writing bmap to %s", filename);
 | 
					            error_setg(errp, "Error writing bmap to %s", filename);
 | 
				
			||||||
            goto exit;
 | 
					            goto exit;
 | 
				
			||||||
 | 
				
			|||||||
@ -1856,13 +1856,14 @@ static int vhdx_create(const char *filename, QemuOpts *opts, Error **errp)
 | 
				
			|||||||
    creator = g_utf8_to_utf16("QEMU v" QEMU_VERSION, -1, NULL,
 | 
					    creator = g_utf8_to_utf16("QEMU v" QEMU_VERSION, -1, NULL,
 | 
				
			||||||
                              &creator_items, NULL);
 | 
					                              &creator_items, NULL);
 | 
				
			||||||
    signature = cpu_to_le64(VHDX_FILE_SIGNATURE);
 | 
					    signature = cpu_to_le64(VHDX_FILE_SIGNATURE);
 | 
				
			||||||
    ret = blk_pwrite(blk, VHDX_FILE_ID_OFFSET, &signature, sizeof(signature));
 | 
					    ret = blk_pwrite(blk, VHDX_FILE_ID_OFFSET, &signature, sizeof(signature),
 | 
				
			||||||
 | 
					                     0);
 | 
				
			||||||
    if (ret < 0) {
 | 
					    if (ret < 0) {
 | 
				
			||||||
        goto delete_and_exit;
 | 
					        goto delete_and_exit;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (creator) {
 | 
					    if (creator) {
 | 
				
			||||||
        ret = blk_pwrite(blk, VHDX_FILE_ID_OFFSET + sizeof(signature),
 | 
					        ret = blk_pwrite(blk, VHDX_FILE_ID_OFFSET + sizeof(signature),
 | 
				
			||||||
                         creator, creator_items * sizeof(gunichar2));
 | 
					                         creator, creator_items * sizeof(gunichar2), 0);
 | 
				
			||||||
        if (ret < 0) {
 | 
					        if (ret < 0) {
 | 
				
			||||||
            goto delete_and_exit;
 | 
					            goto delete_and_exit;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										10
									
								
								block/vmdk.c
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								block/vmdk.c
									
									
									
									
									
								
							@ -1808,12 +1808,12 @@ static int vmdk_create_extent(const char *filename, int64_t filesize,
 | 
				
			|||||||
    header.check_bytes[3] = 0xa;
 | 
					    header.check_bytes[3] = 0xa;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* write all the data */
 | 
					    /* write all the data */
 | 
				
			||||||
    ret = blk_pwrite(blk, 0, &magic, sizeof(magic));
 | 
					    ret = blk_pwrite(blk, 0, &magic, sizeof(magic), 0);
 | 
				
			||||||
    if (ret < 0) {
 | 
					    if (ret < 0) {
 | 
				
			||||||
        error_setg(errp, QERR_IO_ERROR);
 | 
					        error_setg(errp, QERR_IO_ERROR);
 | 
				
			||||||
        goto exit;
 | 
					        goto exit;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    ret = blk_pwrite(blk, sizeof(magic), &header, sizeof(header));
 | 
					    ret = blk_pwrite(blk, sizeof(magic), &header, sizeof(header), 0);
 | 
				
			||||||
    if (ret < 0) {
 | 
					    if (ret < 0) {
 | 
				
			||||||
        error_setg(errp, QERR_IO_ERROR);
 | 
					        error_setg(errp, QERR_IO_ERROR);
 | 
				
			||||||
        goto exit;
 | 
					        goto exit;
 | 
				
			||||||
@ -1833,7 +1833,7 @@ static int vmdk_create_extent(const char *filename, int64_t filesize,
 | 
				
			|||||||
        gd_buf[i] = cpu_to_le32(tmp);
 | 
					        gd_buf[i] = cpu_to_le32(tmp);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    ret = blk_pwrite(blk, le64_to_cpu(header.rgd_offset) * BDRV_SECTOR_SIZE,
 | 
					    ret = blk_pwrite(blk, le64_to_cpu(header.rgd_offset) * BDRV_SECTOR_SIZE,
 | 
				
			||||||
                     gd_buf, gd_buf_size);
 | 
					                     gd_buf, gd_buf_size, 0);
 | 
				
			||||||
    if (ret < 0) {
 | 
					    if (ret < 0) {
 | 
				
			||||||
        error_setg(errp, QERR_IO_ERROR);
 | 
					        error_setg(errp, QERR_IO_ERROR);
 | 
				
			||||||
        goto exit;
 | 
					        goto exit;
 | 
				
			||||||
@ -1845,7 +1845,7 @@ static int vmdk_create_extent(const char *filename, int64_t filesize,
 | 
				
			|||||||
        gd_buf[i] = cpu_to_le32(tmp);
 | 
					        gd_buf[i] = cpu_to_le32(tmp);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    ret = blk_pwrite(blk, le64_to_cpu(header.gd_offset) * BDRV_SECTOR_SIZE,
 | 
					    ret = blk_pwrite(blk, le64_to_cpu(header.gd_offset) * BDRV_SECTOR_SIZE,
 | 
				
			||||||
                     gd_buf, gd_buf_size);
 | 
					                     gd_buf, gd_buf_size, 0);
 | 
				
			||||||
    if (ret < 0) {
 | 
					    if (ret < 0) {
 | 
				
			||||||
        error_setg(errp, QERR_IO_ERROR);
 | 
					        error_setg(errp, QERR_IO_ERROR);
 | 
				
			||||||
        goto exit;
 | 
					        goto exit;
 | 
				
			||||||
@ -2120,7 +2120,7 @@ static int vmdk_create(const char *filename, QemuOpts *opts, Error **errp)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    blk_set_allow_write_beyond_eof(new_blk, true);
 | 
					    blk_set_allow_write_beyond_eof(new_blk, true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ret = blk_pwrite(new_blk, desc_offset, desc, desc_len);
 | 
					    ret = blk_pwrite(new_blk, desc_offset, desc, desc_len, 0);
 | 
				
			||||||
    if (ret < 0) {
 | 
					    if (ret < 0) {
 | 
				
			||||||
        error_setg_errno(errp, -ret, "Could not write description");
 | 
					        error_setg_errno(errp, -ret, "Could not write description");
 | 
				
			||||||
        goto exit;
 | 
					        goto exit;
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										10
									
								
								block/vpc.c
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								block/vpc.c
									
									
									
									
									
								
							@ -788,13 +788,13 @@ static int create_dynamic_disk(BlockBackend *blk, uint8_t *buf,
 | 
				
			|||||||
    block_size = 0x200000;
 | 
					    block_size = 0x200000;
 | 
				
			||||||
    num_bat_entries = (total_sectors + block_size / 512) / (block_size / 512);
 | 
					    num_bat_entries = (total_sectors + block_size / 512) / (block_size / 512);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ret = blk_pwrite(blk, offset, buf, HEADER_SIZE);
 | 
					    ret = blk_pwrite(blk, offset, buf, HEADER_SIZE, 0);
 | 
				
			||||||
    if (ret < 0) {
 | 
					    if (ret < 0) {
 | 
				
			||||||
        goto fail;
 | 
					        goto fail;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    offset = 1536 + ((num_bat_entries * 4 + 511) & ~511);
 | 
					    offset = 1536 + ((num_bat_entries * 4 + 511) & ~511);
 | 
				
			||||||
    ret = blk_pwrite(blk, offset, buf, HEADER_SIZE);
 | 
					    ret = blk_pwrite(blk, offset, buf, HEADER_SIZE, 0);
 | 
				
			||||||
    if (ret < 0) {
 | 
					    if (ret < 0) {
 | 
				
			||||||
        goto fail;
 | 
					        goto fail;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -804,7 +804,7 @@ static int create_dynamic_disk(BlockBackend *blk, uint8_t *buf,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    memset(buf, 0xFF, 512);
 | 
					    memset(buf, 0xFF, 512);
 | 
				
			||||||
    for (i = 0; i < (num_bat_entries * 4 + 511) / 512; i++) {
 | 
					    for (i = 0; i < (num_bat_entries * 4 + 511) / 512; i++) {
 | 
				
			||||||
        ret = blk_pwrite(blk, offset, buf, 512);
 | 
					        ret = blk_pwrite(blk, offset, buf, 512, 0);
 | 
				
			||||||
        if (ret < 0) {
 | 
					        if (ret < 0) {
 | 
				
			||||||
            goto fail;
 | 
					            goto fail;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -831,7 +831,7 @@ static int create_dynamic_disk(BlockBackend *blk, uint8_t *buf,
 | 
				
			|||||||
    /* Write the header */
 | 
					    /* Write the header */
 | 
				
			||||||
    offset = 512;
 | 
					    offset = 512;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ret = blk_pwrite(blk, offset, buf, 1024);
 | 
					    ret = blk_pwrite(blk, offset, buf, 1024, 0);
 | 
				
			||||||
    if (ret < 0) {
 | 
					    if (ret < 0) {
 | 
				
			||||||
        goto fail;
 | 
					        goto fail;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -853,7 +853,7 @@ static int create_fixed_disk(BlockBackend *blk, uint8_t *buf,
 | 
				
			|||||||
        return ret;
 | 
					        return ret;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ret = blk_pwrite(blk, total_size - HEADER_SIZE, buf, HEADER_SIZE);
 | 
					    ret = blk_pwrite(blk, total_size - HEADER_SIZE, buf, HEADER_SIZE, 0);
 | 
				
			||||||
    if (ret < 0) {
 | 
					    if (ret < 0) {
 | 
				
			||||||
        return ret;
 | 
					        return ret;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -124,7 +124,7 @@ static void rtas_nvram_store(PowerPCCPU *cpu, sPAPRMachineState *spapr,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    alen = len;
 | 
					    alen = len;
 | 
				
			||||||
    if (nvram->blk) {
 | 
					    if (nvram->blk) {
 | 
				
			||||||
        alen = blk_pwrite(nvram->blk, offset, membuf, len);
 | 
					        alen = blk_pwrite(nvram->blk, offset, membuf, len, 0);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    assert(nvram->buf);
 | 
					    assert(nvram->buf);
 | 
				
			||||||
@ -190,7 +190,7 @@ static int spapr_nvram_post_load(void *opaque, int version_id)
 | 
				
			|||||||
    sPAPRNVRAM *nvram = VIO_SPAPR_NVRAM(opaque);
 | 
					    sPAPRNVRAM *nvram = VIO_SPAPR_NVRAM(opaque);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (nvram->blk) {
 | 
					    if (nvram->blk) {
 | 
				
			||||||
        int alen = blk_pwrite(nvram->blk, 0, nvram->buf, nvram->size);
 | 
					        int alen = blk_pwrite(nvram->blk, 0, nvram->buf, nvram->size, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (alen < 0) {
 | 
					        if (alen < 0) {
 | 
				
			||||||
            return alen;
 | 
					            return alen;
 | 
				
			||||||
 | 
				
			|||||||
@ -102,7 +102,8 @@ BlockAIOCB *blk_aio_write_zeroes(BlockBackend *blk, int64_t sector_num,
 | 
				
			|||||||
                                 int nb_sectors, BdrvRequestFlags flags,
 | 
					                                 int nb_sectors, BdrvRequestFlags flags,
 | 
				
			||||||
                                 BlockCompletionFunc *cb, void *opaque);
 | 
					                                 BlockCompletionFunc *cb, void *opaque);
 | 
				
			||||||
int blk_pread(BlockBackend *blk, int64_t offset, void *buf, int count);
 | 
					int blk_pread(BlockBackend *blk, int64_t offset, void *buf, int count);
 | 
				
			||||||
int blk_pwrite(BlockBackend *blk, int64_t offset, const void *buf, int count);
 | 
					int blk_pwrite(BlockBackend *blk, int64_t offset, const void *buf, int count,
 | 
				
			||||||
 | 
					               BdrvRequestFlags flags);
 | 
				
			||||||
int64_t blk_getlength(BlockBackend *blk);
 | 
					int64_t blk_getlength(BlockBackend *blk);
 | 
				
			||||||
void blk_get_geometry(BlockBackend *blk, uint64_t *nb_sectors_ptr);
 | 
					void blk_get_geometry(BlockBackend *blk, uint64_t *nb_sectors_ptr);
 | 
				
			||||||
int64_t blk_nb_sectors(BlockBackend *blk);
 | 
					int64_t blk_nb_sectors(BlockBackend *blk);
 | 
				
			||||||
 | 
				
			|||||||
@ -1115,7 +1115,7 @@ static void nbd_trip(void *opaque)
 | 
				
			|||||||
        TRACE("Writing to device");
 | 
					        TRACE("Writing to device");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ret = blk_pwrite(exp->blk, request.from + exp->dev_offset,
 | 
					        ret = blk_pwrite(exp->blk, request.from + exp->dev_offset,
 | 
				
			||||||
                        req->data, request.len);
 | 
					                         req->data, request.len, 0);
 | 
				
			||||||
        if (ret < 0) {
 | 
					        if (ret < 0) {
 | 
				
			||||||
            LOG("writing to file failed");
 | 
					            LOG("writing to file failed");
 | 
				
			||||||
            reply.error = -ret;
 | 
					            reply.error = -ret;
 | 
				
			||||||
 | 
				
			|||||||
@ -474,7 +474,7 @@ static int do_pwrite(BlockBackend *blk, char *buf, int64_t offset,
 | 
				
			|||||||
        return -ERANGE;
 | 
					        return -ERANGE;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    *total = blk_pwrite(blk, offset, (uint8_t *)buf, count);
 | 
					    *total = blk_pwrite(blk, offset, (uint8_t *)buf, count, 0);
 | 
				
			||||||
    if (*total < 0) {
 | 
					    if (*total < 0) {
 | 
				
			||||||
        return *total;
 | 
					        return *total;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user