diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-04-01 19:13:21 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-04-01 19:13:21 -0400 |
commit | 675c354a95d5375153b8bb80a0448cab916c7991 (patch) | |
tree | 88cbc5a5a31dd1c1016271006a8d56cfe0abf7bd /tools | |
parent | c70929147a10fa4538886cb23b934b509c4c0e49 (diff) | |
parent | 1b3fa22e0234d613df967445cd34807e10fa54fa (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/Makefile | 11 | ||||
-rw-r--r-- | tools/hv/Makefile | 13 | ||||
-rw-r--r-- | tools/hv/hv_fcopy_daemon.c | 195 | ||||
-rw-r--r-- | tools/hv/hv_vss_daemon.c | 2 |
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 | |||
40 | cpupower: FORCE | 41 | cpupower: FORCE |
41 | $(call descend,power/$@) | 42 | $(call descend,power/$@) |
42 | 43 | ||
43 | cgroup firewire guest usb virtio vm net: FORCE | 44 | cgroup firewire hv guest usb virtio vm net: FORCE |
44 | $(call descend,$@) | 45 | $(call descend,$@) |
45 | 46 | ||
46 | libapikfs: FORCE | 47 | libapikfs: FORCE |
@@ -64,7 +65,7 @@ acpi_install: | |||
64 | cpupower_install: | 65 | cpupower_install: |
65 | $(call descend,power/$(@:_install=),install) | 66 | $(call descend,power/$(@:_install=),install) |
66 | 67 | ||
67 | cgroup_install firewire_install lguest_install perf_install usb_install virtio_install vm_install net_install: | 68 | cgroup_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 | ||
70 | selftests_install: | 71 | selftests_install: |
@@ -76,7 +77,7 @@ turbostat_install x86_energy_perf_policy_install: | |||
76 | tmon_install: | 77 | tmon_install: |
77 | $(call descend,thermal/$(@:_install=),install) | 78 | $(call descend,thermal/$(@:_install=),install) |
78 | 79 | ||
79 | install: acpi_install cgroup_install cpupower_install firewire_install lguest_install \ | 80 | install: 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: | |||
87 | cpupower_clean: | 88 | cpupower_clean: |
88 | $(call descend,power/cpupower,clean) | 89 | $(call descend,power/cpupower,clean) |
89 | 90 | ||
90 | cgroup_clean firewire_clean lguest_clean usb_clean virtio_clean vm_clean net_clean: | 91 | cgroup_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 | ||
93 | libapikfs_clean: | 94 | libapikfs_clean: |
@@ -105,7 +106,7 @@ turbostat_clean x86_energy_perf_policy_clean: | |||
105 | tmon_clean: | 106 | tmon_clean: |
106 | $(call descend,thermal/tmon,clean) | 107 | $(call descend,thermal/tmon,clean) |
107 | 108 | ||
108 | clean: acpi_clean cgroup_clean cpupower_clean firewire_clean lguest_clean \ | 109 | clean: 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 | |||
3 | CC = $(CROSS_COMPILE)gcc | ||
4 | PTHREAD_LIBS = -lpthread | ||
5 | WARNINGS = -Wall -Wextra | ||
6 | CFLAGS = $(WARNINGS) -g $(PTHREAD_LIBS) | ||
7 | |||
8 | all: hv_kvp_daemon hv_vss_daemon | ||
9 | %: %.c | ||
10 | $(CC) $(CFLAGS) -o $@ $^ | ||
11 | |||
12 | clean: | ||
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 | |||
37 | static int target_fd; | ||
38 | static char target_fname[W_MAX_PATH]; | ||
39 | |||
40 | static 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; | ||
96 | done: | ||
97 | return error; | ||
98 | } | ||
99 | |||
100 | static 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 | |||
113 | static int hv_copy_finished(void) | ||
114 | { | ||
115 | close(target_fd); | ||
116 | return 0; | ||
117 | } | ||
118 | static int hv_copy_cancel(void) | ||
119 | { | ||
120 | close(target_fd); | ||
121 | unlink(target_fname); | ||
122 | return 0; | ||
123 | |||
124 | } | ||
125 | |||
126 | int 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; |