mirror of https://gitee.com/openkylin/qemu.git
target/ppc: Fix kvmppc_load_htab_chunk() error reporting
If kvmppc_load_htab_chunk() fails, its return value is propagated up to vmstate_load(). It should thus be a negative errno, not -1 (which maps to EPERM and would lure the user into thinking that the problem is necessarily related to a lack of privilege). Return the error reported by KVM or ENOSPC in case of short write. While here, propagate the error message through an @errp argument and have the caller to print it with error_report_err() instead of relying on fprintf(). Signed-off-by: Greg Kurz <groug@kaod.org> Message-Id: <160371604713.305923.5264900354159029580.stgit@bahia.lan> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
c3e051ed6d
commit
0a06e4d626
|
@ -2347,8 +2347,10 @@ static int htab_load(QEMUFile *f, void *opaque, int version_id)
|
|||
|
||||
assert(fd >= 0);
|
||||
|
||||
rc = kvmppc_load_htab_chunk(f, fd, index, n_valid, n_invalid);
|
||||
rc = kvmppc_load_htab_chunk(f, fd, index, n_valid, n_invalid,
|
||||
&local_err);
|
||||
if (rc < 0) {
|
||||
error_report_err(local_err);
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2683,7 +2683,7 @@ int kvmppc_save_htab(QEMUFile *f, int fd, size_t bufsize, int64_t max_ns)
|
|||
}
|
||||
|
||||
int kvmppc_load_htab_chunk(QEMUFile *f, int fd, uint32_t index,
|
||||
uint16_t n_valid, uint16_t n_invalid)
|
||||
uint16_t n_valid, uint16_t n_invalid, Error **errp)
|
||||
{
|
||||
struct kvm_get_htab_header *buf;
|
||||
size_t chunksize = sizeof(*buf) + n_valid * HASH_PTE_SIZE_64;
|
||||
|
@ -2698,14 +2698,13 @@ int kvmppc_load_htab_chunk(QEMUFile *f, int fd, uint32_t index,
|
|||
|
||||
rc = write(fd, buf, chunksize);
|
||||
if (rc < 0) {
|
||||
fprintf(stderr, "Error writing KVM hash table: %s\n",
|
||||
strerror(errno));
|
||||
return rc;
|
||||
error_setg_errno(errp, errno, "Error writing the KVM hash table");
|
||||
return -errno;
|
||||
}
|
||||
if (rc != chunksize) {
|
||||
/* We should never get a short write on a single chunk */
|
||||
fprintf(stderr, "Short write, restoring KVM hash table\n");
|
||||
return -1;
|
||||
error_setg(errp, "Short write while restoring the KVM hash table");
|
||||
return -ENOSPC;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -56,7 +56,7 @@ int kvmppc_define_rtas_kernel_token(uint32_t token, const char *function);
|
|||
int kvmppc_get_htab_fd(bool write, uint64_t index, Error **errp);
|
||||
int kvmppc_save_htab(QEMUFile *f, int fd, size_t bufsize, int64_t max_ns);
|
||||
int kvmppc_load_htab_chunk(QEMUFile *f, int fd, uint32_t index,
|
||||
uint16_t n_valid, uint16_t n_invalid);
|
||||
uint16_t n_valid, uint16_t n_invalid, Error **errp);
|
||||
void kvmppc_read_hptes(ppc_hash_pte64_t *hptes, hwaddr ptex, int n);
|
||||
void kvmppc_write_hpte(hwaddr ptex, uint64_t pte0, uint64_t pte1);
|
||||
bool kvmppc_has_cap_fixup_hcalls(void);
|
||||
|
@ -316,7 +316,8 @@ static inline int kvmppc_save_htab(QEMUFile *f, int fd, size_t bufsize,
|
|||
}
|
||||
|
||||
static inline int kvmppc_load_htab_chunk(QEMUFile *f, int fd, uint32_t index,
|
||||
uint16_t n_valid, uint16_t n_invalid)
|
||||
uint16_t n_valid, uint16_t n_invalid,
|
||||
Error **errp)
|
||||
{
|
||||
abort();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue