diff --git a/SOURCES/hv_fcopy_daemon.c b/SOURCES/hv_fcopy_daemon.c index 8f96b3e..9445d8f 100644 --- a/SOURCES/hv_fcopy_daemon.c +++ b/SOURCES/hv_fcopy_daemon.c @@ -33,6 +33,7 @@ #include #include #include +#include static int target_fd; static char target_fname[W_MAX_PATH]; @@ -42,15 +43,9 @@ static int hv_start_fcopy(struct hv_start_fcopy *smsg) int error = HV_E_FAIL; char *q, *p; - /* - * If possile append a path seperator to the path. - */ - if (strlen((char *)smsg->path_name) < (W_MAX_PATH - 2)) - strcat((char *)smsg->path_name, "/"); - p = (char *)smsg->path_name; snprintf(target_fname, sizeof(target_fname), "%s/%s", - (char *)smsg->path_name, smsg->file_name); + (char *)smsg->path_name, (char *)smsg->file_name); syslog(LOG_INFO, "Target file name: %s", target_fname); /* @@ -126,15 +121,43 @@ static int hv_copy_cancel(void) } -int main(void) +void print_usage(char *argv[]) +{ + fprintf(stderr, "Usage: %s [options]\n" + "Options are:\n" + " -n, --no-daemon stay in foreground, don't daemonize\n" + " -h, --help print this help\n", argv[0]); +} + +int main(int argc, char *argv[]) { - int fd, fcopy_fd, len; + int fcopy_fd, len; int error; + int daemonize = 1, long_index = 0, opt; int version = FCOPY_CURRENT_VERSION; char *buffer[4096 * 2]; struct hv_fcopy_hdr *in_msg; - if (daemon(1, 0)) { + static struct option long_options[] = { + {"help", no_argument, 0, 'h' }, + {"no-daemon", no_argument, 0, 'n' }, + {0, 0, 0, 0 } + }; + + while ((opt = getopt_long(argc, argv, "hn", long_options, + &long_index)) != -1) { + switch (opt) { + case 'n': + daemonize = 0; + break; + case 'h': + default: + print_usage(argv); + exit(EXIT_FAILURE); + } + } + + if (daemonize && daemon(1, 0)) { syslog(LOG_ERR, "daemon() failed; error: %s", strerror(errno)); exit(EXIT_FAILURE); } diff --git a/SOURCES/hv_kvp_daemon.c b/SOURCES/hv_kvp_daemon.c index 4088b81..408bb07 100644 --- a/SOURCES/hv_kvp_daemon.c +++ b/SOURCES/hv_kvp_daemon.c @@ -43,6 +43,7 @@ #include #include #include +#include /* * KVP protocol: The user mode component first registers with the @@ -146,7 +147,6 @@ static void kvp_release_lock(int pool) static void kvp_update_file(int pool) { FILE *filep; - size_t bytes_written; /* * We are going to write our in-memory registry out to @@ -162,8 +162,7 @@ static void kvp_update_file(int pool) exit(EXIT_FAILURE); } - bytes_written = fwrite(kvp_file_info[pool].records, - sizeof(struct kvp_record), + fwrite(kvp_file_info[pool].records, sizeof(struct kvp_record), kvp_file_info[pool].num_records, filep); if (ferror(filep) || fclose(filep)) { @@ -309,7 +308,7 @@ static int kvp_file_init(void) return 0; } -static int kvp_key_delete(int pool, const char *key, int key_size) +static int kvp_key_delete(int pool, const __u8 *key, int key_size) { int i; int j, k; @@ -352,8 +351,8 @@ static int kvp_key_delete(int pool, const char *key, int key_size) return 1; } -static int kvp_key_add_or_modify(int pool, const char *key, int key_size, const char *value, - int value_size) +static int kvp_key_add_or_modify(int pool, const __u8 *key, int key_size, + const __u8 *value, int value_size) { int i; int num_records; @@ -406,7 +405,7 @@ static int kvp_key_add_or_modify(int pool, const char *key, int key_size, const return 0; } -static int kvp_get_value(int pool, const char *key, int key_size, char *value, +static int kvp_get_value(int pool, const __u8 *key, int key_size, __u8 *value, int value_size) { int i; @@ -438,8 +437,8 @@ static int kvp_get_value(int pool, const char *key, int key_size, char *value, return 1; } -static int kvp_pool_enumerate(int pool, int index, char *key, int key_size, - char *value, int value_size) +static int kvp_pool_enumerate(int pool, int index, __u8 *key, int key_size, + __u8 *value, int value_size) { struct kvp_record *record; @@ -660,7 +659,7 @@ static char *kvp_if_name_to_mac(char *if_name) char *p, *x; char buf[256]; char addr_file[256]; - int i; + unsigned int i; char *mac_addr = NULL; snprintf(addr_file, sizeof(addr_file), "%s%s%s", "/sys/class/net/", @@ -699,7 +698,7 @@ static char *kvp_mac_to_if_name(char *mac) char buf[256]; char *kvp_net_dir = "/sys/class/net/"; char dev_id[256]; - int i; + unsigned int i; dir = opendir(kvp_net_dir); if (dir == NULL) @@ -749,7 +748,7 @@ static char *kvp_mac_to_if_name(char *mac) static void kvp_process_ipconfig_file(char *cmd, - char *config_buf, int len, + char *config_buf, unsigned int len, int element_size, int offset) { char buf[256]; @@ -767,7 +766,7 @@ static void kvp_process_ipconfig_file(char *cmd, if (offset == 0) memset(config_buf, 0, len); while ((p = fgets(buf, sizeof(buf), file)) != NULL) { - if ((len - strlen(config_buf)) < (element_size + 1)) + if (len < strlen(config_buf) + element_size + 1) break; x = strchr(p, '\n'); @@ -915,7 +914,7 @@ static int kvp_process_ip_address(void *addrp, static int kvp_get_ip_info(int family, char *if_name, int op, - void *out_buffer, int length) + void *out_buffer, unsigned int length) { struct ifaddrs *ifap; struct ifaddrs *curp; @@ -1018,8 +1017,7 @@ kvp_get_ip_info(int family, char *if_name, int op, weight += hweight32(&w[i]); sprintf(cidr_mask, "/%d", weight); - if ((length - sn_offset) < - (strlen(cidr_mask) + 1)) + if (length < sn_offset + strlen(cidr_mask) + 1) goto gather_ipaddr; if (sn_offset == 0) @@ -1307,16 +1305,17 @@ static int kvp_set_ip_info(char *if_name, struct hv_kvp_ipaddr_value *new_val) if (error) goto setval_error; + /* + * The dhcp_enabled flag is only for IPv4. In the case the host only + * injects an IPv6 address, the flag is true, but we still need to + * proceed to parse and pass the IPv6 information to the + * disto-specific script hv_set_ifconfig. + */ if (new_val->dhcp_enabled) { error = kvp_write_file(file, "BOOTPROTO", "", "dhcp"); if (error) goto setval_error; - /* - * We are done!. - */ - goto setval_done; - } else { error = kvp_write_file(file, "BOOTPROTO", "", "none"); if (error) @@ -1344,7 +1343,6 @@ static int kvp_set_ip_info(char *if_name, struct hv_kvp_ipaddr_value *new_val) if (error) goto setval_error; -setval_done: fclose(file); /* @@ -1417,7 +1415,15 @@ netlink_send(int fd, struct cn_msg *msg) return sendmsg(fd, &message, 0); } -int main(void) +void print_usage(char *argv[]) +{ + fprintf(stderr, "Usage: %s [options]\n" + "Options are:\n" + " -n, --no-daemon stay in foreground, don't daemonize\n" + " -h, --help print this help\n", argv[0]); +} + +int main(int argc, char *argv[]) { int fd, len, nl_group; int error; @@ -1435,9 +1441,30 @@ int main(void) struct hv_kvp_ipaddr_value *kvp_ip_val; char *kvp_recv_buffer; size_t kvp_recv_buffer_len; + int daemonize = 1, long_index = 0, opt; + + static struct option long_options[] = { + {"help", no_argument, 0, 'h' }, + {"no-daemon", no_argument, 0, 'n' }, + {0, 0, 0, 0 } + }; + + while ((opt = getopt_long(argc, argv, "hn", long_options, + &long_index)) != -1) { + switch (opt) { + case 'n': + daemonize = 0; + break; + case 'h': + default: + print_usage(argv); + exit(EXIT_FAILURE); + } + } - if (daemon(1, 0)) + if (daemonize && daemon(1, 0)) return 1; + openlog("KVP", 0, LOG_USER); syslog(LOG_INFO, "KVP starting; pid is:%d", getpid()); @@ -1529,8 +1556,15 @@ int main(void) addr_p, &addr_l); if (len < 0) { + int saved_errno = errno; syslog(LOG_ERR, "recvfrom failed; pid:%u error:%d %s", addr.nl_pid, errno, strerror(errno)); + + if (saved_errno == ENOBUFS) { + syslog(LOG_ERR, "receive error: ignored"); + continue; + } + close(fd); return -1; } @@ -1733,8 +1767,15 @@ kvp_done: len = netlink_send(fd, incoming_cn_msg); if (len < 0) { + int saved_errno = errno; syslog(LOG_ERR, "net_link send failed; error: %d %s", errno, strerror(errno)); + + if (saved_errno == ENOMEM || saved_errno == ENOBUFS) { + syslog(LOG_ERR, "send error: ignored"); + continue; + } + exit(EXIT_FAILURE); } } diff --git a/SOURCES/hv_vss_daemon.c b/SOURCES/hv_vss_daemon.c index 6a213b8..506dd01 100644 --- a/SOURCES/hv_vss_daemon.c +++ b/SOURCES/hv_vss_daemon.c @@ -36,6 +36,7 @@ #include #include #include +#include static struct sockaddr_nl addr; @@ -44,35 +45,52 @@ static struct sockaddr_nl addr; #endif -static int vss_do_freeze(char *dir, unsigned int cmd, char *fs_op) +/* Don't use syslog() in the function since that can cause write to disk */ +static int vss_do_freeze(char *dir, unsigned int cmd) { int ret, fd = open(dir, O_RDONLY); if (fd < 0) return 1; + ret = ioctl(fd, cmd, 0); - syslog(LOG_INFO, "VSS: %s of %s: %s\n", fs_op, dir, strerror(errno)); + + /* + * If a partition is mounted more than once, only the first + * FREEZE/THAW can succeed and the later ones will get + * EBUSY/EINVAL respectively: there could be 2 cases: + * 1) a user may mount the same partition to differnt directories + * by mistake or on purpose; + * 2) The subvolume of btrfs appears to have the same partition + * mounted more than once. + */ + if (ret) { + if ((cmd == FIFREEZE && errno == EBUSY) || + (cmd == FITHAW && errno == EINVAL)) { + close(fd); + return 0; + } + } + close(fd); return !!ret; } static int vss_operate(int operation) { - char *fs_op; char match[] = "/dev/"; FILE *mounts; struct mntent *ent; + char errdir[1024] = {0}; unsigned int cmd; - int error = 0, root_seen = 0; + int error = 0, root_seen = 0, save_errno = 0; switch (operation) { case VSS_OP_FREEZE: cmd = FIFREEZE; - fs_op = "freeze"; break; case VSS_OP_THAW: cmd = FITHAW; - fs_op = "thaw"; break; default: return -1; @@ -85,7 +103,7 @@ static int vss_operate(int operation) while ((ent = getmntent(mounts))) { if (strncmp(ent->mnt_fsname, match, strlen(match))) continue; - if (strcmp(ent->mnt_type, "iso9660") == 0) + if (hasmntopt(ent, MNTOPT_RO) != NULL) continue; if (strcmp(ent->mnt_type, "vfat") == 0) continue; @@ -93,14 +111,35 @@ static int vss_operate(int operation) root_seen = 1; continue; } - error |= vss_do_freeze(ent->mnt_dir, cmd, fs_op); + error |= vss_do_freeze(ent->mnt_dir, cmd); + if (error && operation == VSS_OP_FREEZE) + goto err; } + endmntent(mounts); if (root_seen) { - error |= vss_do_freeze("/", cmd, fs_op); + error |= vss_do_freeze("/", cmd); + if (error && operation == VSS_OP_FREEZE) + goto err; } + goto out; +err: + save_errno = errno; + if (ent) { + strncpy(errdir, ent->mnt_dir, sizeof(errdir)-1); + endmntent(mounts); + } + vss_operate(VSS_OP_THAW); + /* Call syslog after we thaw all filesystems */ + if (ent) + syslog(LOG_ERR, "FREEZE of %s failed; error:%d %s", + errdir, save_errno, strerror(save_errno)); + else + syslog(LOG_ERR, "FREEZE of / failed; error:%d %s", save_errno, + strerror(save_errno)); +out: return error; } @@ -131,7 +170,15 @@ static int netlink_send(int fd, struct cn_msg *msg) return sendmsg(fd, &message, 0); } -int main(void) +void print_usage(char *argv[]) +{ + fprintf(stderr, "Usage: %s [options]\n" + "Options are:\n" + " -n, --no-daemon stay in foreground, don't daemonize\n" + " -h, --help print this help\n", argv[0]); +} + +int main(int argc, char *argv[]) { int fd, len, nl_group; int error; @@ -143,8 +190,28 @@ int main(void) struct hv_vss_msg *vss_msg; char *vss_recv_buffer; size_t vss_recv_buffer_len; + int daemonize = 1, long_index = 0, opt; + + static struct option long_options[] = { + {"help", no_argument, 0, 'h' }, + {"no-daemon", no_argument, 0, 'n' }, + {0, 0, 0, 0 } + }; + + while ((opt = getopt_long(argc, argv, "hn", long_options, + &long_index)) != -1) { + switch (opt) { + case 'n': + daemonize = 0; + break; + case 'h': + default: + print_usage(argv); + exit(EXIT_FAILURE); + } + } - if (daemon(1, 0)) + if (daemonize && daemon(1, 0)) return 1; openlog("Hyper-V VSS", 0, LOG_USER); @@ -249,8 +316,16 @@ int main(void) case VSS_OP_FREEZE: case VSS_OP_THAW: error = vss_operate(op); - if (error) + syslog(LOG_INFO, "VSS: op=%s: %s\n", + op == VSS_OP_FREEZE ? "FREEZE" : "THAW", + error ? "failed" : "succeeded"); + + if (error) { error = HV_E_FAIL; + syslog(LOG_ERR, "op=%d failed!", op); + syslog(LOG_ERR, "report it with these files:"); + syslog(LOG_ERR, "/etc/fstab and /proc/mounts"); + } break; default: syslog(LOG_ERR, "Illegal op:%d\n", op); diff --git a/SOURCES/hypervfcopyd-0-dont_call_daemon.patch b/SOURCES/hypervfcopyd-0-dont_call_daemon.patch deleted file mode 100644 index 190b42d..0000000 --- a/SOURCES/hypervfcopyd-0-dont_call_daemon.patch +++ /dev/null @@ -1,15 +0,0 @@ -diff -up ./hv_fcopy_daemon.c.daemon_fcopy ./hv_fcopy_daemon.c ---- ./hv_fcopy_daemon.c.daemon_fcopy 2014-02-19 09:55:20.689982023 +0100 -+++ ./hv_fcopy_daemon.c 2014-02-19 09:55:36.700982923 +0100 -@@ -131,11 +131,6 @@ int main(void) - char *buffer[4096 * 2]; - struct hv_fcopy_hdr *in_msg; - -- if (daemon(1, 0)) { -- syslog(LOG_ERR, "daemon() failed; error: %s", strerror(errno)); -- exit(EXIT_FAILURE); -- } -- - openlog("HV_FCOPY", 0, LOG_USER); - syslog(LOG_INFO, "HV_FCOPY starting; pid is:%d", getpid()); - diff --git a/SOURCES/hypervfcopyd.service b/SOURCES/hypervfcopyd.service index f58698e..f0c0b2a 100644 --- a/SOURCES/hypervfcopyd.service +++ b/SOURCES/hypervfcopyd.service @@ -4,7 +4,7 @@ ConditionVirtualization=microsoft ConditionPathExists=/dev/vmbus/hv_fcopy [Service] -ExecStart=/usr/sbin/hypervfcopyd +ExecStart=/usr/sbin/hypervfcopyd -n [Install] WantedBy=multi-user.target diff --git a/SOURCES/hypervkvpd-0-dont_call_deamon.patch b/SOURCES/hypervkvpd-0-dont_call_deamon.patch deleted file mode 100644 index 02822ba..0000000 --- a/SOURCES/hypervkvpd-0-dont_call_deamon.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up hypervkvpd-0/hv_kvp_daemon.c.daemon hypervkvpd-0/hv_kvp_daemon.c ---- hypervkvpd-0/hv_kvp_daemon.c.daemon 2013-08-09 10:51:41.020041192 +0200 -+++ hypervkvpd-0/hv_kvp_daemon.c 2013-08-09 10:53:23.217056215 +0200 -@@ -1434,8 +1434,6 @@ int main(void) - char *kvp_recv_buffer; - size_t kvp_recv_buffer_len; - -- if (daemon(1, 0)) -- return 1; - openlog("KVP", 0, LOG_USER); - syslog(LOG_INFO, "KVP starting; pid is:%d", getpid()); - diff --git a/SOURCES/hypervkvpd-0-long_file_names_from_readdir.patch b/SOURCES/hypervkvpd-0-long_file_names_from_readdir.patch index ee14a34..8808d81 100644 --- a/SOURCES/hypervkvpd-0-long_file_names_from_readdir.patch +++ b/SOURCES/hypervkvpd-0-long_file_names_from_readdir.patch @@ -1,29 +1,18 @@ -From 396ee697e4d5c7d10bacf6d4670fb4ddab357330 Mon Sep 17 00:00:00 2001 -From: Tomas Hozza -Date: Mon, 5 Nov 2012 13:56:02 +0100 -Subject: [PATCH] Tools: hv: Fix for long file names from readdir - -kvp_get_if_name and kvp_mac_to_if_name copy strings into statically -sized buffers which could be too small to store really long names. - -Buffer sizes have been increased and length checks added via snprintf. ---- - hv_kvp_daemon.c | 26 +++++++++----------------- - 1 file changed, 9 insertions(+), 17 deletions(-) - diff --git a/hv_kvp_daemon.c b/hv_kvp_daemon.c -index 3ea3af2..4c2ab6a 100755 +old mode 100644 +new mode 100755 +index 408bb07..c106498 --- a/hv_kvp_daemon.c +++ b/hv_kvp_daemon.c @@ -44,6 +44,7 @@ - #include #include #include + #include +#include /* * KVP protocol: The user mode component first registers with the -@@ -588,26 +589,22 @@ static char *kvp_get_if_name(char *guid) +@@ -601,26 +602,22 @@ static char *kvp_get_if_name(char *guid) DIR *dir; struct dirent *entry; FILE *file; @@ -54,39 +43,3 @@ index 3ea3af2..4c2ab6a 100755 file = fopen(dev_id, "r"); if (file == NULL) -@@ -680,28 +677,23 @@ static char *kvp_mac_to_if_name(char *mac) - DIR *dir; - struct dirent *entry; - FILE *file; -- char *p, *q, *x; -+ char *p, *x; - char *if_name = NULL; - char buf[256]; - char *kvp_net_dir = "/sys/class/net/"; -- char dev_id[256]; -+ char dev_id[PATH_MAX]; - int i; - - dir = opendir(kvp_net_dir); - if (dir == NULL) - return NULL; - -- snprintf(dev_id, sizeof(dev_id), kvp_net_dir); -- q = dev_id + strlen(kvp_net_dir); -- - while ((entry = readdir(dir)) != NULL) { - /* - * Set the state for the next pass. - */ -- *q = '\0'; -- -- strcat(dev_id, entry->d_name); -- strcat(dev_id, "/address"); -+ snprintf(dev_id, sizeof(dev_id), "%s%s/address", kvp_net_dir, -+ entry->d_name); - - file = fopen(dev_id, "r"); - if (file == NULL) --- -1.7.11.7 - diff --git a/SOURCES/hypervkvpd.service b/SOURCES/hypervkvpd.service index 1319aa3..d84d18f 100644 --- a/SOURCES/hypervkvpd.service +++ b/SOURCES/hypervkvpd.service @@ -4,7 +4,7 @@ ConditionVirtualization=microsoft [Service] Type=simple -ExecStart=/usr/sbin/hypervkvpd +ExecStart=/usr/sbin/hypervkvpd -n [Install] WantedBy=multi-user.target diff --git a/SOURCES/hypervvssd-0-dont_call_daemon.patch b/SOURCES/hypervvssd-0-dont_call_daemon.patch deleted file mode 100644 index e8f7c69..0000000 --- a/SOURCES/hypervvssd-0-dont_call_daemon.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff -up ./hv_vss_daemon.c.daemon ./hv_vss_daemon.c ---- ./hv_vss_daemon.c.daemon 2013-06-26 10:26:42.272419971 +0200 -+++ ./hv_vss_daemon.c 2013-06-26 10:27:12.894443174 +0200 -@@ -148,9 +148,6 @@ int main(void) - char *vss_recv_buffer; - size_t vss_recv_buffer_len; - -- if (daemon(1, 0)) -- return 1; -- - openlog("Hyper-V VSS", 0, LOG_USER); - syslog(LOG_INFO, "VSS starting; pid is:%d", getpid()); - diff --git a/SOURCES/hypervvssd.service b/SOURCES/hypervvssd.service index 851b65d..a834bf4 100644 --- a/SOURCES/hypervvssd.service +++ b/SOURCES/hypervvssd.service @@ -3,7 +3,7 @@ Description=Hyper-V VSS daemon ConditionVirtualization=microsoft [Service] -ExecStart=/usr/sbin/hypervvssd +ExecStart=/usr/sbin/hypervvssd -n [Install] WantedBy=multi-user.target diff --git a/SPECS/hyperv-daemons.spec b/SPECS/hyperv-daemons.spec index 1a14573..0923e66 100644 --- a/SPECS/hyperv-daemons.spec +++ b/SPECS/hyperv-daemons.spec @@ -5,43 +5,43 @@ # HyperV FCOPY daemon binary name %global hv_fcopy_daemon hypervfcopyd # snapshot version -%global snapver .20141008git +%global snapver .20150402git # use hardened build %global _hardened_build 1 Name: hyperv-daemons Version: 0 -Release: 0.25%{?snapver}%{?dist} +Release: 0.26%{?snapver}%{?dist} Summary: HyperV daemons suite Group: System Environment/Daemons License: GPLv2 URL: http://www.kernel.org -# Source files obtained from kernel upstream 2014-10-08. +# Source files obtained from kernel upstream 2015-04-02. # git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git # The daemon and scripts are located in "master branch - /tools/hv" -# COPYING -> https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/plain/COPYING?id=refs/tags/next-2014-10-08 +# COPYING -> https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/plain/COPYING?id=next-20150402 Source0: COPYING # HYPERV KVP DAEMON -# hv_kvp_daemon.c -> https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/plain/tools/hv/hv_kvp_daemon.c?id=refs/tags/next-2014-10-08 +# hv_kvp_daemon.c -> https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/tree/tools/hv/hv_kvp_daemon.c?id=next-20150402 Source1: hv_kvp_daemon.c -# hv_get_dhcp_info.sh -> https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/plain/tools/hv/hv_get_dhcp_info.sh?id=refs/tags/next-2014-10-08 +# hv_get_dhcp_info.sh -> https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/plain/tools/hv/hv_get_dhcp_info.sh?id=next-20150402 Source2: hv_get_dhcp_info.sh -# hv_get_dns_info.sh -> https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/plain/tools/hv/hv_get_dns_info.sh?id=refs/tags/next-2014-10-08 +# hv_get_dns_info.sh -> https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/plain/tools/hv/hv_get_dns_info.sh?id=next-20150402 Source3: hv_get_dns_info.sh -# hv_set_ifconfig.sh -> https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/plain/tools/hv/hv_set_ifconfig.sh?id=refs/tags/next-2014-10-08 +# hv_set_ifconfig.sh -> https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/plain/tools/hv/hv_set_ifconfig.sh?id=next-20150402 Source4: hv_set_ifconfig.sh Source5: hypervkvpd.service # HYPERV VSS DAEMON -# hv_vss_daemon.c -> https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/plain/tools/hv/hv_vss_daemon.c?id=refs/tags/next-2014-10-08 +# hv_vss_daemon.c -> https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/plain/tools/hv/hv_vss_daemon.c?id=next-20150402 Source100: hv_vss_daemon.c Source101: hypervvssd.service # HYPERV FCOPY DAEMON -# hv_fcopy_daemon.c -> https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/plain/tools/hv/hv_fcopy_daemon.c?id=refs/tags/next-2014-10-08 +# hv_fcopy_daemon.c -> https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/plain/tools/hv/hv_fcopy_daemon.c?id=next-20150402 Source200: hv_fcopy_daemon.c Source201: hypervfcopyd.service @@ -51,17 +51,6 @@ Source201: hypervfcopyd.service Patch0: hypervkvpd-0-corrected_paths_to_external_scripts.patch # rhbz#872566 Patch1: hypervkvpd-0-long_file_names_from_readdir.patch -# Remove daemon() call and let systemd handle it -Patch2: hypervkvpd-0-dont_call_deamon.patch - -# HYPERV VSS DAEMON -# Remove daemon() call and let systemd handle it -Patch100: hypervvssd-0-dont_call_daemon.patch - -# HYPERV FCOPY DAEMON -# Remove daemon() call and let systemd handle it -Patch200: hypervfcopyd-0-dont_call_daemon.patch - BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) # HyperV is available only on x86 architectures @@ -154,11 +143,6 @@ cp -pvL %{SOURCE201} hypervfcopyd.service %patch0 -p1 -b .external_scripts %patch1 -p1 -b .long_names -%patch2 -p1 -b .daemon - -%patch100 -p1 -b .daemon - -%patch200 -p1 -b .daemon_fcopy %build # HYPERV KVP DAEMON @@ -270,6 +254,11 @@ fi %doc COPYING %changelog +* Fri May 15 2015 Vitaly Kuznetsov - 0-0.26.20150402git +- 2015-04-02 git snapshot +- VSS: skip all readonly-mounted filesystems (#1160584) +- VSS: support partitions mounted several times (#1169724) + * Thu Oct 9 2014 Matej Muzila - 0-0.25.20141008git - Daemons updated to the last git snapshot - Use kernel-headers instead of kernel-devel to build