Lines Matching +full:de +full:- +full:be
1 // SPDX-License-Identifier: GPL-2.0
35 struct proc_dir_entry *de; in proc_evict_inode() local
39 truncate_inode_pages_final(&inode->i_data); in proc_evict_inode()
43 if (ei->pid) { in proc_evict_inode()
45 ei->pid = NULL; in proc_evict_inode()
49 de = ei->pde; in proc_evict_inode()
50 if (de) { in proc_evict_inode()
51 pde_put(de); in proc_evict_inode()
52 ei->pde = NULL; in proc_evict_inode()
55 head = ei->sysctl; in proc_evict_inode()
57 RCU_INIT_POINTER(ei->sysctl, NULL); in proc_evict_inode()
72 ei->pid = NULL; in proc_alloc_inode()
73 ei->fd = 0; in proc_alloc_inode()
74 ei->op.proc_get_link = NULL; in proc_alloc_inode()
75 ei->pde = NULL; in proc_alloc_inode()
76 ei->sysctl = NULL; in proc_alloc_inode()
77 ei->sysctl_entry = NULL; in proc_alloc_inode()
78 INIT_HLIST_NODE(&ei->sibling_inodes); in proc_alloc_inode()
79 ei->ns_ops = NULL; in proc_alloc_inode()
80 return &ei->vfs_inode; in proc_alloc_inode()
92 inode_init_once(&ei->vfs_inode); in init_once()
128 hlist_del_init_rcu(&ei->sibling_inodes); in proc_invalidate_siblings_dcache()
131 inode = &ei->vfs_inode; in proc_invalidate_siblings_dcache()
132 sb = inode->i_sb; in proc_invalidate_siblings_dcache()
133 if ((sb != old_sb) && !atomic_inc_not_zero(&sb->s_active)) in proc_invalidate_siblings_dcache()
147 if (S_ISDIR(inode->i_mode)) { in proc_invalidate_siblings_dcache()
183 struct proc_fs_info *fs_info = proc_sb_info(root->d_sb); in proc_show_options()
185 if (!gid_eq(fs_info->pid_gid, GLOBAL_ROOT_GID)) in proc_show_options()
186 seq_printf(seq, ",gid=%u", from_kgid_munged(&init_user_ns, fs_info->pid_gid)); in proc_show_options()
187 if (fs_info->hide_pid != HIDEPID_OFF) in proc_show_options()
188 seq_printf(seq, ",hidepid=%s", hidepid2str(fs_info->hide_pid)); in proc_show_options()
189 if (fs_info->pidonly != PROC_PIDONLY_OFF) in proc_show_options()
204 enum {BIAS = -1U<<31};
208 return likely(atomic_inc_unless_negative(&pde->in_use)); in use_pde()
213 if (unlikely(atomic_dec_return(&pde->in_use) == BIAS)) in unuse_pde()
214 complete(pde->pde_unload_completion); in unuse_pde()
219 __releases(&pde->pde_unload_lock) in close_pdeo()
223 * ->release hook needs to be available at the right moment. in close_pdeo()
226 * "struct file" needs to be available at the right moment. in close_pdeo()
228 * Therefore, first process to enter this function does ->release() and in close_pdeo()
231 if (pdeo->closing) { in close_pdeo()
234 pdeo->c = &c; in close_pdeo()
235 spin_unlock(&pde->pde_unload_lock); in close_pdeo()
241 pdeo->closing = true; in close_pdeo()
242 spin_unlock(&pde->pde_unload_lock); in close_pdeo()
243 file = pdeo->file; in close_pdeo()
244 pde->proc_ops->proc_release(file_inode(file), file); in close_pdeo()
245 spin_lock(&pde->pde_unload_lock); in close_pdeo()
246 /* After ->release. */ in close_pdeo()
247 list_del(&pdeo->lh); in close_pdeo()
248 c = pdeo->c; in close_pdeo()
249 spin_unlock(&pde->pde_unload_lock); in close_pdeo()
256 void proc_entry_rundown(struct proc_dir_entry *de) in proc_entry_rundown() argument
260 de->pde_unload_completion = &c; in proc_entry_rundown()
261 if (atomic_add_return(BIAS, &de->in_use) != BIAS) in proc_entry_rundown()
264 /* ->pde_openers list can't grow from now on. */ in proc_entry_rundown()
266 spin_lock(&de->pde_unload_lock); in proc_entry_rundown()
267 while (!list_empty(&de->pde_openers)) { in proc_entry_rundown()
269 pdeo = list_first_entry(&de->pde_openers, struct pde_opener, lh); in proc_entry_rundown()
270 close_pdeo(de, pdeo); in proc_entry_rundown()
271 spin_lock(&de->pde_unload_lock); in proc_entry_rundown()
273 spin_unlock(&de->pde_unload_lock); in proc_entry_rundown()
279 loff_t rv = -EINVAL; in proc_reg_llseek()
282 return pde->proc_ops->proc_lseek(file, offset, whence); in proc_reg_llseek()
284 rv = pde->proc_ops->proc_lseek(file, offset, whence); in proc_reg_llseek()
292 struct proc_dir_entry *pde = PDE(file_inode(iocb->ki_filp)); in proc_reg_read_iter()
296 return pde->proc_ops->proc_read_iter(iocb, iter); in proc_reg_read_iter()
299 return -EIO; in proc_reg_read_iter()
300 ret = pde->proc_ops->proc_read_iter(iocb, iter); in proc_reg_read_iter()
309 read = pde->proc_ops->proc_read; in pde_read()
312 return -EIO; in pde_read()
318 ssize_t rv = -EIO; in proc_reg_read()
333 write = pde->proc_ops->proc_write; in pde_write()
336 return -EIO; in pde_write()
342 ssize_t rv = -EIO; in proc_reg_write()
357 poll = pde->proc_ops->proc_poll; in pde_poll()
381 ioctl = pde->proc_ops->proc_ioctl; in pde_ioctl()
384 return -ENOTTY; in pde_ioctl()
390 long rv = -ENOTTY; in proc_reg_unlocked_ioctl()
406 compat_ioctl = pde->proc_ops->proc_compat_ioctl; in pde_compat_ioctl()
409 return -ENOTTY; in pde_compat_ioctl()
415 long rv = -ENOTTY; in proc_reg_compat_ioctl()
430 mmap = pde->proc_ops->proc_mmap; in pde_mmap()
433 return -EIO; in pde_mmap()
439 int rv = -EIO; in proc_reg_mmap()
457 get_area = pde->proc_ops->proc_get_unmapped_area; in pde_get_unmapped_area()
460 get_area = current->mm->get_unmapped_area; in pde_get_unmapped_area()
473 unsigned long rv = -EIO; in proc_reg_get_unmapped_area()
493 open = pde->proc_ops->proc_open; in proc_reg_open()
501 * 1) PDE's ->release hook will be called no matter what in proc_reg_open()
502 * either normally by close()/->release, or forcefully by in proc_reg_open()
508 * Save every "struct file" with custom ->release hook. in proc_reg_open()
511 return -ENOENT; in proc_reg_open()
513 release = pde->proc_ops->proc_release; in proc_reg_open()
517 rv = -ENOMEM; in proc_reg_open()
522 open = pde->proc_ops->proc_open; in proc_reg_open()
529 pdeo->file = file; in proc_reg_open()
530 pdeo->closing = false; in proc_reg_open()
531 pdeo->c = NULL; in proc_reg_open()
532 spin_lock(&pde->pde_unload_lock); in proc_reg_open()
533 list_add(&pdeo->lh, &pde->pde_openers); in proc_reg_open()
534 spin_unlock(&pde->pde_unload_lock); in proc_reg_open()
552 release = pde->proc_ops->proc_release; in proc_reg_release()
559 spin_lock(&pde->pde_unload_lock); in proc_reg_release()
560 list_for_each_entry(pdeo, &pde->pde_openers, lh) { in proc_reg_release()
561 if (pdeo->file == file) { in proc_reg_release()
566 spin_unlock(&pde->pde_unload_lock); in proc_reg_release()
635 return ERR_PTR(-EINVAL); in proc_get_link()
637 return pde->data; in proc_get_link()
644 struct inode *proc_get_inode(struct super_block *sb, struct proc_dir_entry *de) in proc_get_inode() argument
649 pde_put(de); in proc_get_inode()
653 inode->i_ino = de->low_ino; in proc_get_inode()
654 inode->i_mtime = inode->i_atime = inode->i_ctime = current_time(inode); in proc_get_inode()
655 PROC_I(inode)->pde = de; in proc_get_inode()
656 if (is_empty_pde(de)) { in proc_get_inode()
661 if (de->mode) { in proc_get_inode()
662 inode->i_mode = de->mode; in proc_get_inode()
663 inode->i_uid = de->uid; in proc_get_inode()
664 inode->i_gid = de->gid; in proc_get_inode()
666 if (de->size) in proc_get_inode()
667 inode->i_size = de->size; in proc_get_inode()
668 if (de->nlink) in proc_get_inode()
669 set_nlink(inode, de->nlink); in proc_get_inode()
671 if (S_ISREG(inode->i_mode)) { in proc_get_inode()
672 inode->i_op = de->proc_iops; in proc_get_inode()
673 if (de->proc_ops->proc_read_iter) in proc_get_inode()
674 inode->i_fop = &proc_iter_file_ops; in proc_get_inode()
676 inode->i_fop = &proc_reg_file_ops; in proc_get_inode()
678 if (de->proc_ops->proc_compat_ioctl) { in proc_get_inode()
679 if (de->proc_ops->proc_read_iter) in proc_get_inode()
680 inode->i_fop = &proc_iter_file_ops_compat; in proc_get_inode()
682 inode->i_fop = &proc_reg_file_ops_compat; in proc_get_inode()
685 } else if (S_ISDIR(inode->i_mode)) { in proc_get_inode()
686 inode->i_op = de->proc_iops; in proc_get_inode()
687 inode->i_fop = de->proc_dir_ops; in proc_get_inode()
688 } else if (S_ISLNK(inode->i_mode)) { in proc_get_inode()
689 inode->i_op = de->proc_iops; in proc_get_inode()
690 inode->i_fop = NULL; in proc_get_inode()