diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2019-01-25 18:03:34 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-01-25 18:03:34 -0500 |
commit | d488bd21a4b2bf6b3f236f22ed213c61e74c878b (patch) | |
tree | d9abc8f6b3690e983588c11b51b2b70c94f0a580 /drivers | |
parent | 96f18cb89ffa4bc6dafa447c9493449809fbb318 (diff) | |
parent | 52768f324241b2d9624d32787cff63ec3e0e420a (diff) |
Merge tag 'char-misc-5.0-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc
Pull char/misc driver fixes from Greg KH:
"Here are some small char and misc driver fixes to resolve some
reported issues, as well as a number of binderfs fixups that were
found after auditing the filesystem code by Al Viro. As binderfs
hasn't been in a previous release yet, it's good to get these in now
before the first users show up.
All of these have been in linux-next for a bit with no reported
issues"
* tag 'char-misc-5.0-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc: (26 commits)
i3c: master: Fix an error checking typo in 'cdns_i3c_master_probe()'
binderfs: switch from d_add() to d_instantiate()
binderfs: drop lock in binderfs_binder_ctl_create
binderfs: kill_litter_super() before cleanup
binderfs: rework binderfs_binder_device_create()
binderfs: rework binderfs_fill_super()
binderfs: prevent renaming the control dentry
binderfs: remove outdated comment
binderfs: use __u32 for device numbers
binderfs: use correct include guards in header
misc: pvpanic: fix warning implicit declaration
char/mwave: fix potential Spectre v1 vulnerability
misc: ibmvsm: Fix potential NULL pointer dereference
binderfs: fix error return code in binderfs_fill_super()
mei: me: add denverton innovation engine device IDs
mei: me: mark LBG devices as having dma support
mei: dma: silent the reject message
binderfs: handle !CONFIG_IPC_NS builds
binderfs: reserve devices for initial mount
binderfs: rename header to binderfs.h
...
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/android/binderfs.c | 282 | ||||
-rw-r--r-- | drivers/char/mwave/mwavedd.c | 7 | ||||
-rw-r--r-- | drivers/hv/channel.c | 9 | ||||
-rw-r--r-- | drivers/hv/hv_balloon.c | 10 | ||||
-rw-r--r-- | drivers/hv/ring_buffer.c | 31 | ||||
-rw-r--r-- | drivers/hv/vmbus_drv.c | 91 | ||||
-rw-r--r-- | drivers/misc/ibmvmc.c | 7 | ||||
-rw-r--r-- | drivers/misc/mei/hbm.c | 12 | ||||
-rw-r--r-- | drivers/misc/mei/hw-me-regs.h | 2 | ||||
-rw-r--r-- | drivers/misc/mei/pci-me.c | 4 | ||||
-rw-r--r-- | drivers/misc/pvpanic.c | 4 |
11 files changed, 264 insertions, 195 deletions
diff --git a/drivers/android/binderfs.c b/drivers/android/binderfs.c index 7496b10532aa..6a2185eb66c5 100644 --- a/drivers/android/binderfs.c +++ b/drivers/android/binderfs.c | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <linux/kdev_t.h> | 11 | #include <linux/kdev_t.h> |
12 | #include <linux/kernel.h> | 12 | #include <linux/kernel.h> |
13 | #include <linux/list.h> | 13 | #include <linux/list.h> |
14 | #include <linux/namei.h> | ||
14 | #include <linux/magic.h> | 15 | #include <linux/magic.h> |
15 | #include <linux/major.h> | 16 | #include <linux/major.h> |
16 | #include <linux/miscdevice.h> | 17 | #include <linux/miscdevice.h> |
@@ -20,6 +21,7 @@ | |||
20 | #include <linux/parser.h> | 21 | #include <linux/parser.h> |
21 | #include <linux/radix-tree.h> | 22 | #include <linux/radix-tree.h> |
22 | #include <linux/sched.h> | 23 | #include <linux/sched.h> |
24 | #include <linux/seq_file.h> | ||
23 | #include <linux/slab.h> | 25 | #include <linux/slab.h> |
24 | #include <linux/spinlock_types.h> | 26 | #include <linux/spinlock_types.h> |
25 | #include <linux/stddef.h> | 27 | #include <linux/stddef.h> |
@@ -30,7 +32,7 @@ | |||
30 | #include <linux/xarray.h> | 32 | #include <linux/xarray.h> |
31 | #include <uapi/asm-generic/errno-base.h> | 33 | #include <uapi/asm-generic/errno-base.h> |
32 | #include <uapi/linux/android/binder.h> | 34 | #include <uapi/linux/android/binder.h> |
33 | #include <uapi/linux/android/binder_ctl.h> | 35 | #include <uapi/linux/android/binderfs.h> |
34 | 36 | ||
35 | #include "binder_internal.h" | 37 | #include "binder_internal.h" |
36 | 38 | ||
@@ -39,14 +41,32 @@ | |||
39 | #define INODE_OFFSET 3 | 41 | #define INODE_OFFSET 3 |
40 | #define INTSTRLEN 21 | 42 | #define INTSTRLEN 21 |
41 | #define BINDERFS_MAX_MINOR (1U << MINORBITS) | 43 | #define BINDERFS_MAX_MINOR (1U << MINORBITS) |
42 | 44 | /* Ensure that the initial ipc namespace always has devices available. */ | |
43 | static struct vfsmount *binderfs_mnt; | 45 | #define BINDERFS_MAX_MINOR_CAPPED (BINDERFS_MAX_MINOR - 4) |
44 | 46 | ||
45 | static dev_t binderfs_dev; | 47 | static dev_t binderfs_dev; |
46 | static DEFINE_MUTEX(binderfs_minors_mutex); | 48 | static DEFINE_MUTEX(binderfs_minors_mutex); |
47 | static DEFINE_IDA(binderfs_minors); | 49 | static DEFINE_IDA(binderfs_minors); |
48 | 50 | ||
49 | /** | 51 | /** |
52 | * binderfs_mount_opts - mount options for binderfs | ||
53 | * @max: maximum number of allocatable binderfs binder devices | ||
54 | */ | ||
55 | struct binderfs_mount_opts { | ||
56 | int max; | ||
57 | }; | ||
58 | |||
59 | enum { | ||
60 | Opt_max, | ||
61 | Opt_err | ||
62 | }; | ||
63 | |||
64 | static const match_table_t tokens = { | ||
65 | { Opt_max, "max=%d" }, | ||
66 | { Opt_err, NULL } | ||
67 | }; | ||
68 | |||
69 | /** | ||
50 | * binderfs_info - information about a binderfs mount | 70 | * binderfs_info - information about a binderfs mount |
51 | * @ipc_ns: The ipc namespace the binderfs mount belongs to. | 71 | * @ipc_ns: The ipc namespace the binderfs mount belongs to. |
52 | * @control_dentry: This records the dentry of this binderfs mount | 72 | * @control_dentry: This records the dentry of this binderfs mount |
@@ -55,13 +75,16 @@ static DEFINE_IDA(binderfs_minors); | |||
55 | * created. | 75 | * created. |
56 | * @root_gid: gid that needs to be used when a new binder device is | 76 | * @root_gid: gid that needs to be used when a new binder device is |
57 | * created. | 77 | * created. |
78 | * @mount_opts: The mount options in use. | ||
79 | * @device_count: The current number of allocated binder devices. | ||
58 | */ | 80 | */ |
59 | struct binderfs_info { | 81 | struct binderfs_info { |
60 | struct ipc_namespace *ipc_ns; | 82 | struct ipc_namespace *ipc_ns; |
61 | struct dentry *control_dentry; | 83 | struct dentry *control_dentry; |
62 | kuid_t root_uid; | 84 | kuid_t root_uid; |
63 | kgid_t root_gid; | 85 | kgid_t root_gid; |
64 | 86 | struct binderfs_mount_opts mount_opts; | |
87 | int device_count; | ||
65 | }; | 88 | }; |
66 | 89 | ||
67 | static inline struct binderfs_info *BINDERFS_I(const struct inode *inode) | 90 | static inline struct binderfs_info *BINDERFS_I(const struct inode *inode) |
@@ -84,7 +107,7 @@ bool is_binderfs_device(const struct inode *inode) | |||
84 | * @userp: buffer to copy information about new device for userspace to | 107 | * @userp: buffer to copy information about new device for userspace to |
85 | * @req: struct binderfs_device as copied from userspace | 108 | * @req: struct binderfs_device as copied from userspace |
86 | * | 109 | * |
87 | * This function allocated a new binder_device and reserves a new minor | 110 | * This function allocates a new binder_device and reserves a new minor |
88 | * number for it. | 111 | * number for it. |
89 | * Minor numbers are limited and tracked globally in binderfs_minors. The | 112 | * Minor numbers are limited and tracked globally in binderfs_minors. The |
90 | * function will stash a struct binder_device for the specific binder | 113 | * function will stash a struct binder_device for the specific binder |
@@ -100,20 +123,34 @@ static int binderfs_binder_device_create(struct inode *ref_inode, | |||
100 | struct binderfs_device *req) | 123 | struct binderfs_device *req) |
101 | { | 124 | { |
102 | int minor, ret; | 125 | int minor, ret; |
103 | struct dentry *dentry, *dup, *root; | 126 | struct dentry *dentry, *root; |
104 | struct binder_device *device; | 127 | struct binder_device *device; |
105 | size_t name_len = BINDERFS_MAX_NAME + 1; | ||
106 | char *name = NULL; | 128 | char *name = NULL; |
129 | size_t name_len; | ||
107 | struct inode *inode = NULL; | 130 | struct inode *inode = NULL; |
108 | struct super_block *sb = ref_inode->i_sb; | 131 | struct super_block *sb = ref_inode->i_sb; |
109 | struct binderfs_info *info = sb->s_fs_info; | 132 | struct binderfs_info *info = sb->s_fs_info; |
133 | #if defined(CONFIG_IPC_NS) | ||
134 | bool use_reserve = (info->ipc_ns == &init_ipc_ns); | ||
135 | #else | ||
136 | bool use_reserve = true; | ||
137 | #endif | ||
110 | 138 | ||
111 | /* Reserve new minor number for the new device. */ | 139 | /* Reserve new minor number for the new device. */ |
112 | mutex_lock(&binderfs_minors_mutex); | 140 | mutex_lock(&binderfs_minors_mutex); |
113 | minor = ida_alloc_max(&binderfs_minors, BINDERFS_MAX_MINOR, GFP_KERNEL); | 141 | if (++info->device_count <= info->mount_opts.max) |
114 | mutex_unlock(&binderfs_minors_mutex); | 142 | minor = ida_alloc_max(&binderfs_minors, |
115 | if (minor < 0) | 143 | use_reserve ? BINDERFS_MAX_MINOR : |
144 | BINDERFS_MAX_MINOR_CAPPED, | ||
145 | GFP_KERNEL); | ||
146 | else | ||
147 | minor = -ENOSPC; | ||
148 | if (minor < 0) { | ||
149 | --info->device_count; | ||
150 | mutex_unlock(&binderfs_minors_mutex); | ||
116 | return minor; | 151 | return minor; |
152 | } | ||
153 | mutex_unlock(&binderfs_minors_mutex); | ||
117 | 154 | ||
118 | ret = -ENOMEM; | 155 | ret = -ENOMEM; |
119 | device = kzalloc(sizeof(*device), GFP_KERNEL); | 156 | device = kzalloc(sizeof(*device), GFP_KERNEL); |
@@ -132,12 +169,13 @@ static int binderfs_binder_device_create(struct inode *ref_inode, | |||
132 | inode->i_uid = info->root_uid; | 169 | inode->i_uid = info->root_uid; |
133 | inode->i_gid = info->root_gid; | 170 | inode->i_gid = info->root_gid; |
134 | 171 | ||
135 | name = kmalloc(name_len, GFP_KERNEL); | 172 | req->name[BINDERFS_MAX_NAME] = '\0'; /* NUL-terminate */ |
173 | name_len = strlen(req->name); | ||
174 | /* Make sure to include terminating NUL byte */ | ||
175 | name = kmemdup(req->name, name_len + 1, GFP_KERNEL); | ||
136 | if (!name) | 176 | if (!name) |
137 | goto err; | 177 | goto err; |
138 | 178 | ||
139 | strscpy(name, req->name, name_len); | ||
140 | |||
141 | device->binderfs_inode = inode; | 179 | device->binderfs_inode = inode; |
142 | device->context.binder_context_mgr_uid = INVALID_UID; | 180 | device->context.binder_context_mgr_uid = INVALID_UID; |
143 | device->context.name = name; | 181 | device->context.name = name; |
@@ -156,28 +194,25 @@ static int binderfs_binder_device_create(struct inode *ref_inode, | |||
156 | 194 | ||
157 | root = sb->s_root; | 195 | root = sb->s_root; |
158 | inode_lock(d_inode(root)); | 196 | inode_lock(d_inode(root)); |
159 | dentry = d_alloc_name(root, name); | 197 | |
160 | if (!dentry) { | 198 | /* look it up */ |
199 | dentry = lookup_one_len(name, root, name_len); | ||
200 | if (IS_ERR(dentry)) { | ||
161 | inode_unlock(d_inode(root)); | 201 | inode_unlock(d_inode(root)); |
162 | ret = -ENOMEM; | 202 | ret = PTR_ERR(dentry); |
163 | goto err; | 203 | goto err; |
164 | } | 204 | } |
165 | 205 | ||
166 | /* Verify that the name userspace gave us is not already in use. */ | 206 | if (d_really_is_positive(dentry)) { |
167 | dup = d_lookup(root, &dentry->d_name); | 207 | /* already exists */ |
168 | if (dup) { | 208 | dput(dentry); |
169 | if (d_really_is_positive(dup)) { | 209 | inode_unlock(d_inode(root)); |
170 | dput(dup); | 210 | ret = -EEXIST; |
171 | dput(dentry); | 211 | goto err; |
172 | inode_unlock(d_inode(root)); | ||
173 | ret = -EEXIST; | ||
174 | goto err; | ||
175 | } | ||
176 | dput(dup); | ||
177 | } | 212 | } |
178 | 213 | ||
179 | inode->i_private = device; | 214 | inode->i_private = device; |
180 | d_add(dentry, inode); | 215 | d_instantiate(dentry, inode); |
181 | fsnotify_create(root->d_inode, dentry); | 216 | fsnotify_create(root->d_inode, dentry); |
182 | inode_unlock(d_inode(root)); | 217 | inode_unlock(d_inode(root)); |
183 | 218 | ||
@@ -187,6 +222,7 @@ err: | |||
187 | kfree(name); | 222 | kfree(name); |
188 | kfree(device); | 223 | kfree(device); |
189 | mutex_lock(&binderfs_minors_mutex); | 224 | mutex_lock(&binderfs_minors_mutex); |
225 | --info->device_count; | ||
190 | ida_free(&binderfs_minors, minor); | 226 | ida_free(&binderfs_minors, minor); |
191 | mutex_unlock(&binderfs_minors_mutex); | 227 | mutex_unlock(&binderfs_minors_mutex); |
192 | iput(inode); | 228 | iput(inode); |
@@ -232,6 +268,7 @@ static long binder_ctl_ioctl(struct file *file, unsigned int cmd, | |||
232 | static void binderfs_evict_inode(struct inode *inode) | 268 | static void binderfs_evict_inode(struct inode *inode) |
233 | { | 269 | { |
234 | struct binder_device *device = inode->i_private; | 270 | struct binder_device *device = inode->i_private; |
271 | struct binderfs_info *info = BINDERFS_I(inode); | ||
235 | 272 | ||
236 | clear_inode(inode); | 273 | clear_inode(inode); |
237 | 274 | ||
@@ -239,6 +276,7 @@ static void binderfs_evict_inode(struct inode *inode) | |||
239 | return; | 276 | return; |
240 | 277 | ||
241 | mutex_lock(&binderfs_minors_mutex); | 278 | mutex_lock(&binderfs_minors_mutex); |
279 | --info->device_count; | ||
242 | ida_free(&binderfs_minors, device->miscdev.minor); | 280 | ida_free(&binderfs_minors, device->miscdev.minor); |
243 | mutex_unlock(&binderfs_minors_mutex); | 281 | mutex_unlock(&binderfs_minors_mutex); |
244 | 282 | ||
@@ -246,43 +284,87 @@ static void binderfs_evict_inode(struct inode *inode) | |||
246 | kfree(device); | 284 | kfree(device); |
247 | } | 285 | } |
248 | 286 | ||
287 | /** | ||
288 | * binderfs_parse_mount_opts - parse binderfs mount options | ||
289 | * @data: options to set (can be NULL in which case defaults are used) | ||
290 | */ | ||
291 | static int binderfs_parse_mount_opts(char *data, | ||
292 | struct binderfs_mount_opts *opts) | ||
293 | { | ||
294 | char *p; | ||
295 | opts->max = BINDERFS_MAX_MINOR; | ||
296 | |||
297 | while ((p = strsep(&data, ",")) != NULL) { | ||
298 | substring_t args[MAX_OPT_ARGS]; | ||
299 | int token; | ||
300 | int max_devices; | ||
301 | |||
302 | if (!*p) | ||
303 | continue; | ||
304 | |||
305 | token = match_token(p, tokens, args); | ||
306 | switch (token) { | ||
307 | case Opt_max: | ||
308 | if (match_int(&args[0], &max_devices) || | ||
309 | (max_devices < 0 || | ||
310 | (max_devices > BINDERFS_MAX_MINOR))) | ||
311 | return -EINVAL; | ||
312 | |||
313 | opts->max = max_devices; | ||
314 | break; | ||
315 | default: | ||
316 | pr_err("Invalid mount options\n"); | ||
317 | return -EINVAL; | ||
318 | } | ||
319 | } | ||
320 | |||
321 | return 0; | ||
322 | } | ||
323 | |||
324 | static int binderfs_remount(struct super_block *sb, int *flags, char *data) | ||
325 | { | ||
326 | struct binderfs_info *info = sb->s_fs_info; | ||
327 | return binderfs_parse_mount_opts(data, &info->mount_opts); | ||
328 | } | ||
329 | |||
330 | static int binderfs_show_mount_opts(struct seq_file *seq, struct dentry *root) | ||
331 | { | ||
332 | struct binderfs_info *info; | ||
333 | |||
334 | info = root->d_sb->s_fs_info; | ||
335 | if (info->mount_opts.max <= BINDERFS_MAX_MINOR) | ||
336 | seq_printf(seq, ",max=%d", info->mount_opts.max); | ||
337 | |||
338 | return 0; | ||
339 | } | ||
340 | |||
249 | static const struct super_operations binderfs_super_ops = { | 341 | static const struct super_operations binderfs_super_ops = { |
250 | .statfs = simple_statfs, | 342 | .evict_inode = binderfs_evict_inode, |
251 | .evict_inode = binderfs_evict_inode, | 343 | .remount_fs = binderfs_remount, |
344 | .show_options = binderfs_show_mount_opts, | ||
345 | .statfs = simple_statfs, | ||
252 | }; | 346 | }; |
253 | 347 | ||
348 | static inline bool is_binderfs_control_device(const struct dentry *dentry) | ||
349 | { | ||
350 | struct binderfs_info *info = dentry->d_sb->s_fs_info; | ||
351 | return info->control_dentry == dentry; | ||
352 | } | ||
353 | |||
254 | static int binderfs_rename(struct inode *old_dir, struct dentry *old_dentry, | 354 | static int binderfs_rename(struct inode *old_dir, struct dentry *old_dentry, |
255 | struct inode *new_dir, struct dentry *new_dentry, | 355 | struct inode *new_dir, struct dentry *new_dentry, |
256 | unsigned int flags) | 356 | unsigned int flags) |
257 | { | 357 | { |
258 | struct inode *inode = d_inode(old_dentry); | 358 | if (is_binderfs_control_device(old_dentry) || |
259 | 359 | is_binderfs_control_device(new_dentry)) | |
260 | /* binderfs doesn't support directories. */ | ||
261 | if (d_is_dir(old_dentry)) | ||
262 | return -EPERM; | 360 | return -EPERM; |
263 | 361 | ||
264 | if (flags & ~RENAME_NOREPLACE) | 362 | return simple_rename(old_dir, old_dentry, new_dir, new_dentry, flags); |
265 | return -EINVAL; | ||
266 | |||
267 | if (!simple_empty(new_dentry)) | ||
268 | return -ENOTEMPTY; | ||
269 | |||
270 | if (d_really_is_positive(new_dentry)) | ||
271 | simple_unlink(new_dir, new_dentry); | ||
272 | |||
273 | old_dir->i_ctime = old_dir->i_mtime = new_dir->i_ctime = | ||
274 | new_dir->i_mtime = inode->i_ctime = current_time(old_dir); | ||
275 | |||
276 | return 0; | ||
277 | } | 363 | } |
278 | 364 | ||
279 | static int binderfs_unlink(struct inode *dir, struct dentry *dentry) | 365 | static int binderfs_unlink(struct inode *dir, struct dentry *dentry) |
280 | { | 366 | { |
281 | /* | 367 | if (is_binderfs_control_device(dentry)) |
282 | * The control dentry is only ever touched during mount so checking it | ||
283 | * here should not require us to take lock. | ||
284 | */ | ||
285 | if (BINDERFS_I(dir)->control_dentry == dentry) | ||
286 | return -EPERM; | 368 | return -EPERM; |
287 | 369 | ||
288 | return simple_unlink(dir, dentry); | 370 | return simple_unlink(dir, dentry); |
@@ -318,8 +400,6 @@ static int binderfs_binder_ctl_create(struct super_block *sb) | |||
318 | if (!device) | 400 | if (!device) |
319 | return -ENOMEM; | 401 | return -ENOMEM; |
320 | 402 | ||
321 | inode_lock(d_inode(root)); | ||
322 | |||
323 | /* If we have already created a binder-control node, return. */ | 403 | /* If we have already created a binder-control node, return. */ |
324 | if (info->control_dentry) { | 404 | if (info->control_dentry) { |
325 | ret = 0; | 405 | ret = 0; |
@@ -358,12 +438,10 @@ static int binderfs_binder_ctl_create(struct super_block *sb) | |||
358 | inode->i_private = device; | 438 | inode->i_private = device; |
359 | info->control_dentry = dentry; | 439 | info->control_dentry = dentry; |
360 | d_add(dentry, inode); | 440 | d_add(dentry, inode); |
361 | inode_unlock(d_inode(root)); | ||
362 | 441 | ||
363 | return 0; | 442 | return 0; |
364 | 443 | ||
365 | out: | 444 | out: |
366 | inode_unlock(d_inode(root)); | ||
367 | kfree(device); | 445 | kfree(device); |
368 | iput(inode); | 446 | iput(inode); |
369 | 447 | ||
@@ -378,12 +456,9 @@ static const struct inode_operations binderfs_dir_inode_operations = { | |||
378 | 456 | ||
379 | static int binderfs_fill_super(struct super_block *sb, void *data, int silent) | 457 | static int binderfs_fill_super(struct super_block *sb, void *data, int silent) |
380 | { | 458 | { |
459 | int ret; | ||
381 | struct binderfs_info *info; | 460 | struct binderfs_info *info; |
382 | int ret = -ENOMEM; | ||
383 | struct inode *inode = NULL; | 461 | struct inode *inode = NULL; |
384 | struct ipc_namespace *ipc_ns = sb->s_fs_info; | ||
385 | |||
386 | get_ipc_ns(ipc_ns); | ||
387 | 462 | ||
388 | sb->s_blocksize = PAGE_SIZE; | 463 | sb->s_blocksize = PAGE_SIZE; |
389 | sb->s_blocksize_bits = PAGE_SHIFT; | 464 | sb->s_blocksize_bits = PAGE_SHIFT; |
@@ -405,11 +480,17 @@ static int binderfs_fill_super(struct super_block *sb, void *data, int silent) | |||
405 | sb->s_op = &binderfs_super_ops; | 480 | sb->s_op = &binderfs_super_ops; |
406 | sb->s_time_gran = 1; | 481 | sb->s_time_gran = 1; |
407 | 482 | ||
408 | info = kzalloc(sizeof(struct binderfs_info), GFP_KERNEL); | 483 | sb->s_fs_info = kzalloc(sizeof(struct binderfs_info), GFP_KERNEL); |
409 | if (!info) | 484 | if (!sb->s_fs_info) |
410 | goto err_without_dentry; | 485 | return -ENOMEM; |
486 | info = sb->s_fs_info; | ||
487 | |||
488 | info->ipc_ns = get_ipc_ns(current->nsproxy->ipc_ns); | ||
489 | |||
490 | ret = binderfs_parse_mount_opts(data, &info->mount_opts); | ||
491 | if (ret) | ||
492 | return ret; | ||
411 | 493 | ||
412 | info->ipc_ns = ipc_ns; | ||
413 | info->root_gid = make_kgid(sb->s_user_ns, 0); | 494 | info->root_gid = make_kgid(sb->s_user_ns, 0); |
414 | if (!gid_valid(info->root_gid)) | 495 | if (!gid_valid(info->root_gid)) |
415 | info->root_gid = GLOBAL_ROOT_GID; | 496 | info->root_gid = GLOBAL_ROOT_GID; |
@@ -417,11 +498,9 @@ static int binderfs_fill_super(struct super_block *sb, void *data, int silent) | |||
417 | if (!uid_valid(info->root_uid)) | 498 | if (!uid_valid(info->root_uid)) |
418 | info->root_uid = GLOBAL_ROOT_UID; | 499 | info->root_uid = GLOBAL_ROOT_UID; |
419 | 500 | ||
420 | sb->s_fs_info = info; | ||
421 | |||
422 | inode = new_inode(sb); | 501 | inode = new_inode(sb); |
423 | if (!inode) | 502 | if (!inode) |
424 | goto err_without_dentry; | 503 | return -ENOMEM; |
425 | 504 | ||
426 | inode->i_ino = FIRST_INODE; | 505 | inode->i_ino = FIRST_INODE; |
427 | inode->i_fop = &simple_dir_operations; | 506 | inode->i_fop = &simple_dir_operations; |
@@ -432,79 +511,28 @@ static int binderfs_fill_super(struct super_block *sb, void *data, int silent) | |||
432 | 511 | ||
433 | sb->s_root = d_make_root(inode); | 512 | sb->s_root = d_make_root(inode); |
434 | if (!sb->s_root) | 513 | if (!sb->s_root) |
435 | goto err_without_dentry; | 514 | return -ENOMEM; |
436 | |||
437 | ret = binderfs_binder_ctl_create(sb); | ||
438 | if (ret) | ||
439 | goto err_with_dentry; | ||
440 | |||
441 | return 0; | ||
442 | |||
443 | err_with_dentry: | ||
444 | dput(sb->s_root); | ||
445 | sb->s_root = NULL; | ||
446 | |||
447 | err_without_dentry: | ||
448 | put_ipc_ns(ipc_ns); | ||
449 | iput(inode); | ||
450 | kfree(info); | ||
451 | |||
452 | return ret; | ||
453 | } | ||
454 | |||
455 | static int binderfs_test_super(struct super_block *sb, void *data) | ||
456 | { | ||
457 | struct binderfs_info *info = sb->s_fs_info; | ||
458 | |||
459 | if (info) | ||
460 | return info->ipc_ns == data; | ||
461 | |||
462 | return 0; | ||
463 | } | ||
464 | 515 | ||
465 | static int binderfs_set_super(struct super_block *sb, void *data) | 516 | return binderfs_binder_ctl_create(sb); |
466 | { | ||
467 | sb->s_fs_info = data; | ||
468 | return set_anon_super(sb, NULL); | ||
469 | } | 517 | } |
470 | 518 | ||
471 | static struct dentry *binderfs_mount(struct file_system_type *fs_type, | 519 | static struct dentry *binderfs_mount(struct file_system_type *fs_type, |
472 | int flags, const char *dev_name, | 520 | int flags, const char *dev_name, |
473 | void *data) | 521 | void *data) |
474 | { | 522 | { |
475 | struct super_block *sb; | 523 | return mount_nodev(fs_type, flags, data, binderfs_fill_super); |
476 | struct ipc_namespace *ipc_ns = current->nsproxy->ipc_ns; | ||
477 | |||
478 | if (!ns_capable(ipc_ns->user_ns, CAP_SYS_ADMIN)) | ||
479 | return ERR_PTR(-EPERM); | ||
480 | |||
481 | sb = sget_userns(fs_type, binderfs_test_super, binderfs_set_super, | ||
482 | flags, ipc_ns->user_ns, ipc_ns); | ||
483 | if (IS_ERR(sb)) | ||
484 | return ERR_CAST(sb); | ||
485 | |||
486 | if (!sb->s_root) { | ||
487 | int ret = binderfs_fill_super(sb, data, flags & SB_SILENT ? 1 : 0); | ||
488 | if (ret) { | ||
489 | deactivate_locked_super(sb); | ||
490 | return ERR_PTR(ret); | ||
491 | } | ||
492 | |||
493 | sb->s_flags |= SB_ACTIVE; | ||
494 | } | ||
495 | |||
496 | return dget(sb->s_root); | ||
497 | } | 524 | } |
498 | 525 | ||
499 | static void binderfs_kill_super(struct super_block *sb) | 526 | static void binderfs_kill_super(struct super_block *sb) |
500 | { | 527 | { |
501 | struct binderfs_info *info = sb->s_fs_info; | 528 | struct binderfs_info *info = sb->s_fs_info; |
502 | 529 | ||
530 | kill_litter_super(sb); | ||
531 | |||
503 | if (info && info->ipc_ns) | 532 | if (info && info->ipc_ns) |
504 | put_ipc_ns(info->ipc_ns); | 533 | put_ipc_ns(info->ipc_ns); |
505 | 534 | ||
506 | kfree(info); | 535 | kfree(info); |
507 | kill_litter_super(sb); | ||
508 | } | 536 | } |
509 | 537 | ||
510 | static struct file_system_type binder_fs_type = { | 538 | static struct file_system_type binder_fs_type = { |
@@ -530,14 +558,6 @@ static int __init init_binderfs(void) | |||
530 | return ret; | 558 | return ret; |
531 | } | 559 | } |
532 | 560 | ||
533 | binderfs_mnt = kern_mount(&binder_fs_type); | ||
534 | if (IS_ERR(binderfs_mnt)) { | ||
535 | ret = PTR_ERR(binderfs_mnt); | ||
536 | binderfs_mnt = NULL; | ||
537 | unregister_filesystem(&binder_fs_type); | ||
538 | unregister_chrdev_region(binderfs_dev, BINDERFS_MAX_MINOR); | ||
539 | } | ||
540 | |||
541 | return ret; | 561 | return ret; |
542 | } | 562 | } |
543 | 563 | ||
diff --git a/drivers/char/mwave/mwavedd.c b/drivers/char/mwave/mwavedd.c index b5e3103c1175..e43c876a9223 100644 --- a/drivers/char/mwave/mwavedd.c +++ b/drivers/char/mwave/mwavedd.c | |||
@@ -59,6 +59,7 @@ | |||
59 | #include <linux/mutex.h> | 59 | #include <linux/mutex.h> |
60 | #include <linux/delay.h> | 60 | #include <linux/delay.h> |
61 | #include <linux/serial_8250.h> | 61 | #include <linux/serial_8250.h> |
62 | #include <linux/nospec.h> | ||
62 | #include "smapi.h" | 63 | #include "smapi.h" |
63 | #include "mwavedd.h" | 64 | #include "mwavedd.h" |
64 | #include "3780i.h" | 65 | #include "3780i.h" |
@@ -289,6 +290,8 @@ static long mwave_ioctl(struct file *file, unsigned int iocmd, | |||
289 | ipcnum); | 290 | ipcnum); |
290 | return -EINVAL; | 291 | return -EINVAL; |
291 | } | 292 | } |
293 | ipcnum = array_index_nospec(ipcnum, | ||
294 | ARRAY_SIZE(pDrvData->IPCs)); | ||
292 | PRINTK_3(TRACE_MWAVE, | 295 | PRINTK_3(TRACE_MWAVE, |
293 | "mwavedd::mwave_ioctl IOCTL_MW_REGISTER_IPC" | 296 | "mwavedd::mwave_ioctl IOCTL_MW_REGISTER_IPC" |
294 | " ipcnum %x entry usIntCount %x\n", | 297 | " ipcnum %x entry usIntCount %x\n", |
@@ -317,6 +320,8 @@ static long mwave_ioctl(struct file *file, unsigned int iocmd, | |||
317 | " Invalid ipcnum %x\n", ipcnum); | 320 | " Invalid ipcnum %x\n", ipcnum); |
318 | return -EINVAL; | 321 | return -EINVAL; |
319 | } | 322 | } |
323 | ipcnum = array_index_nospec(ipcnum, | ||
324 | ARRAY_SIZE(pDrvData->IPCs)); | ||
320 | PRINTK_3(TRACE_MWAVE, | 325 | PRINTK_3(TRACE_MWAVE, |
321 | "mwavedd::mwave_ioctl IOCTL_MW_GET_IPC" | 326 | "mwavedd::mwave_ioctl IOCTL_MW_GET_IPC" |
322 | " ipcnum %x, usIntCount %x\n", | 327 | " ipcnum %x, usIntCount %x\n", |
@@ -383,6 +388,8 @@ static long mwave_ioctl(struct file *file, unsigned int iocmd, | |||
383 | ipcnum); | 388 | ipcnum); |
384 | return -EINVAL; | 389 | return -EINVAL; |
385 | } | 390 | } |
391 | ipcnum = array_index_nospec(ipcnum, | ||
392 | ARRAY_SIZE(pDrvData->IPCs)); | ||
386 | mutex_lock(&mwave_mutex); | 393 | mutex_lock(&mwave_mutex); |
387 | if (pDrvData->IPCs[ipcnum].bIsEnabled == true) { | 394 | if (pDrvData->IPCs[ipcnum].bIsEnabled == true) { |
388 | pDrvData->IPCs[ipcnum].bIsEnabled = false; | 395 | pDrvData->IPCs[ipcnum].bIsEnabled = false; |
diff --git a/drivers/hv/channel.c b/drivers/hv/channel.c index ce0ba2062723..bea4c9850247 100644 --- a/drivers/hv/channel.c +++ b/drivers/hv/channel.c | |||
@@ -701,19 +701,12 @@ static int vmbus_close_internal(struct vmbus_channel *channel) | |||
701 | int vmbus_disconnect_ring(struct vmbus_channel *channel) | 701 | int vmbus_disconnect_ring(struct vmbus_channel *channel) |
702 | { | 702 | { |
703 | struct vmbus_channel *cur_channel, *tmp; | 703 | struct vmbus_channel *cur_channel, *tmp; |
704 | unsigned long flags; | ||
705 | LIST_HEAD(list); | ||
706 | int ret; | 704 | int ret; |
707 | 705 | ||
708 | if (channel->primary_channel != NULL) | 706 | if (channel->primary_channel != NULL) |
709 | return -EINVAL; | 707 | return -EINVAL; |
710 | 708 | ||
711 | /* Snapshot the list of subchannels */ | 709 | list_for_each_entry_safe(cur_channel, tmp, &channel->sc_list, sc_list) { |
712 | spin_lock_irqsave(&channel->lock, flags); | ||
713 | list_splice_init(&channel->sc_list, &list); | ||
714 | spin_unlock_irqrestore(&channel->lock, flags); | ||
715 | |||
716 | list_for_each_entry_safe(cur_channel, tmp, &list, sc_list) { | ||
717 | if (cur_channel->rescind) | 710 | if (cur_channel->rescind) |
718 | wait_for_completion(&cur_channel->rescind_event); | 711 | wait_for_completion(&cur_channel->rescind_event); |
719 | 712 | ||
diff --git a/drivers/hv/hv_balloon.c b/drivers/hv/hv_balloon.c index 5301fef16c31..7c6349a50ef1 100644 --- a/drivers/hv/hv_balloon.c +++ b/drivers/hv/hv_balloon.c | |||
@@ -888,12 +888,14 @@ static unsigned long handle_pg_range(unsigned long pg_start, | |||
888 | pfn_cnt -= pgs_ol; | 888 | pfn_cnt -= pgs_ol; |
889 | /* | 889 | /* |
890 | * Check if the corresponding memory block is already | 890 | * Check if the corresponding memory block is already |
891 | * online by checking its last previously backed page. | 891 | * online. It is possible to observe struct pages still |
892 | * In case it is we need to bring rest (which was not | 892 | * being uninitialized here so check section instead. |
893 | * backed previously) online too. | 893 | * In case the section is online we need to bring the |
894 | * rest of pfns (which were not backed previously) | ||
895 | * online too. | ||
894 | */ | 896 | */ |
895 | if (start_pfn > has->start_pfn && | 897 | if (start_pfn > has->start_pfn && |
896 | !PageReserved(pfn_to_page(start_pfn - 1))) | 898 | online_section_nr(pfn_to_section_nr(start_pfn))) |
897 | hv_bring_pgs_online(has, start_pfn, pgs_ol); | 899 | hv_bring_pgs_online(has, start_pfn, pgs_ol); |
898 | 900 | ||
899 | } | 901 | } |
diff --git a/drivers/hv/ring_buffer.c b/drivers/hv/ring_buffer.c index 64d0c85d5161..1f1a55e07733 100644 --- a/drivers/hv/ring_buffer.c +++ b/drivers/hv/ring_buffer.c | |||
@@ -164,26 +164,25 @@ hv_get_ringbuffer_availbytes(const struct hv_ring_buffer_info *rbi, | |||
164 | } | 164 | } |
165 | 165 | ||
166 | /* Get various debug metrics for the specified ring buffer. */ | 166 | /* Get various debug metrics for the specified ring buffer. */ |
167 | void hv_ringbuffer_get_debuginfo(const struct hv_ring_buffer_info *ring_info, | 167 | int hv_ringbuffer_get_debuginfo(const struct hv_ring_buffer_info *ring_info, |
168 | struct hv_ring_buffer_debug_info *debug_info) | 168 | struct hv_ring_buffer_debug_info *debug_info) |
169 | { | 169 | { |
170 | u32 bytes_avail_towrite; | 170 | u32 bytes_avail_towrite; |
171 | u32 bytes_avail_toread; | 171 | u32 bytes_avail_toread; |
172 | 172 | ||
173 | if (ring_info->ring_buffer) { | 173 | if (!ring_info->ring_buffer) |
174 | hv_get_ringbuffer_availbytes(ring_info, | 174 | return -EINVAL; |
175 | &bytes_avail_toread, | 175 | |
176 | &bytes_avail_towrite); | 176 | hv_get_ringbuffer_availbytes(ring_info, |
177 | 177 | &bytes_avail_toread, | |
178 | debug_info->bytes_avail_toread = bytes_avail_toread; | 178 | &bytes_avail_towrite); |
179 | debug_info->bytes_avail_towrite = bytes_avail_towrite; | 179 | debug_info->bytes_avail_toread = bytes_avail_toread; |
180 | debug_info->current_read_index = | 180 | debug_info->bytes_avail_towrite = bytes_avail_towrite; |
181 | ring_info->ring_buffer->read_index; | 181 | debug_info->current_read_index = ring_info->ring_buffer->read_index; |
182 | debug_info->current_write_index = | 182 | debug_info->current_write_index = ring_info->ring_buffer->write_index; |
183 | ring_info->ring_buffer->write_index; | 183 | debug_info->current_interrupt_mask |
184 | debug_info->current_interrupt_mask = | 184 | = ring_info->ring_buffer->interrupt_mask; |
185 | ring_info->ring_buffer->interrupt_mask; | 185 | return 0; |
186 | } | ||
187 | } | 186 | } |
188 | EXPORT_SYMBOL_GPL(hv_ringbuffer_get_debuginfo); | 187 | EXPORT_SYMBOL_GPL(hv_ringbuffer_get_debuginfo); |
189 | 188 | ||
diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c index d0ff65675292..403fee01572c 100644 --- a/drivers/hv/vmbus_drv.c +++ b/drivers/hv/vmbus_drv.c | |||
@@ -313,12 +313,16 @@ static ssize_t out_intr_mask_show(struct device *dev, | |||
313 | { | 313 | { |
314 | struct hv_device *hv_dev = device_to_hv_device(dev); | 314 | struct hv_device *hv_dev = device_to_hv_device(dev); |
315 | struct hv_ring_buffer_debug_info outbound; | 315 | struct hv_ring_buffer_debug_info outbound; |
316 | int ret; | ||
316 | 317 | ||
317 | if (!hv_dev->channel) | 318 | if (!hv_dev->channel) |
318 | return -ENODEV; | 319 | return -ENODEV; |
319 | if (hv_dev->channel->state != CHANNEL_OPENED_STATE) | 320 | |
320 | return -EINVAL; | 321 | ret = hv_ringbuffer_get_debuginfo(&hv_dev->channel->outbound, |
321 | hv_ringbuffer_get_debuginfo(&hv_dev->channel->outbound, &outbound); | 322 | &outbound); |
323 | if (ret < 0) | ||
324 | return ret; | ||
325 | |||
322 | return sprintf(buf, "%d\n", outbound.current_interrupt_mask); | 326 | return sprintf(buf, "%d\n", outbound.current_interrupt_mask); |
323 | } | 327 | } |
324 | static DEVICE_ATTR_RO(out_intr_mask); | 328 | static DEVICE_ATTR_RO(out_intr_mask); |
@@ -328,12 +332,15 @@ static ssize_t out_read_index_show(struct device *dev, | |||
328 | { | 332 | { |
329 | struct hv_device *hv_dev = device_to_hv_device(dev); | 333 | struct hv_device *hv_dev = device_to_hv_device(dev); |
330 | struct hv_ring_buffer_debug_info outbound; | 334 | struct hv_ring_buffer_debug_info outbound; |
335 | int ret; | ||
331 | 336 | ||
332 | if (!hv_dev->channel) | 337 | if (!hv_dev->channel) |
333 | return -ENODEV; | 338 | return -ENODEV; |
334 | if (hv_dev->channel->state != CHANNEL_OPENED_STATE) | 339 | |
335 | return -EINVAL; | 340 | ret = hv_ringbuffer_get_debuginfo(&hv_dev->channel->outbound, |
336 | hv_ringbuffer_get_debuginfo(&hv_dev->channel->outbound, &outbound); | 341 | &outbound); |
342 | if (ret < 0) | ||
343 | return ret; | ||
337 | return sprintf(buf, "%d\n", outbound.current_read_index); | 344 | return sprintf(buf, "%d\n", outbound.current_read_index); |
338 | } | 345 | } |
339 | static DEVICE_ATTR_RO(out_read_index); | 346 | static DEVICE_ATTR_RO(out_read_index); |
@@ -344,12 +351,15 @@ static ssize_t out_write_index_show(struct device *dev, | |||
344 | { | 351 | { |
345 | struct hv_device *hv_dev = device_to_hv_device(dev); | 352 | struct hv_device *hv_dev = device_to_hv_device(dev); |
346 | struct hv_ring_buffer_debug_info outbound; | 353 | struct hv_ring_buffer_debug_info outbound; |
354 | int ret; | ||
347 | 355 | ||
348 | if (!hv_dev->channel) | 356 | if (!hv_dev->channel) |
349 | return -ENODEV; | 357 | return -ENODEV; |
350 | if (hv_dev->channel->state != CHANNEL_OPENED_STATE) | 358 | |
351 | return -EINVAL; | 359 | ret = hv_ringbuffer_get_debuginfo(&hv_dev->channel->outbound, |
352 | hv_ringbuffer_get_debuginfo(&hv_dev->channel->outbound, &outbound); | 360 | &outbound); |
361 | if (ret < 0) | ||
362 | return ret; | ||
353 | return sprintf(buf, "%d\n", outbound.current_write_index); | 363 | return sprintf(buf, "%d\n", outbound.current_write_index); |
354 | } | 364 | } |
355 | static DEVICE_ATTR_RO(out_write_index); | 365 | static DEVICE_ATTR_RO(out_write_index); |
@@ -360,12 +370,15 @@ static ssize_t out_read_bytes_avail_show(struct device *dev, | |||
360 | { | 370 | { |
361 | struct hv_device *hv_dev = device_to_hv_device(dev); | 371 | struct hv_device *hv_dev = device_to_hv_device(dev); |
362 | struct hv_ring_buffer_debug_info outbound; | 372 | struct hv_ring_buffer_debug_info outbound; |
373 | int ret; | ||
363 | 374 | ||
364 | if (!hv_dev->channel) | 375 | if (!hv_dev->channel) |
365 | return -ENODEV; | 376 | return -ENODEV; |
366 | if (hv_dev->channel->state != CHANNEL_OPENED_STATE) | 377 | |
367 | return -EINVAL; | 378 | ret = hv_ringbuffer_get_debuginfo(&hv_dev->channel->outbound, |
368 | hv_ringbuffer_get_debuginfo(&hv_dev->channel->outbound, &outbound); | 379 | &outbound); |
380 | if (ret < 0) | ||
381 | return ret; | ||
369 | return sprintf(buf, "%d\n", outbound.bytes_avail_toread); | 382 | return sprintf(buf, "%d\n", outbound.bytes_avail_toread); |
370 | } | 383 | } |
371 | static DEVICE_ATTR_RO(out_read_bytes_avail); | 384 | static DEVICE_ATTR_RO(out_read_bytes_avail); |
@@ -376,12 +389,15 @@ static ssize_t out_write_bytes_avail_show(struct device *dev, | |||
376 | { | 389 | { |
377 | struct hv_device *hv_dev = device_to_hv_device(dev); | 390 | struct hv_device *hv_dev = device_to_hv_device(dev); |
378 | struct hv_ring_buffer_debug_info outbound; | 391 | struct hv_ring_buffer_debug_info outbound; |
392 | int ret; | ||
379 | 393 | ||
380 | if (!hv_dev->channel) | 394 | if (!hv_dev->channel) |
381 | return -ENODEV; | 395 | return -ENODEV; |
382 | if (hv_dev->channel->state != CHANNEL_OPENED_STATE) | 396 | |
383 | return -EINVAL; | 397 | ret = hv_ringbuffer_get_debuginfo(&hv_dev->channel->outbound, |
384 | hv_ringbuffer_get_debuginfo(&hv_dev->channel->outbound, &outbound); | 398 | &outbound); |
399 | if (ret < 0) | ||
400 | return ret; | ||
385 | return sprintf(buf, "%d\n", outbound.bytes_avail_towrite); | 401 | return sprintf(buf, "%d\n", outbound.bytes_avail_towrite); |
386 | } | 402 | } |
387 | static DEVICE_ATTR_RO(out_write_bytes_avail); | 403 | static DEVICE_ATTR_RO(out_write_bytes_avail); |
@@ -391,12 +407,15 @@ static ssize_t in_intr_mask_show(struct device *dev, | |||
391 | { | 407 | { |
392 | struct hv_device *hv_dev = device_to_hv_device(dev); | 408 | struct hv_device *hv_dev = device_to_hv_device(dev); |
393 | struct hv_ring_buffer_debug_info inbound; | 409 | struct hv_ring_buffer_debug_info inbound; |
410 | int ret; | ||
394 | 411 | ||
395 | if (!hv_dev->channel) | 412 | if (!hv_dev->channel) |
396 | return -ENODEV; | 413 | return -ENODEV; |
397 | if (hv_dev->channel->state != CHANNEL_OPENED_STATE) | 414 | |
398 | return -EINVAL; | 415 | ret = hv_ringbuffer_get_debuginfo(&hv_dev->channel->inbound, &inbound); |
399 | hv_ringbuffer_get_debuginfo(&hv_dev->channel->inbound, &inbound); | 416 | if (ret < 0) |
417 | return ret; | ||
418 | |||
400 | return sprintf(buf, "%d\n", inbound.current_interrupt_mask); | 419 | return sprintf(buf, "%d\n", inbound.current_interrupt_mask); |
401 | } | 420 | } |
402 | static DEVICE_ATTR_RO(in_intr_mask); | 421 | static DEVICE_ATTR_RO(in_intr_mask); |
@@ -406,12 +425,15 @@ static ssize_t in_read_index_show(struct device *dev, | |||
406 | { | 425 | { |
407 | struct hv_device *hv_dev = device_to_hv_device(dev); | 426 | struct hv_device *hv_dev = device_to_hv_device(dev); |
408 | struct hv_ring_buffer_debug_info inbound; | 427 | struct hv_ring_buffer_debug_info inbound; |
428 | int ret; | ||
409 | 429 | ||
410 | if (!hv_dev->channel) | 430 | if (!hv_dev->channel) |
411 | return -ENODEV; | 431 | return -ENODEV; |
412 | if (hv_dev->channel->state != CHANNEL_OPENED_STATE) | 432 | |
413 | return -EINVAL; | 433 | ret = hv_ringbuffer_get_debuginfo(&hv_dev->channel->inbound, &inbound); |
414 | hv_ringbuffer_get_debuginfo(&hv_dev->channel->inbound, &inbound); | 434 | if (ret < 0) |
435 | return ret; | ||
436 | |||
415 | return sprintf(buf, "%d\n", inbound.current_read_index); | 437 | return sprintf(buf, "%d\n", inbound.current_read_index); |
416 | } | 438 | } |
417 | static DEVICE_ATTR_RO(in_read_index); | 439 | static DEVICE_ATTR_RO(in_read_index); |
@@ -421,12 +443,15 @@ static ssize_t in_write_index_show(struct device *dev, | |||
421 | { | 443 | { |
422 | struct hv_device *hv_dev = device_to_hv_device(dev); | 444 | struct hv_device *hv_dev = device_to_hv_device(dev); |
423 | struct hv_ring_buffer_debug_info inbound; | 445 | struct hv_ring_buffer_debug_info inbound; |
446 | int ret; | ||
424 | 447 | ||
425 | if (!hv_dev->channel) | 448 | if (!hv_dev->channel) |
426 | return -ENODEV; | 449 | return -ENODEV; |
427 | if (hv_dev->channel->state != CHANNEL_OPENED_STATE) | 450 | |
428 | return -EINVAL; | 451 | ret = hv_ringbuffer_get_debuginfo(&hv_dev->channel->inbound, &inbound); |
429 | hv_ringbuffer_get_debuginfo(&hv_dev->channel->inbound, &inbound); | 452 | if (ret < 0) |
453 | return ret; | ||
454 | |||
430 | return sprintf(buf, "%d\n", inbound.current_write_index); | 455 | return sprintf(buf, "%d\n", inbound.current_write_index); |
431 | } | 456 | } |
432 | static DEVICE_ATTR_RO(in_write_index); | 457 | static DEVICE_ATTR_RO(in_write_index); |
@@ -437,12 +462,15 @@ static ssize_t in_read_bytes_avail_show(struct device *dev, | |||
437 | { | 462 | { |
438 | struct hv_device *hv_dev = device_to_hv_device(dev); | 463 | struct hv_device *hv_dev = device_to_hv_device(dev); |
439 | struct hv_ring_buffer_debug_info inbound; | 464 | struct hv_ring_buffer_debug_info inbound; |
465 | int ret; | ||
440 | 466 | ||
441 | if (!hv_dev->channel) | 467 | if (!hv_dev->channel) |
442 | return -ENODEV; | 468 | return -ENODEV; |
443 | if (hv_dev->channel->state != CHANNEL_OPENED_STATE) | 469 | |
444 | return -EINVAL; | 470 | ret = hv_ringbuffer_get_debuginfo(&hv_dev->channel->inbound, &inbound); |
445 | hv_ringbuffer_get_debuginfo(&hv_dev->channel->inbound, &inbound); | 471 | if (ret < 0) |
472 | return ret; | ||
473 | |||
446 | return sprintf(buf, "%d\n", inbound.bytes_avail_toread); | 474 | return sprintf(buf, "%d\n", inbound.bytes_avail_toread); |
447 | } | 475 | } |
448 | static DEVICE_ATTR_RO(in_read_bytes_avail); | 476 | static DEVICE_ATTR_RO(in_read_bytes_avail); |
@@ -453,12 +481,15 @@ static ssize_t in_write_bytes_avail_show(struct device *dev, | |||
453 | { | 481 | { |
454 | struct hv_device *hv_dev = device_to_hv_device(dev); | 482 | struct hv_device *hv_dev = device_to_hv_device(dev); |
455 | struct hv_ring_buffer_debug_info inbound; | 483 | struct hv_ring_buffer_debug_info inbound; |
484 | int ret; | ||
456 | 485 | ||
457 | if (!hv_dev->channel) | 486 | if (!hv_dev->channel) |
458 | return -ENODEV; | 487 | return -ENODEV; |
459 | if (hv_dev->channel->state != CHANNEL_OPENED_STATE) | 488 | |
460 | return -EINVAL; | 489 | ret = hv_ringbuffer_get_debuginfo(&hv_dev->channel->inbound, &inbound); |
461 | hv_ringbuffer_get_debuginfo(&hv_dev->channel->inbound, &inbound); | 490 | if (ret < 0) |
491 | return ret; | ||
492 | |||
462 | return sprintf(buf, "%d\n", inbound.bytes_avail_towrite); | 493 | return sprintf(buf, "%d\n", inbound.bytes_avail_towrite); |
463 | } | 494 | } |
464 | static DEVICE_ATTR_RO(in_write_bytes_avail); | 495 | static DEVICE_ATTR_RO(in_write_bytes_avail); |
diff --git a/drivers/misc/ibmvmc.c b/drivers/misc/ibmvmc.c index b8aaa684c397..2ed23c99f59f 100644 --- a/drivers/misc/ibmvmc.c +++ b/drivers/misc/ibmvmc.c | |||
@@ -820,21 +820,24 @@ static int ibmvmc_send_msg(struct crq_server_adapter *adapter, | |||
820 | * | 820 | * |
821 | * Return: | 821 | * Return: |
822 | * 0 - Success | 822 | * 0 - Success |
823 | * Non-zero - Failure | ||
823 | */ | 824 | */ |
824 | static int ibmvmc_open(struct inode *inode, struct file *file) | 825 | static int ibmvmc_open(struct inode *inode, struct file *file) |
825 | { | 826 | { |
826 | struct ibmvmc_file_session *session; | 827 | struct ibmvmc_file_session *session; |
827 | int rc = 0; | ||
828 | 828 | ||
829 | pr_debug("%s: inode = 0x%lx, file = 0x%lx, state = 0x%x\n", __func__, | 829 | pr_debug("%s: inode = 0x%lx, file = 0x%lx, state = 0x%x\n", __func__, |
830 | (unsigned long)inode, (unsigned long)file, | 830 | (unsigned long)inode, (unsigned long)file, |
831 | ibmvmc.state); | 831 | ibmvmc.state); |
832 | 832 | ||
833 | session = kzalloc(sizeof(*session), GFP_KERNEL); | 833 | session = kzalloc(sizeof(*session), GFP_KERNEL); |
834 | if (!session) | ||
835 | return -ENOMEM; | ||
836 | |||
834 | session->file = file; | 837 | session->file = file; |
835 | file->private_data = session; | 838 | file->private_data = session; |
836 | 839 | ||
837 | return rc; | 840 | return 0; |
838 | } | 841 | } |
839 | 842 | ||
840 | /** | 843 | /** |
diff --git a/drivers/misc/mei/hbm.c b/drivers/misc/mei/hbm.c index 78c26cebf5d4..8f7616557c97 100644 --- a/drivers/misc/mei/hbm.c +++ b/drivers/misc/mei/hbm.c | |||
@@ -1187,9 +1187,15 @@ int mei_hbm_dispatch(struct mei_device *dev, struct mei_msg_hdr *hdr) | |||
1187 | dma_setup_res = (struct hbm_dma_setup_response *)mei_msg; | 1187 | dma_setup_res = (struct hbm_dma_setup_response *)mei_msg; |
1188 | 1188 | ||
1189 | if (dma_setup_res->status) { | 1189 | if (dma_setup_res->status) { |
1190 | dev_info(dev->dev, "hbm: dma setup response: failure = %d %s\n", | 1190 | u8 status = dma_setup_res->status; |
1191 | dma_setup_res->status, | 1191 | |
1192 | mei_hbm_status_str(dma_setup_res->status)); | 1192 | if (status == MEI_HBMS_NOT_ALLOWED) { |
1193 | dev_dbg(dev->dev, "hbm: dma setup not allowed\n"); | ||
1194 | } else { | ||
1195 | dev_info(dev->dev, "hbm: dma setup response: failure = %d %s\n", | ||
1196 | status, | ||
1197 | mei_hbm_status_str(status)); | ||
1198 | } | ||
1193 | dev->hbm_f_dr_supported = 0; | 1199 | dev->hbm_f_dr_supported = 0; |
1194 | mei_dmam_ring_free(dev); | 1200 | mei_dmam_ring_free(dev); |
1195 | } | 1201 | } |
diff --git a/drivers/misc/mei/hw-me-regs.h b/drivers/misc/mei/hw-me-regs.h index e4b10b2d1a08..23739a60517f 100644 --- a/drivers/misc/mei/hw-me-regs.h +++ b/drivers/misc/mei/hw-me-regs.h | |||
@@ -127,6 +127,8 @@ | |||
127 | #define MEI_DEV_ID_BXT_M 0x1A9A /* Broxton M */ | 127 | #define MEI_DEV_ID_BXT_M 0x1A9A /* Broxton M */ |
128 | #define MEI_DEV_ID_APL_I 0x5A9A /* Apollo Lake I */ | 128 | #define MEI_DEV_ID_APL_I 0x5A9A /* Apollo Lake I */ |
129 | 129 | ||
130 | #define MEI_DEV_ID_DNV_IE 0x19E5 /* Denverton IE */ | ||
131 | |||
130 | #define MEI_DEV_ID_GLK 0x319A /* Gemini Lake */ | 132 | #define MEI_DEV_ID_GLK 0x319A /* Gemini Lake */ |
131 | 133 | ||
132 | #define MEI_DEV_ID_KBP 0xA2BA /* Kaby Point */ | 134 | #define MEI_DEV_ID_KBP 0xA2BA /* Kaby Point */ |
diff --git a/drivers/misc/mei/pci-me.c b/drivers/misc/mei/pci-me.c index 73ace2d59dea..e89497f858ae 100644 --- a/drivers/misc/mei/pci-me.c +++ b/drivers/misc/mei/pci-me.c | |||
@@ -88,11 +88,13 @@ static const struct pci_device_id mei_me_pci_tbl[] = { | |||
88 | {MEI_PCI_DEVICE(MEI_DEV_ID_SPT_2, MEI_ME_PCH8_CFG)}, | 88 | {MEI_PCI_DEVICE(MEI_DEV_ID_SPT_2, MEI_ME_PCH8_CFG)}, |
89 | {MEI_PCI_DEVICE(MEI_DEV_ID_SPT_H, MEI_ME_PCH8_SPS_CFG)}, | 89 | {MEI_PCI_DEVICE(MEI_DEV_ID_SPT_H, MEI_ME_PCH8_SPS_CFG)}, |
90 | {MEI_PCI_DEVICE(MEI_DEV_ID_SPT_H_2, MEI_ME_PCH8_SPS_CFG)}, | 90 | {MEI_PCI_DEVICE(MEI_DEV_ID_SPT_H_2, MEI_ME_PCH8_SPS_CFG)}, |
91 | {MEI_PCI_DEVICE(MEI_DEV_ID_LBG, MEI_ME_PCH8_CFG)}, | 91 | {MEI_PCI_DEVICE(MEI_DEV_ID_LBG, MEI_ME_PCH12_CFG)}, |
92 | 92 | ||
93 | {MEI_PCI_DEVICE(MEI_DEV_ID_BXT_M, MEI_ME_PCH8_CFG)}, | 93 | {MEI_PCI_DEVICE(MEI_DEV_ID_BXT_M, MEI_ME_PCH8_CFG)}, |
94 | {MEI_PCI_DEVICE(MEI_DEV_ID_APL_I, MEI_ME_PCH8_CFG)}, | 94 | {MEI_PCI_DEVICE(MEI_DEV_ID_APL_I, MEI_ME_PCH8_CFG)}, |
95 | 95 | ||
96 | {MEI_PCI_DEVICE(MEI_DEV_ID_DNV_IE, MEI_ME_PCH8_CFG)}, | ||
97 | |||
96 | {MEI_PCI_DEVICE(MEI_DEV_ID_GLK, MEI_ME_PCH8_CFG)}, | 98 | {MEI_PCI_DEVICE(MEI_DEV_ID_GLK, MEI_ME_PCH8_CFG)}, |
97 | 99 | ||
98 | {MEI_PCI_DEVICE(MEI_DEV_ID_KBP, MEI_ME_PCH8_CFG)}, | 100 | {MEI_PCI_DEVICE(MEI_DEV_ID_KBP, MEI_ME_PCH8_CFG)}, |
diff --git a/drivers/misc/pvpanic.c b/drivers/misc/pvpanic.c index 595ac065b401..95ff7c5a1dfb 100644 --- a/drivers/misc/pvpanic.c +++ b/drivers/misc/pvpanic.c | |||
@@ -70,8 +70,12 @@ pvpanic_walk_resources(struct acpi_resource *res, void *context) | |||
70 | struct resource r; | 70 | struct resource r; |
71 | 71 | ||
72 | if (acpi_dev_resource_io(res, &r)) { | 72 | if (acpi_dev_resource_io(res, &r)) { |
73 | #ifdef CONFIG_HAS_IOPORT_MAP | ||
73 | base = ioport_map(r.start, resource_size(&r)); | 74 | base = ioport_map(r.start, resource_size(&r)); |
74 | return AE_OK; | 75 | return AE_OK; |
76 | #else | ||
77 | return AE_ERROR; | ||
78 | #endif | ||
75 | } else if (acpi_dev_resource_memory(res, &r)) { | 79 | } else if (acpi_dev_resource_memory(res, &r)) { |
76 | base = ioremap(r.start, resource_size(&r)); | 80 | base = ioremap(r.start, resource_size(&r)); |
77 | return AE_OK; | 81 | return AE_OK; |