Skip to content

Commit

Permalink
tools: hv: report ENOSPC errors in hv_fcopy_daemon
Browse files Browse the repository at this point in the history
Currently some "Unspecified error 0x80004005" is reported on the Windows
side if something fails. Handle the ENOSPC case and return
ERROR_DISK_FULL, which allows at least Copy-VMFile to report a meaning
full error.

Signed-off-by: Olaf Hering <[email protected]>
Signed-off-by: K. Y. Srinivasan <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
olafhering authored and gregkh committed Dec 15, 2015
1 parent 3cace4a commit b4ed5d1
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 3 deletions.
1 change: 1 addition & 0 deletions include/uapi/linux/hyperv.h
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,7 @@ enum hv_kvp_exchg_pool {
#define HV_INVALIDARG 0x80070057
#define HV_GUID_NOTFOUND 0x80041002
#define HV_ERROR_ALREADY_EXISTS 0x80070050
#define HV_ERROR_DISK_FULL 0x80070070

#define ADDR_FAMILY_NONE 0x00
#define ADDR_FAMILY_IPV4 0x01
Expand Down
20 changes: 17 additions & 3 deletions tools/hv/hv_fcopy_daemon.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,12 +37,14 @@

static int target_fd;
static char target_fname[W_MAX_PATH];
static unsigned long long filesize;

static int hv_start_fcopy(struct hv_start_fcopy *smsg)
{
int error = HV_E_FAIL;
char *q, *p;

filesize = 0;
p = (char *)smsg->path_name;
snprintf(target_fname, sizeof(target_fname), "%s/%s",
(char *)smsg->path_name, (char *)smsg->file_name);
Expand Down Expand Up @@ -98,14 +100,26 @@ static int hv_start_fcopy(struct hv_start_fcopy *smsg)
static int hv_copy_data(struct hv_do_fcopy *cpmsg)
{
ssize_t bytes_written;
int ret = 0;

bytes_written = pwrite(target_fd, cpmsg->data, cpmsg->size,
cpmsg->offset);

if (bytes_written != cpmsg->size)
return HV_E_FAIL;
filesize += cpmsg->size;
if (bytes_written != cpmsg->size) {
switch (errno) {
case ENOSPC:
ret = HV_ERROR_DISK_FULL;
break;
default:
ret = HV_E_FAIL;
break;
}
syslog(LOG_ERR, "pwrite failed to write %llu bytes: %ld (%s)",
filesize, (long)bytes_written, strerror(errno));
}

return 0;
return ret;
}

static int hv_copy_finished(void)
Expand Down

0 comments on commit b4ed5d1

Please sign in to comment.