Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-2.0-only
2 : : /*
3 : : * fs/kernfs/file.c - kernfs file implementation
4 : : *
5 : : * Copyright (c) 2001-3 Patrick Mochel
6 : : * Copyright (c) 2007 SUSE Linux Products GmbH
7 : : * Copyright (c) 2007, 2013 Tejun Heo <tj@kernel.org>
8 : : */
9 : :
10 : : #include <linux/fs.h>
11 : : #include <linux/seq_file.h>
12 : : #include <linux/slab.h>
13 : : #include <linux/poll.h>
14 : : #include <linux/pagemap.h>
15 : : #include <linux/sched/mm.h>
16 : : #include <linux/fsnotify.h>
17 : :
18 : : #include "kernfs-internal.h"
19 : :
20 : : /*
21 : : * There's one kernfs_open_file for each open file and one kernfs_open_node
22 : : * for each kernfs_node with one or more open files.
23 : : *
24 : : * kernfs_node->attr.open points to kernfs_open_node. attr.open is
25 : : * protected by kernfs_open_node_lock.
26 : : *
27 : : * filp->private_data points to seq_file whose ->private points to
28 : : * kernfs_open_file. kernfs_open_files are chained at
29 : : * kernfs_open_node->files, which is protected by kernfs_open_file_mutex.
30 : : */
31 : : static DEFINE_SPINLOCK(kernfs_open_node_lock);
32 : : static DEFINE_MUTEX(kernfs_open_file_mutex);
33 : :
34 : : struct kernfs_open_node {
35 : : atomic_t refcnt;
36 : : atomic_t event;
37 : : wait_queue_head_t poll;
38 : : struct list_head files; /* goes through kernfs_open_file.list */
39 : : };
40 : :
41 : : /*
42 : : * kernfs_notify() may be called from any context and bounces notifications
43 : : * through a work item. To minimize space overhead in kernfs_node, the
44 : : * pending queue is implemented as a singly linked list of kernfs_nodes.
45 : : * The list is terminated with the self pointer so that whether a
46 : : * kernfs_node is on the list or not can be determined by testing the next
47 : : * pointer for NULL.
48 : : */
49 : : #define KERNFS_NOTIFY_EOL ((void *)&kernfs_notify_list)
50 : :
51 : : static DEFINE_SPINLOCK(kernfs_notify_lock);
52 : : static struct kernfs_node *kernfs_notify_list = KERNFS_NOTIFY_EOL;
53 : :
54 : 52187 : static struct kernfs_open_file *kernfs_of(struct file *file)
55 : : {
56 : 52187 : return ((struct seq_file *)file->private_data)->private;
57 : : }
58 : :
59 : : /*
60 : : * Determine the kernfs_ops for the given kernfs_node. This function must
61 : : * be called while holding an active reference.
62 : : */
63 : 93465 : static const struct kernfs_ops *kernfs_ops(struct kernfs_node *kn)
64 : : {
65 : 93465 : if (kn->flags & KERNFS_LOCKDEP)
66 : 93465 : lockdep_assert_held(kn);
67 : 93465 : return kn->attr.ops;
68 : : }
69 : :
70 : : /*
71 : : * As kernfs_seq_stop() is also called after kernfs_seq_start() or
72 : : * kernfs_seq_next() failure, it needs to distinguish whether it's stopping
73 : : * a seq_file iteration which is fully initialized with an active reference
74 : : * or an aborted kernfs_seq_start() due to get_active failure. The
75 : : * position pointer is the only context for each seq_file iteration and
76 : : * thus the stop condition should be encoded in it. As the return value is
77 : : * directly visible to userland, ERR_PTR(-ENODEV) is the only acceptable
78 : : * choice to indicate get_active failure.
79 : : *
80 : : * Unfortunately, this is complicated due to the optional custom seq_file
81 : : * operations which may return ERR_PTR(-ENODEV) too. kernfs_seq_stop()
82 : : * can't distinguish whether ERR_PTR(-ENODEV) is from get_active failure or
83 : : * custom seq_file operations and thus can't decide whether put_active
84 : : * should be performed or not only on ERR_PTR(-ENODEV).
85 : : *
86 : : * This is worked around by factoring out the custom seq_stop() and
87 : : * put_active part into kernfs_seq_stop_active(), skipping it from
88 : : * kernfs_seq_stop() if ERR_PTR(-ENODEV) while invoking it directly after
89 : : * custom seq_file operations fail with ERR_PTR(-ENODEV) - this ensures
90 : : * that kernfs_seq_stop_active() is skipped only after get_active failure.
91 : : */
92 : 21657 : static void kernfs_seq_stop_active(struct seq_file *sf, void *v)
93 : : {
94 : 21657 : struct kernfs_open_file *of = sf->private;
95 : 21657 : const struct kernfs_ops *ops = kernfs_ops(of->kn);
96 : :
97 [ + + ]: 21657 : if (ops->seq_stop)
98 : 377 : ops->seq_stop(sf, v);
99 : 21657 : kernfs_put_active(of->kn);
100 : 21657 : }
101 : :
102 : 21657 : static void *kernfs_seq_start(struct seq_file *sf, loff_t *ppos)
103 : : {
104 : 21657 : struct kernfs_open_file *of = sf->private;
105 : 21657 : const struct kernfs_ops *ops;
106 : :
107 : : /*
108 : : * @of->mutex nests outside active ref and is primarily to ensure that
109 : : * the ops aren't called concurrently for the same open file.
110 : : */
111 : 21657 : mutex_lock(&of->mutex);
112 [ + - ]: 21657 : if (!kernfs_get_active(of->kn))
113 : : return ERR_PTR(-ENODEV);
114 : :
115 : 21657 : ops = kernfs_ops(of->kn);
116 [ + + ]: 21657 : if (ops->seq_start) {
117 : 377 : void *next = ops->seq_start(sf, ppos);
118 : : /* see the comment above kernfs_seq_stop_active() */
119 [ - + ]: 377 : if (next == ERR_PTR(-ENODEV))
120 : 0 : kernfs_seq_stop_active(sf, next);
121 : 377 : return next;
122 : : } else {
123 : : /*
124 : : * The same behavior and code as single_open(). Returns
125 : : * !NULL if pos is at the beginning; otherwise, NULL.
126 : : */
127 [ + + ]: 21280 : return NULL + !*ppos;
128 : : }
129 : : }
130 : :
131 : 12900 : static void *kernfs_seq_next(struct seq_file *sf, void *v, loff_t *ppos)
132 : : {
133 : 12900 : struct kernfs_open_file *of = sf->private;
134 : 12900 : const struct kernfs_ops *ops = kernfs_ops(of->kn);
135 : :
136 [ + + ]: 12900 : if (ops->seq_next) {
137 : 557 : void *next = ops->seq_next(sf, v, ppos);
138 : : /* see the comment above kernfs_seq_stop_active() */
139 [ - + ]: 557 : if (next == ERR_PTR(-ENODEV))
140 : 0 : kernfs_seq_stop_active(sf, next);
141 : 557 : return next;
142 : : } else {
143 : : /*
144 : : * The same behavior and code as single_open(), always
145 : : * terminate after the initial read.
146 : : */
147 : 12343 : ++*ppos;
148 : 12343 : return NULL;
149 : : }
150 : : }
151 : :
152 : 21657 : static void kernfs_seq_stop(struct seq_file *sf, void *v)
153 : : {
154 : 21657 : struct kernfs_open_file *of = sf->private;
155 : :
156 [ + - ]: 21657 : if (v != ERR_PTR(-ENODEV))
157 : 21657 : kernfs_seq_stop_active(sf, v);
158 : 21657 : mutex_unlock(&of->mutex);
159 : 21657 : }
160 : :
161 : 12952 : static int kernfs_seq_show(struct seq_file *sf, void *v)
162 : : {
163 : 12952 : struct kernfs_open_file *of = sf->private;
164 : :
165 : 12952 : of->event = atomic_read(&of->kn->attr.open->event);
166 : :
167 : 12952 : return of->kn->attr.ops->seq_show(sf, v);
168 : : }
169 : :
170 : : static const struct seq_operations kernfs_seq_ops = {
171 : : .start = kernfs_seq_start,
172 : : .next = kernfs_seq_next,
173 : : .stop = kernfs_seq_stop,
174 : : .show = kernfs_seq_show,
175 : : };
176 : :
177 : : /*
178 : : * As reading a bin file can have side-effects, the exact offset and bytes
179 : : * specified in read(2) call should be passed to the read callback making
180 : : * it difficult to use seq_file. Implement simplistic custom buffering for
181 : : * bin files.
182 : : */
183 : 26 : static ssize_t kernfs_file_direct_read(struct kernfs_open_file *of,
184 : : char __user *user_buf, size_t count,
185 : : loff_t *ppos)
186 : : {
187 : 26 : ssize_t len = min_t(size_t, count, PAGE_SIZE);
188 : 26 : const struct kernfs_ops *ops;
189 : 26 : char *buf;
190 : :
191 : 26 : buf = of->prealloc_buf;
192 [ + - ]: 26 : if (buf)
193 : 26 : mutex_lock(&of->prealloc_mutex);
194 : : else
195 [ # # ]: 0 : buf = kmalloc(len, GFP_KERNEL);
196 [ + - ]: 26 : if (!buf)
197 : : return -ENOMEM;
198 : :
199 : : /*
200 : : * @of->mutex nests outside active ref and is used both to ensure that
201 : : * the ops aren't called concurrently for the same open file.
202 : : */
203 : 26 : mutex_lock(&of->mutex);
204 [ - + ]: 26 : if (!kernfs_get_active(of->kn)) {
205 : 0 : len = -ENODEV;
206 : 0 : mutex_unlock(&of->mutex);
207 : 0 : goto out_free;
208 : : }
209 : :
210 : 26 : of->event = atomic_read(&of->kn->attr.open->event);
211 : 26 : ops = kernfs_ops(of->kn);
212 [ + - ]: 26 : if (ops->read)
213 : 26 : len = ops->read(of, buf, len, *ppos);
214 : : else
215 : : len = -EINVAL;
216 : :
217 : 26 : kernfs_put_active(of->kn);
218 : 26 : mutex_unlock(&of->mutex);
219 : :
220 [ - + ]: 26 : if (len < 0)
221 : 0 : goto out_free;
222 : :
223 [ - + - + ]: 52 : if (copy_to_user(user_buf, buf, len)) {
224 : 0 : len = -EFAULT;
225 : 0 : goto out_free;
226 : : }
227 : :
228 : 26 : *ppos += len;
229 : :
230 : 26 : out_free:
231 [ + - ]: 26 : if (buf == of->prealloc_buf)
232 : 26 : mutex_unlock(&of->prealloc_mutex);
233 : : else
234 : 0 : kfree(buf);
235 : : return len;
236 : : }
237 : :
238 : : /**
239 : : * kernfs_fop_read - kernfs vfs read callback
240 : : * @file: file pointer
241 : : * @user_buf: data to write
242 : : * @count: number of bytes
243 : : * @ppos: starting offset
244 : : */
245 : 21683 : static ssize_t kernfs_fop_read(struct file *file, char __user *user_buf,
246 : : size_t count, loff_t *ppos)
247 : : {
248 : 21683 : struct kernfs_open_file *of = kernfs_of(file);
249 : :
250 [ + + ]: 21683 : if (of->kn->flags & KERNFS_HAS_SEQ_SHOW)
251 : 21657 : return seq_read(file, user_buf, count, ppos);
252 : : else
253 : 26 : return kernfs_file_direct_read(of, user_buf, count, ppos);
254 : : }
255 : :
256 : : /**
257 : : * kernfs_fop_write - kernfs vfs write callback
258 : : * @file: file pointer
259 : : * @user_buf: data to write
260 : : * @count: number of bytes
261 : : * @ppos: starting offset
262 : : *
263 : : * Copy data in from userland and pass it to the matching kernfs write
264 : : * operation.
265 : : *
266 : : * There is no easy way for us to know if userspace is only doing a partial
267 : : * write, so we don't support them. We expect the entire buffer to come on
268 : : * the first write. Hint: if you're writing a value, first read the file,
269 : : * modify only the the value you're changing, then write entire buffer
270 : : * back.
271 : : */
272 : 8866 : static ssize_t kernfs_fop_write(struct file *file, const char __user *user_buf,
273 : : size_t count, loff_t *ppos)
274 : : {
275 : 8866 : struct kernfs_open_file *of = kernfs_of(file);
276 : 8866 : const struct kernfs_ops *ops;
277 : 8866 : ssize_t len;
278 : 8866 : char *buf;
279 : :
280 [ + + ]: 8866 : if (of->atomic_write_len) {
281 : 1846 : len = count;
282 [ + - ]: 1846 : if (len > of->atomic_write_len)
283 : : return -E2BIG;
284 : : } else {
285 : 7020 : len = min_t(size_t, count, PAGE_SIZE);
286 : : }
287 : :
288 : 8866 : buf = of->prealloc_buf;
289 [ - + ]: 8866 : if (buf)
290 : 0 : mutex_lock(&of->prealloc_mutex);
291 : : else
292 [ - + ]: 8866 : buf = kmalloc(len + 1, GFP_KERNEL);
293 [ + - ]: 8866 : if (!buf)
294 : : return -ENOMEM;
295 : :
296 [ - + - + ]: 17732 : if (copy_from_user(buf, user_buf, len)) {
297 : 0 : len = -EFAULT;
298 : 0 : goto out_free;
299 : : }
300 : 8866 : buf[len] = '\0'; /* guarantee string termination */
301 : :
302 : : /*
303 : : * @of->mutex nests outside active ref and is used both to ensure that
304 : : * the ops aren't called concurrently for the same open file.
305 : : */
306 : 8866 : mutex_lock(&of->mutex);
307 [ - + ]: 8866 : if (!kernfs_get_active(of->kn)) {
308 : 0 : mutex_unlock(&of->mutex);
309 : 0 : len = -ENODEV;
310 : 0 : goto out_free;
311 : : }
312 : :
313 : 8866 : ops = kernfs_ops(of->kn);
314 [ + - ]: 8866 : if (ops->write)
315 : 8866 : len = ops->write(of, buf, len, *ppos);
316 : : else
317 : : len = -EINVAL;
318 : :
319 : 8866 : kernfs_put_active(of->kn);
320 : 8866 : mutex_unlock(&of->mutex);
321 : :
322 [ - + ]: 8866 : if (len > 0)
323 : 8866 : *ppos += len;
324 : :
325 : 0 : out_free:
326 [ - + ]: 8866 : if (buf == of->prealloc_buf)
327 : 0 : mutex_unlock(&of->prealloc_mutex);
328 : : else
329 : 8866 : kfree(buf);
330 : : return len;
331 : : }
332 : :
333 : 0 : static void kernfs_vma_open(struct vm_area_struct *vma)
334 : : {
335 : 0 : struct file *file = vma->vm_file;
336 : 0 : struct kernfs_open_file *of = kernfs_of(file);
337 : :
338 [ # # ]: 0 : if (!of->vm_ops)
339 : : return;
340 : :
341 [ # # ]: 0 : if (!kernfs_get_active(of->kn))
342 : : return;
343 : :
344 [ # # ]: 0 : if (of->vm_ops->open)
345 : 0 : of->vm_ops->open(vma);
346 : :
347 : 0 : kernfs_put_active(of->kn);
348 : : }
349 : :
350 : 0 : static vm_fault_t kernfs_vma_fault(struct vm_fault *vmf)
351 : : {
352 : 0 : struct file *file = vmf->vma->vm_file;
353 : 0 : struct kernfs_open_file *of = kernfs_of(file);
354 : 0 : vm_fault_t ret;
355 : :
356 [ # # ]: 0 : if (!of->vm_ops)
357 : : return VM_FAULT_SIGBUS;
358 : :
359 [ # # ]: 0 : if (!kernfs_get_active(of->kn))
360 : : return VM_FAULT_SIGBUS;
361 : :
362 : 0 : ret = VM_FAULT_SIGBUS;
363 [ # # ]: 0 : if (of->vm_ops->fault)
364 : 0 : ret = of->vm_ops->fault(vmf);
365 : :
366 : 0 : kernfs_put_active(of->kn);
367 : 0 : return ret;
368 : : }
369 : :
370 : 0 : static vm_fault_t kernfs_vma_page_mkwrite(struct vm_fault *vmf)
371 : : {
372 : 0 : struct file *file = vmf->vma->vm_file;
373 : 0 : struct kernfs_open_file *of = kernfs_of(file);
374 : 0 : vm_fault_t ret;
375 : :
376 [ # # ]: 0 : if (!of->vm_ops)
377 : : return VM_FAULT_SIGBUS;
378 : :
379 [ # # ]: 0 : if (!kernfs_get_active(of->kn))
380 : : return VM_FAULT_SIGBUS;
381 : :
382 : 0 : ret = 0;
383 [ # # ]: 0 : if (of->vm_ops->page_mkwrite)
384 : 0 : ret = of->vm_ops->page_mkwrite(vmf);
385 : : else
386 : 0 : file_update_time(file);
387 : :
388 : 0 : kernfs_put_active(of->kn);
389 : 0 : return ret;
390 : : }
391 : :
392 : 0 : static int kernfs_vma_access(struct vm_area_struct *vma, unsigned long addr,
393 : : void *buf, int len, int write)
394 : : {
395 : 0 : struct file *file = vma->vm_file;
396 : 0 : struct kernfs_open_file *of = kernfs_of(file);
397 : 0 : int ret;
398 : :
399 [ # # ]: 0 : if (!of->vm_ops)
400 : : return -EINVAL;
401 : :
402 [ # # ]: 0 : if (!kernfs_get_active(of->kn))
403 : : return -EINVAL;
404 : :
405 : 0 : ret = -EINVAL;
406 [ # # ]: 0 : if (of->vm_ops->access)
407 : 0 : ret = of->vm_ops->access(vma, addr, buf, len, write);
408 : :
409 : 0 : kernfs_put_active(of->kn);
410 : 0 : return ret;
411 : : }
412 : :
413 : : #ifdef CONFIG_NUMA
414 : 0 : static int kernfs_vma_set_policy(struct vm_area_struct *vma,
415 : : struct mempolicy *new)
416 : : {
417 : 0 : struct file *file = vma->vm_file;
418 : 0 : struct kernfs_open_file *of = kernfs_of(file);
419 : 0 : int ret;
420 : :
421 [ # # ]: 0 : if (!of->vm_ops)
422 : : return 0;
423 : :
424 [ # # ]: 0 : if (!kernfs_get_active(of->kn))
425 : : return -EINVAL;
426 : :
427 : 0 : ret = 0;
428 [ # # ]: 0 : if (of->vm_ops->set_policy)
429 : 0 : ret = of->vm_ops->set_policy(vma, new);
430 : :
431 : 0 : kernfs_put_active(of->kn);
432 : 0 : return ret;
433 : : }
434 : :
435 : 0 : static struct mempolicy *kernfs_vma_get_policy(struct vm_area_struct *vma,
436 : : unsigned long addr)
437 : : {
438 : 0 : struct file *file = vma->vm_file;
439 : 0 : struct kernfs_open_file *of = kernfs_of(file);
440 : 0 : struct mempolicy *pol;
441 : :
442 [ # # ]: 0 : if (!of->vm_ops)
443 : 0 : return vma->vm_policy;
444 : :
445 [ # # ]: 0 : if (!kernfs_get_active(of->kn))
446 : 0 : return vma->vm_policy;
447 : :
448 : 0 : pol = vma->vm_policy;
449 [ # # ]: 0 : if (of->vm_ops->get_policy)
450 : 0 : pol = of->vm_ops->get_policy(vma, addr);
451 : :
452 : 0 : kernfs_put_active(of->kn);
453 : 0 : return pol;
454 : : }
455 : :
456 : : #endif
457 : :
458 : : static const struct vm_operations_struct kernfs_vm_ops = {
459 : : .open = kernfs_vma_open,
460 : : .fault = kernfs_vma_fault,
461 : : .page_mkwrite = kernfs_vma_page_mkwrite,
462 : : .access = kernfs_vma_access,
463 : : #ifdef CONFIG_NUMA
464 : : .set_policy = kernfs_vma_set_policy,
465 : : .get_policy = kernfs_vma_get_policy,
466 : : #endif
467 : : };
468 : :
469 : 0 : static int kernfs_fop_mmap(struct file *file, struct vm_area_struct *vma)
470 : : {
471 : 0 : struct kernfs_open_file *of = kernfs_of(file);
472 : 0 : const struct kernfs_ops *ops;
473 : 0 : int rc;
474 : :
475 : : /*
476 : : * mmap path and of->mutex are prone to triggering spurious lockdep
477 : : * warnings and we don't want to add spurious locking dependency
478 : : * between the two. Check whether mmap is actually implemented
479 : : * without grabbing @of->mutex by testing HAS_MMAP flag. See the
480 : : * comment in kernfs_file_open() for more details.
481 : : */
482 [ # # ]: 0 : if (!(of->kn->flags & KERNFS_HAS_MMAP))
483 : : return -ENODEV;
484 : :
485 : 0 : mutex_lock(&of->mutex);
486 : :
487 : 0 : rc = -ENODEV;
488 [ # # ]: 0 : if (!kernfs_get_active(of->kn))
489 : 0 : goto out_unlock;
490 : :
491 : 0 : ops = kernfs_ops(of->kn);
492 : 0 : rc = ops->mmap(of, vma);
493 [ # # ]: 0 : if (rc)
494 : 0 : goto out_put;
495 : :
496 : : /*
497 : : * PowerPC's pci_mmap of legacy_mem uses shmem_zero_setup()
498 : : * to satisfy versions of X which crash if the mmap fails: that
499 : : * substitutes a new vm_file, and we don't then want bin_vm_ops.
500 : : */
501 [ # # ]: 0 : if (vma->vm_file != file)
502 : 0 : goto out_put;
503 : :
504 : 0 : rc = -EINVAL;
505 [ # # # # ]: 0 : if (of->mmapped && of->vm_ops != vma->vm_ops)
506 : 0 : goto out_put;
507 : :
508 : : /*
509 : : * It is not possible to successfully wrap close.
510 : : * So error if someone is trying to use close.
511 : : */
512 : 0 : rc = -EINVAL;
513 [ # # # # ]: 0 : if (vma->vm_ops && vma->vm_ops->close)
514 : 0 : goto out_put;
515 : :
516 : 0 : rc = 0;
517 : 0 : of->mmapped = true;
518 : 0 : of->vm_ops = vma->vm_ops;
519 : 0 : vma->vm_ops = &kernfs_vm_ops;
520 : 0 : out_put:
521 : 0 : kernfs_put_active(of->kn);
522 : 0 : out_unlock:
523 : 0 : mutex_unlock(&of->mutex);
524 : :
525 : 0 : return rc;
526 : : }
527 : :
528 : : /**
529 : : * kernfs_get_open_node - get or create kernfs_open_node
530 : : * @kn: target kernfs_node
531 : : * @of: kernfs_open_file for this instance of open
532 : : *
533 : : * If @kn->attr.open exists, increment its reference count; otherwise,
534 : : * create one. @of is chained to the files list.
535 : : *
536 : : * LOCKING:
537 : : * Kernel thread context (may sleep).
538 : : *
539 : : * RETURNS:
540 : : * 0 on success, -errno on failure.
541 : : */
542 : : static int kernfs_get_open_node(struct kernfs_node *kn,
543 : : struct kernfs_open_file *of)
544 : : {
545 : : struct kernfs_open_node *on, *new_on = NULL;
546 : :
547 : : retry:
548 : : mutex_lock(&kernfs_open_file_mutex);
549 : : spin_lock_irq(&kernfs_open_node_lock);
550 : :
551 : : if (!kn->attr.open && new_on) {
552 : : kn->attr.open = new_on;
553 : : new_on = NULL;
554 : : }
555 : :
556 : : on = kn->attr.open;
557 : : if (on) {
558 : : atomic_inc(&on->refcnt);
559 : : list_add_tail(&of->list, &on->files);
560 : : }
561 : :
562 : : spin_unlock_irq(&kernfs_open_node_lock);
563 : : mutex_unlock(&kernfs_open_file_mutex);
564 : :
565 : : if (on) {
566 : : kfree(new_on);
567 : : return 0;
568 : : }
569 : :
570 : : /* not there, initialize a new one and retry */
571 : : new_on = kmalloc(sizeof(*new_on), GFP_KERNEL);
572 : : if (!new_on)
573 : : return -ENOMEM;
574 : :
575 : : atomic_set(&new_on->refcnt, 0);
576 : : atomic_set(&new_on->event, 1);
577 : : init_waitqueue_head(&new_on->poll);
578 : : INIT_LIST_HEAD(&new_on->files);
579 : : goto retry;
580 : : }
581 : :
582 : : /**
583 : : * kernfs_put_open_node - put kernfs_open_node
584 : : * @kn: target kernfs_nodet
585 : : * @of: associated kernfs_open_file
586 : : *
587 : : * Put @kn->attr.open and unlink @of from the files list. If
588 : : * reference count reaches zero, disassociate and free it.
589 : : *
590 : : * LOCKING:
591 : : * None.
592 : : */
593 : : static void kernfs_put_open_node(struct kernfs_node *kn,
594 : : struct kernfs_open_file *of)
595 : : {
596 : : struct kernfs_open_node *on = kn->attr.open;
597 : : unsigned long flags;
598 : :
599 : : mutex_lock(&kernfs_open_file_mutex);
600 : : spin_lock_irqsave(&kernfs_open_node_lock, flags);
601 : :
602 : : if (of)
603 : : list_del(&of->list);
604 : :
605 : : if (atomic_dec_and_test(&on->refcnt))
606 : : kn->attr.open = NULL;
607 : : else
608 : : on = NULL;
609 : :
610 : : spin_unlock_irqrestore(&kernfs_open_node_lock, flags);
611 : : mutex_unlock(&kernfs_open_file_mutex);
612 : :
613 : : kfree(on);
614 : : }
615 : :
616 : 28359 : static int kernfs_fop_open(struct inode *inode, struct file *file)
617 : : {
618 : 28359 : struct kernfs_node *kn = inode->i_private;
619 [ + - ]: 28359 : struct kernfs_root *root = kernfs_root(kn);
620 : 28359 : const struct kernfs_ops *ops;
621 : 28359 : struct kernfs_open_file *of;
622 : 28359 : bool has_read, has_write, has_mmap;
623 : 28359 : int error = -EACCES;
624 : :
625 [ + - ]: 28359 : if (!kernfs_get_active(kn))
626 : : return -ENODEV;
627 : :
628 : 28359 : ops = kernfs_ops(kn);
629 : :
630 [ + + - + : 28359 : has_read = ops->seq_show || ops->read || ops->mmap;
- - ]
631 [ - + - - ]: 28359 : has_write = ops->write || ops->mmap;
632 : 28359 : has_mmap = ops->mmap;
633 : :
634 : : /* see the flag definition for details */
635 [ + + ]: 28359 : if (root->flags & KERNFS_ROOT_EXTRA_OPEN_PERM_CHECK) {
636 [ + + ]: 25773 : if ((file->f_mode & FMODE_WRITE) &&
637 [ + - - + ]: 7020 : (!(inode->i_mode & S_IWUGO) || !has_write))
638 : 0 : goto err_out;
639 : :
640 [ + + ]: 25773 : if ((file->f_mode & FMODE_READ) &&
641 [ + + - + ]: 18753 : (!(inode->i_mode & S_IRUGO) || !has_read))
642 : 6721 : goto err_out;
643 : : }
644 : :
645 : : /* allocate a kernfs_open_file for the file */
646 : 21638 : error = -ENOMEM;
647 : 21638 : of = kzalloc(sizeof(struct kernfs_open_file), GFP_KERNEL);
648 [ - + ]: 21638 : if (!of)
649 : 0 : goto err_out;
650 : :
651 : : /*
652 : : * The following is done to give a different lockdep key to
653 : : * @of->mutex for files which implement mmap. This is a rather
654 : : * crude way to avoid false positive lockdep warning around
655 : : * mm->mmap_sem - mmap nests @of->mutex under mm->mmap_sem and
656 : : * reading /sys/block/sda/trace/act_mask grabs sr_mutex, under
657 : : * which mm->mmap_sem nests, while holding @of->mutex. As each
658 : : * open file has a separate mutex, it's okay as long as those don't
659 : : * happen on the same file. At this point, we can't easily give
660 : : * each file a separate locking class. Let's differentiate on
661 : : * whether the file has mmap or not for now.
662 : : *
663 : : * Both paths of the branch look the same. They're supposed to
664 : : * look that way and give @of->mutex different static lockdep keys.
665 : : */
666 [ - + ]: 21638 : if (has_mmap)
667 : 0 : mutex_init(&of->mutex);
668 : : else
669 : 21638 : mutex_init(&of->mutex);
670 : :
671 : 21638 : of->kn = kn;
672 : 21638 : of->file = file;
673 : :
674 : : /*
675 : : * Write path needs to atomic_write_len outside active reference.
676 : : * Cache it in open_file. See kernfs_fop_write() for details.
677 : : */
678 : 21638 : of->atomic_write_len = ops->atomic_write_len;
679 : :
680 : 21638 : error = -EINVAL;
681 : : /*
682 : : * ->seq_show is incompatible with ->prealloc,
683 : : * as seq_read does its own allocation.
684 : : * ->read must be used instead.
685 : : */
686 [ + + - + ]: 21638 : if (ops->prealloc && ops->seq_show)
687 : 0 : goto err_free;
688 [ + + ]: 21638 : if (ops->prealloc) {
689 [ - + ]: 13 : int len = of->atomic_write_len ?: PAGE_SIZE;
690 [ + - ]: 13 : of->prealloc_buf = kmalloc(len + 1, GFP_KERNEL);
691 : 13 : error = -ENOMEM;
692 [ - + ]: 13 : if (!of->prealloc_buf)
693 : 0 : goto err_free;
694 : 13 : mutex_init(&of->prealloc_mutex);
695 : : }
696 : :
697 : : /*
698 : : * Always instantiate seq_file even if read access doesn't use
699 : : * seq_file or is not requested. This unifies private data access
700 : : * and readable regular files are the vast majority anyway.
701 : : */
702 [ + + ]: 21638 : if (ops->seq_show)
703 : 21625 : error = seq_open(file, &kernfs_seq_ops);
704 : : else
705 : 13 : error = seq_open(file, NULL);
706 [ - + ]: 21638 : if (error)
707 : 0 : goto err_free;
708 : :
709 : 21638 : of->seq_file = file->private_data;
710 : 21638 : of->seq_file->private = of;
711 : :
712 : : /* seq_file clears PWRITE unconditionally, restore it if WRITE */
713 [ + + ]: 21638 : if (file->f_mode & FMODE_WRITE)
714 : 8866 : file->f_mode |= FMODE_PWRITE;
715 : :
716 : : /* make sure we have open node struct */
717 : 21638 : error = kernfs_get_open_node(kn, of);
718 [ - + ]: 21638 : if (error)
719 : 0 : goto err_seq_release;
720 : :
721 [ + + ]: 21638 : if (ops->open) {
722 : : /* nobody has access to @of yet, skip @of->mutex */
723 : 2586 : error = ops->open(of);
724 [ - + ]: 2586 : if (error)
725 : 0 : goto err_put_node;
726 : : }
727 : :
728 : : /* open succeeded, put active references */
729 : 21638 : kernfs_put_active(kn);
730 : 21638 : return 0;
731 : :
732 : : err_put_node:
733 : 0 : kernfs_put_open_node(kn, of);
734 : 0 : err_seq_release:
735 : 0 : seq_release(inode, file);
736 : 0 : err_free:
737 : 0 : kfree(of->prealloc_buf);
738 : 0 : kfree(of);
739 : 6721 : err_out:
740 : 6721 : kernfs_put_active(kn);
741 : 6721 : return error;
742 : : }
743 : :
744 : : /* used from release/drain to ensure that ->release() is called exactly once */
745 : 2586 : static void kernfs_release_file(struct kernfs_node *kn,
746 : : struct kernfs_open_file *of)
747 : : {
748 : : /*
749 : : * @of is guaranteed to have no other file operations in flight and
750 : : * we just want to synchronize release and drain paths.
751 : : * @kernfs_open_file_mutex is enough. @of->mutex can't be used
752 : : * here because drain path may be called from places which can
753 : : * cause circular dependency.
754 : : */
755 : 2586 : lockdep_assert_held(&kernfs_open_file_mutex);
756 : :
757 : 2586 : if (!of->released) {
758 : : /*
759 : : * A file is never detached without being released and we
760 : : * need to be able to release files which are deactivated
761 : : * and being drained. Don't use kernfs_ops().
762 : : */
763 : 2586 : kn->attr.ops->release(of);
764 : 2586 : of->released = true;
765 : : }
766 : : }
767 : :
768 : 21638 : static int kernfs_fop_release(struct inode *inode, struct file *filp)
769 : : {
770 : 21638 : struct kernfs_node *kn = inode->i_private;
771 : 21638 : struct kernfs_open_file *of = kernfs_of(filp);
772 : :
773 [ + + ]: 21638 : if (kn->flags & KERNFS_HAS_RELEASE) {
774 : 2586 : mutex_lock(&kernfs_open_file_mutex);
775 [ + - ]: 2586 : kernfs_release_file(kn, of);
776 : 2586 : mutex_unlock(&kernfs_open_file_mutex);
777 : : }
778 : :
779 : 21638 : kernfs_put_open_node(kn, of);
780 : 21638 : seq_release(inode, filp);
781 : 21638 : kfree(of->prealloc_buf);
782 : 21638 : kfree(of);
783 : :
784 : 21638 : return 0;
785 : : }
786 : :
787 : 28275 : void kernfs_drain_open_files(struct kernfs_node *kn)
788 : : {
789 : 28275 : struct kernfs_open_node *on;
790 : 28275 : struct kernfs_open_file *of;
791 : :
792 [ + + ]: 28275 : if (!(kn->flags & (KERNFS_HAS_MMAP | KERNFS_HAS_RELEASE)))
793 : : return;
794 : :
795 : 2756 : spin_lock_irq(&kernfs_open_node_lock);
796 : 2756 : on = kn->attr.open;
797 [ - + ]: 2756 : if (on)
798 : 0 : atomic_inc(&on->refcnt);
799 : 2756 : spin_unlock_irq(&kernfs_open_node_lock);
800 [ - + ]: 2756 : if (!on)
801 : : return;
802 : :
803 : 0 : mutex_lock(&kernfs_open_file_mutex);
804 : :
805 [ # # ]: 0 : list_for_each_entry(of, &on->files, list) {
806 [ # # ]: 0 : struct inode *inode = file_inode(of->file);
807 : :
808 [ # # ]: 0 : if (kn->flags & KERNFS_HAS_MMAP)
809 : 0 : unmap_mapping_range(inode->i_mapping, 0, 0, 1);
810 : :
811 [ # # ]: 0 : if (kn->flags & KERNFS_HAS_RELEASE)
812 [ # # ]: 0 : kernfs_release_file(kn, of);
813 : : }
814 : :
815 : 0 : mutex_unlock(&kernfs_open_file_mutex);
816 : :
817 : 0 : kernfs_put_open_node(kn, NULL);
818 : : }
819 : :
820 : : /*
821 : : * Kernfs attribute files are pollable. The idea is that you read
822 : : * the content and then you use 'poll' or 'select' to wait for
823 : : * the content to change. When the content changes (assuming the
824 : : * manager for the kobject supports notification), poll will
825 : : * return EPOLLERR|EPOLLPRI, and select will return the fd whether
826 : : * it is waiting for read, write, or exceptions.
827 : : * Once poll/select indicates that the value has changed, you
828 : : * need to close and re-open the file, or seek to 0 and read again.
829 : : * Reminder: this only works for attributes which actively support
830 : : * it, and it is not possible to test an attribute from userspace
831 : : * to see if it supports poll (Neither 'poll' nor 'select' return
832 : : * an appropriate error code). When in doubt, set a suitable timeout value.
833 : : */
834 : 0 : __poll_t kernfs_generic_poll(struct kernfs_open_file *of, poll_table *wait)
835 : : {
836 [ # # ]: 0 : struct kernfs_node *kn = kernfs_dentry_node(of->file->f_path.dentry);
837 : 0 : struct kernfs_open_node *on = kn->attr.open;
838 : :
839 [ # # ]: 0 : poll_wait(of->file, &on->poll, wait);
840 : :
841 [ # # ]: 0 : if (of->event != atomic_read(&on->event))
842 : 0 : return DEFAULT_POLLMASK|EPOLLERR|EPOLLPRI;
843 : :
844 : : return DEFAULT_POLLMASK;
845 : : }
846 : :
847 : 0 : static __poll_t kernfs_fop_poll(struct file *filp, poll_table *wait)
848 : : {
849 : 0 : struct kernfs_open_file *of = kernfs_of(filp);
850 [ # # ]: 0 : struct kernfs_node *kn = kernfs_dentry_node(filp->f_path.dentry);
851 : 0 : __poll_t ret;
852 : :
853 [ # # ]: 0 : if (!kernfs_get_active(kn))
854 : : return DEFAULT_POLLMASK|EPOLLERR|EPOLLPRI;
855 : :
856 [ # # ]: 0 : if (kn->attr.ops->poll)
857 : 0 : ret = kn->attr.ops->poll(of, wait);
858 : : else
859 : 0 : ret = kernfs_generic_poll(of, wait);
860 : :
861 : 0 : kernfs_put_active(kn);
862 : 0 : return ret;
863 : : }
864 : :
865 : 663 : static void kernfs_notify_workfn(struct work_struct *work)
866 : : {
867 : 1341 : struct kernfs_node *kn;
868 : 1341 : struct kernfs_super_info *info;
869 : 1341 : repeat:
870 : : /* pop one off the notify_list */
871 : 1341 : spin_lock_irq(&kernfs_notify_lock);
872 : 1341 : kn = kernfs_notify_list;
873 [ + + ]: 1341 : if (kn == KERNFS_NOTIFY_EOL) {
874 : 663 : spin_unlock_irq(&kernfs_notify_lock);
875 : 663 : return;
876 : : }
877 : 678 : kernfs_notify_list = kn->attr.notify_next;
878 : 678 : kn->attr.notify_next = NULL;
879 : 678 : spin_unlock_irq(&kernfs_notify_lock);
880 : :
881 : : /* kick fsnotify */
882 : 678 : mutex_lock(&kernfs_mutex);
883 : :
884 [ + - + - : 3364 : list_for_each_entry(info, &kernfs_root(kn)->supers, node) {
+ + ]
885 : 665 : struct kernfs_node *parent;
886 : 665 : struct inode *inode;
887 : 665 : struct qstr name;
888 : :
889 : : /*
890 : : * We want fsnotify_modify() on @kn but as the
891 : : * modifications aren't originating from userland don't
892 : : * have the matching @file available. Look up the inodes
893 : : * and generate the events manually.
894 : : */
895 : 665 : inode = ilookup(info->sb, kernfs_ino(kn));
896 [ + + ]: 665 : if (!inode)
897 : 18 : continue;
898 : :
899 : 647 : name = (struct qstr)QSTR_INIT(kn->name, strlen(kn->name));
900 : 647 : parent = kernfs_get_parent(kn);
901 [ + - ]: 647 : if (parent) {
902 : 647 : struct inode *p_inode;
903 : :
904 : 647 : p_inode = ilookup(info->sb, kernfs_ino(parent));
905 [ + - ]: 647 : if (p_inode) {
906 : 647 : fsnotify(p_inode, FS_MODIFY | FS_EVENT_ON_CHILD,
907 : : inode, FSNOTIFY_EVENT_INODE, &name, 0);
908 : 647 : iput(p_inode);
909 : : }
910 : :
911 : 647 : kernfs_put(parent);
912 : : }
913 : :
914 : 647 : fsnotify(inode, FS_MODIFY, inode, FSNOTIFY_EVENT_INODE,
915 : : &name, 0);
916 : 647 : iput(inode);
917 : : }
918 : :
919 : 678 : mutex_unlock(&kernfs_mutex);
920 : 678 : kernfs_put(kn);
921 : 678 : goto repeat;
922 : : }
923 : :
924 : : /**
925 : : * kernfs_notify - notify a kernfs file
926 : : * @kn: file to notify
927 : : *
928 : : * Notify @kn such that poll(2) on @kn wakes up. Maybe be called from any
929 : : * context.
930 : : */
931 : 678 : void kernfs_notify(struct kernfs_node *kn)
932 : : {
933 : 678 : static DECLARE_WORK(kernfs_notify_work, kernfs_notify_workfn);
934 : 678 : unsigned long flags;
935 : 678 : struct kernfs_open_node *on;
936 : :
937 [ - + + - ]: 678 : if (WARN_ON(kernfs_type(kn) != KERNFS_FILE))
938 : : return;
939 : :
940 : : /* kick poll immediately */
941 : 678 : spin_lock_irqsave(&kernfs_open_node_lock, flags);
942 : 678 : on = kn->attr.open;
943 [ - + ]: 678 : if (on) {
944 : 0 : atomic_inc(&on->event);
945 : 0 : wake_up_interruptible(&on->poll);
946 : : }
947 : 678 : spin_unlock_irqrestore(&kernfs_open_node_lock, flags);
948 : :
949 : : /* schedule work to kick fsnotify */
950 : 678 : spin_lock_irqsave(&kernfs_notify_lock, flags);
951 [ + - ]: 678 : if (!kn->attr.notify_next) {
952 : 678 : kernfs_get(kn);
953 : 678 : kn->attr.notify_next = kernfs_notify_list;
954 : 678 : kernfs_notify_list = kn;
955 : 678 : schedule_work(&kernfs_notify_work);
956 : : }
957 : 678 : spin_unlock_irqrestore(&kernfs_notify_lock, flags);
958 : : }
959 : : EXPORT_SYMBOL_GPL(kernfs_notify);
960 : :
961 : : const struct file_operations kernfs_file_fops = {
962 : : .read = kernfs_fop_read,
963 : : .write = kernfs_fop_write,
964 : : .llseek = generic_file_llseek,
965 : : .mmap = kernfs_fop_mmap,
966 : : .open = kernfs_fop_open,
967 : : .release = kernfs_fop_release,
968 : : .poll = kernfs_fop_poll,
969 : : .fsync = noop_fsync,
970 : : };
971 : :
972 : : /**
973 : : * __kernfs_create_file - kernfs internal function to create a file
974 : : * @parent: directory to create the file in
975 : : * @name: name of the file
976 : : * @mode: mode of the file
977 : : * @uid: uid of the file
978 : : * @gid: gid of the file
979 : : * @size: size of the file
980 : : * @ops: kernfs operations for the file
981 : : * @priv: private data for the file
982 : : * @ns: optional namespace tag of the file
983 : : * @key: lockdep key for the file's active_ref, %NULL to disable lockdep
984 : : *
985 : : * Returns the created node on success, ERR_PTR() value on error.
986 : : */
987 : 188279 : struct kernfs_node *__kernfs_create_file(struct kernfs_node *parent,
988 : : const char *name,
989 : : umode_t mode, kuid_t uid, kgid_t gid,
990 : : loff_t size,
991 : : const struct kernfs_ops *ops,
992 : : void *priv, const void *ns,
993 : : struct lock_class_key *key)
994 : : {
995 : 188279 : struct kernfs_node *kn;
996 : 188279 : unsigned flags;
997 : 188279 : int rc;
998 : :
999 : 188279 : flags = KERNFS_FILE;
1000 : :
1001 : 188279 : kn = kernfs_new_node(parent, name, (mode & S_IALLUGO) | S_IFREG,
1002 : : uid, gid, flags);
1003 [ + - ]: 188279 : if (!kn)
1004 : : return ERR_PTR(-ENOMEM);
1005 : :
1006 : 188279 : kn->attr.ops = ops;
1007 : 188279 : kn->attr.size = size;
1008 : 188279 : kn->ns = ns;
1009 : 188279 : kn->priv = priv;
1010 : :
1011 : : #ifdef CONFIG_DEBUG_LOCK_ALLOC
1012 : : if (key) {
1013 : : lockdep_init_map(&kn->dep_map, "kn->count", key, 0);
1014 : : kn->flags |= KERNFS_LOCKDEP;
1015 : : }
1016 : : #endif
1017 : :
1018 : : /*
1019 : : * kn->attr.ops is accesible only while holding active ref. We
1020 : : * need to know whether some ops are implemented outside active
1021 : : * ref. Cache their existence in flags.
1022 : : */
1023 [ + + ]: 188279 : if (ops->seq_show)
1024 : 187577 : kn->flags |= KERNFS_HAS_SEQ_SHOW;
1025 [ + + ]: 188279 : if (ops->mmap)
1026 : 91 : kn->flags |= KERNFS_HAS_MMAP;
1027 [ + + ]: 188279 : if (ops->release)
1028 : 6578 : kn->flags |= KERNFS_HAS_RELEASE;
1029 : :
1030 : 188279 : rc = kernfs_add_one(kn);
1031 [ - + ]: 188279 : if (rc) {
1032 : 0 : kernfs_put(kn);
1033 : 0 : return ERR_PTR(rc);
1034 : : }
1035 : : return kn;
1036 : : }
|