aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-04-01 19:13:21 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2014-04-01 19:13:21 -0400
commit675c354a95d5375153b8bb80a0448cab916c7991 (patch)
tree88cbc5a5a31dd1c1016271006a8d56cfe0abf7bd /tools
parentc70929147a10fa4538886cb23b934b509c4c0e49 (diff)
parent1b3fa22e0234d613df967445cd34807e10fa54fa (diff)
Merge tag 'char-misc-3.15-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc
Pull char/misc driver patches from Greg KH: "Here's the big char/misc driver updates for 3.15-rc1. Lots of various things here, including the new mcb driver subsystem. All of these have been in linux-next for a while" * tag 'char-misc-3.15-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc: (118 commits) extcon: Move OF helper function to extcon core and change function name extcon: of: Remove unnecessary function call by using the name of device_node extcon: gpio: Use SIMPLE_DEV_PM_OPS macro extcon: palmas: Use SIMPLE_DEV_PM_OPS macro mei: don't use deprecated DEFINE_PCI_DEVICE_TABLE macro mei: amthif: fix checkpatch error mei: client.h fix checkpatch errors mei: use cl_dbg where appropriate mei: fix Unnecessary space after function pointer name mei: report consistently copy_from/to_user failures mei: drop pr_fmt macros mei: make me hw headers private to me hw. mei: fix memory leak of pending write cb objects mei: me: do not reset when less than expected data is received drivers: mcb: Fix build error discovered by 0-day bot cs5535-mfgpt: Simplify dependencies spmi: pm: drop bus-level PM suspend/resume routines spmi: pmic_arb: make selectable on ARCH_QCOM Drivers: hv: vmbus: Increase the limit on the number of pfns we can handle pch_phub: Report error writing MAC back to user ...
Diffstat (limited to 'tools')
-rw-r--r--tools/Makefile11
-rw-r--r--tools/hv/Makefile13
-rw-r--r--tools/hv/hv_fcopy_daemon.c195
-rw-r--r--tools/hv/hv_vss_daemon.c2
4 files changed, 216 insertions, 5 deletions
diff --git a/tools/Makefile b/tools/Makefile
index feec3ad5fd09..bcae806b0c39 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -7,6 +7,7 @@ help:
7 @echo ' cgroup - cgroup tools' 7 @echo ' cgroup - cgroup tools'
8 @echo ' cpupower - a tool for all things x86 CPU power' 8 @echo ' cpupower - a tool for all things x86 CPU power'
9 @echo ' firewire - the userspace part of nosy, an IEEE-1394 traffic sniffer' 9 @echo ' firewire - the userspace part of nosy, an IEEE-1394 traffic sniffer'
10 @echo ' hv - tools used when in Hyper-V clients'
10 @echo ' lguest - a minimal 32-bit x86 hypervisor' 11 @echo ' lguest - a minimal 32-bit x86 hypervisor'
11 @echo ' perf - Linux performance measurement and analysis tool' 12 @echo ' perf - Linux performance measurement and analysis tool'
12 @echo ' selftests - various kernel selftests' 13 @echo ' selftests - various kernel selftests'
@@ -40,7 +41,7 @@ acpi: FORCE
40cpupower: FORCE 41cpupower: FORCE
41 $(call descend,power/$@) 42 $(call descend,power/$@)
42 43
43cgroup firewire guest usb virtio vm net: FORCE 44cgroup firewire hv guest usb virtio vm net: FORCE
44 $(call descend,$@) 45 $(call descend,$@)
45 46
46libapikfs: FORCE 47libapikfs: FORCE
@@ -64,7 +65,7 @@ acpi_install:
64cpupower_install: 65cpupower_install:
65 $(call descend,power/$(@:_install=),install) 66 $(call descend,power/$(@:_install=),install)
66 67
67cgroup_install firewire_install lguest_install perf_install usb_install virtio_install vm_install net_install: 68cgroup_install firewire_install hv_install lguest_install perf_install usb_install virtio_install vm_install net_install:
68 $(call descend,$(@:_install=),install) 69 $(call descend,$(@:_install=),install)
69 70
70selftests_install: 71selftests_install:
@@ -76,7 +77,7 @@ turbostat_install x86_energy_perf_policy_install:
76tmon_install: 77tmon_install:
77 $(call descend,thermal/$(@:_install=),install) 78 $(call descend,thermal/$(@:_install=),install)
78 79
79install: acpi_install cgroup_install cpupower_install firewire_install lguest_install \ 80install: acpi_install cgroup_install cpupower_install hv_install firewire_install lguest_install \
80 perf_install selftests_install turbostat_install usb_install \ 81 perf_install selftests_install turbostat_install usb_install \
81 virtio_install vm_install net_install x86_energy_perf_policy_install \ 82 virtio_install vm_install net_install x86_energy_perf_policy_install \
82 tmon 83 tmon
@@ -87,7 +88,7 @@ acpi_clean:
87cpupower_clean: 88cpupower_clean:
88 $(call descend,power/cpupower,clean) 89 $(call descend,power/cpupower,clean)
89 90
90cgroup_clean firewire_clean lguest_clean usb_clean virtio_clean vm_clean net_clean: 91cgroup_clean hv_clean firewire_clean lguest_clean usb_clean virtio_clean vm_clean net_clean:
91 $(call descend,$(@:_clean=),clean) 92 $(call descend,$(@:_clean=),clean)
92 93
93libapikfs_clean: 94libapikfs_clean:
@@ -105,7 +106,7 @@ turbostat_clean x86_energy_perf_policy_clean:
105tmon_clean: 106tmon_clean:
106 $(call descend,thermal/tmon,clean) 107 $(call descend,thermal/tmon,clean)
107 108
108clean: acpi_clean cgroup_clean cpupower_clean firewire_clean lguest_clean \ 109clean: acpi_clean cgroup_clean cpupower_clean hv_clean firewire_clean lguest_clean \
109 perf_clean selftests_clean turbostat_clean usb_clean virtio_clean \ 110 perf_clean selftests_clean turbostat_clean usb_clean virtio_clean \
110 vm_clean net_clean x86_energy_perf_policy_clean tmon_clean 111 vm_clean net_clean x86_energy_perf_policy_clean tmon_clean
111 112
diff --git a/tools/hv/Makefile b/tools/hv/Makefile
new file mode 100644
index 000000000000..bd22f786a60c
--- /dev/null
+++ b/tools/hv/Makefile
@@ -0,0 +1,13 @@
1# Makefile for Hyper-V tools
2
3CC = $(CROSS_COMPILE)gcc
4PTHREAD_LIBS = -lpthread
5WARNINGS = -Wall -Wextra
6CFLAGS = $(WARNINGS) -g $(PTHREAD_LIBS)
7
8all: hv_kvp_daemon hv_vss_daemon
9%: %.c
10 $(CC) $(CFLAGS) -o $@ $^
11
12clean:
13 $(RM) hv_kvp_daemon hv_vss_daemon
diff --git a/tools/hv/hv_fcopy_daemon.c b/tools/hv/hv_fcopy_daemon.c
new file mode 100644
index 000000000000..4ecc4fd0bc1b
--- /dev/null
+++ b/tools/hv/hv_fcopy_daemon.c
@@ -0,0 +1,195 @@
1/*
2 * An implementation of host to guest copy functionality for Linux.
3 *
4 * Copyright (C) 2014, Microsoft, Inc.
5 *
6 * Author : K. Y. Srinivasan <kys@microsoft.com>
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License version 2 as published
10 * by the Free Software Foundation.
11 *
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
15 * NON INFRINGEMENT. See the GNU General Public License for more
16 * details.
17 */
18
19
20#include <sys/types.h>
21#include <sys/socket.h>
22#include <sys/poll.h>
23#include <linux/types.h>
24#include <linux/kdev_t.h>
25#include <stdio.h>
26#include <stdlib.h>
27#include <unistd.h>
28#include <string.h>
29#include <ctype.h>
30#include <errno.h>
31#include <linux/hyperv.h>
32#include <syslog.h>
33#include <sys/stat.h>
34#include <fcntl.h>
35#include <dirent.h>
36
37static int target_fd;
38static char target_fname[W_MAX_PATH];
39
40static int hv_start_fcopy(struct hv_start_fcopy *smsg)
41{
42 int error = HV_E_FAIL;
43 char *q, *p;
44
45 /*
46 * If possile append a path seperator to the path.
47 */
48 if (strlen((char *)smsg->path_name) < (W_MAX_PATH - 2))
49 strcat((char *)smsg->path_name, "/");
50
51 p = (char *)smsg->path_name;
52 snprintf(target_fname, sizeof(target_fname), "%s/%s",
53 (char *)smsg->path_name, smsg->file_name);
54
55 syslog(LOG_INFO, "Target file name: %s", target_fname);
56 /*
57 * Check to see if the path is already in place; if not,
58 * create if required.
59 */
60 while ((q = strchr(p, '/')) != NULL) {
61 if (q == p) {
62 p++;
63 continue;
64 }
65 *q = '\0';
66 if (access((char *)smsg->path_name, F_OK)) {
67 if (smsg->copy_flags & CREATE_PATH) {
68 if (mkdir((char *)smsg->path_name, 0755)) {
69 syslog(LOG_ERR, "Failed to create %s",
70 (char *)smsg->path_name);
71 goto done;
72 }
73 } else {
74 syslog(LOG_ERR, "Invalid path: %s",
75 (char *)smsg->path_name);
76 goto done;
77 }
78 }
79 p = q + 1;
80 *q = '/';
81 }
82
83 if (!access(target_fname, F_OK)) {
84 syslog(LOG_INFO, "File: %s exists", target_fname);
85 if (!smsg->copy_flags & OVER_WRITE)
86 goto done;
87 }
88
89 target_fd = open(target_fname, O_RDWR | O_CREAT | O_CLOEXEC, 0744);
90 if (target_fd == -1) {
91 syslog(LOG_INFO, "Open Failed: %s", strerror(errno));
92 goto done;
93 }
94
95 error = 0;
96done:
97 return error;
98}
99
100static int hv_copy_data(struct hv_do_fcopy *cpmsg)
101{
102 ssize_t bytes_written;
103
104 bytes_written = pwrite(target_fd, cpmsg->data, cpmsg->size,
105 cpmsg->offset);
106
107 if (bytes_written != cpmsg->size)
108 return HV_E_FAIL;
109
110 return 0;
111}
112
113static int hv_copy_finished(void)
114{
115 close(target_fd);
116 return 0;
117}
118static int hv_copy_cancel(void)
119{
120 close(target_fd);
121 unlink(target_fname);
122 return 0;
123
124}
125
126int main(void)
127{
128 int fd, fcopy_fd, len;
129 int error;
130 int version = FCOPY_CURRENT_VERSION;
131 char *buffer[4096 * 2];
132 struct hv_fcopy_hdr *in_msg;
133
134 if (daemon(1, 0)) {
135 syslog(LOG_ERR, "daemon() failed; error: %s", strerror(errno));
136 exit(EXIT_FAILURE);
137 }
138
139 openlog("HV_FCOPY", 0, LOG_USER);
140 syslog(LOG_INFO, "HV_FCOPY starting; pid is:%d", getpid());
141
142 fcopy_fd = open("/dev/vmbus/hv_fcopy", O_RDWR);
143
144 if (fcopy_fd < 0) {
145 syslog(LOG_ERR, "open /dev/vmbus/hv_fcopy failed; error: %d %s",
146 errno, strerror(errno));
147 exit(EXIT_FAILURE);
148 }
149
150 /*
151 * Register with the kernel.
152 */
153 if ((write(fcopy_fd, &version, sizeof(int))) != sizeof(int)) {
154 syslog(LOG_ERR, "Registration failed: %s", strerror(errno));
155 exit(EXIT_FAILURE);
156 }
157
158 while (1) {
159 /*
160 * In this loop we process fcopy messages after the
161 * handshake is complete.
162 */
163 len = pread(fcopy_fd, buffer, (4096 * 2), 0);
164 if (len < 0) {
165 syslog(LOG_ERR, "pread failed: %s", strerror(errno));
166 exit(EXIT_FAILURE);
167 }
168 in_msg = (struct hv_fcopy_hdr *)buffer;
169
170 switch (in_msg->operation) {
171 case START_FILE_COPY:
172 error = hv_start_fcopy((struct hv_start_fcopy *)in_msg);
173 break;
174 case WRITE_TO_FILE:
175 error = hv_copy_data((struct hv_do_fcopy *)in_msg);
176 break;
177 case COMPLETE_FCOPY:
178 error = hv_copy_finished();
179 break;
180 case CANCEL_FCOPY:
181 error = hv_copy_cancel();
182 break;
183
184 default:
185 syslog(LOG_ERR, "Unknown operation: %d",
186 in_msg->operation);
187
188 }
189
190 if (pwrite(fcopy_fd, &error, sizeof(int), 0) != sizeof(int)) {
191 syslog(LOG_ERR, "pwrite failed: %s", strerror(errno));
192 exit(EXIT_FAILURE);
193 }
194 }
195}
diff --git a/tools/hv/hv_vss_daemon.c b/tools/hv/hv_vss_daemon.c
index 520de3304571..6a213b8cd7b9 100644
--- a/tools/hv/hv_vss_daemon.c
+++ b/tools/hv/hv_vss_daemon.c
@@ -87,6 +87,8 @@ static int vss_operate(int operation)
87 continue; 87 continue;
88 if (strcmp(ent->mnt_type, "iso9660") == 0) 88 if (strcmp(ent->mnt_type, "iso9660") == 0)
89 continue; 89 continue;
90 if (strcmp(ent->mnt_type, "vfat") == 0)
91 continue;
90 if (strcmp(ent->mnt_dir, "/") == 0) { 92 if (strcmp(ent->mnt_dir, "/") == 0) {
91 root_seen = 1; 93 root_seen = 1;
92 continue; 94 continue;