#ifndef _LVE_KERNEL_EXP_ #define _LVE_KERNEL_EXP_ #include #include #include #include #include #include #include #ifndef RHEL_MAJOR #define RHEL_MAJOR 0 #endif struct fs_struct; struct namespace; struct path; struct vfsmount; struct file_system_type; struct task_struct; struct mnt_namespace; struct cgroup; struct cgroup_subsys_state; struct cgroup_iter; struct mem_cgroup; struct gang_set; enum freezer_state; extern struct task_struct *(*lve_find_task_by_vpid)(pid_t nr); extern struct fs_struct * (*lve_copy_fs_struct)(struct fs_struct *); extern void (*lve_free_fs_struct)(struct fs_struct *fs_struct); void lve_ns_put_final(struct namespace *namespace); void lve_set_fs_root_pwd(struct fs_struct *f, const struct path *p); int lve_cgroup_kernel_attach(struct cgroup *cgrp, struct task_struct *tsk); int lve_copy_namespaces(unsigned long flags, struct task_struct *tsk); struct user_beancounter; struct ubparm; extern void (*lve_ub_precharge_snapshot)(struct user_beancounter *ub, int *precharge); int lve_ub_attach_task(struct user_beancounter *bc, struct task_struct *task); #ifdef HAVE_GET_BEANCOUNTER_BYUID extern struct user_beancounter *(*lve_get_beancounter_byuid)(uid_t uid, int create); #endif #ifdef HAVE_GET_BEANCOUNTER_BYNAME extern struct user_beancounter *(*lve_get_beancounter_by_name)(const char *name, int create); #endif struct dentry *lve_get_ub_cgroup_root(void); extern struct cgroup_subsys_state *(*lve_ub_get_css)(struct user_beancounter *ub, int idx); extern int (*lve_freezer_change_state)(struct cgroup *c, enum freezer_state s); extern int (*lve_try_to_free_gang_pages)(struct gang_set *gs, gfp_t gfp); extern rwlock_t *lve_css_set_lock; extern unsigned long (*lve_try_to_free_mem_cgroup_pages)(struct mem_cgroup *mem, unsigned long nr_pages, gfp_t gfp_mask, bool noswap); extern struct mem_cgroup * (*lve_mem_cgroup_from_cont)(struct cgroup *cont); extern void ub_fini_cgroup(void); #ifndef HAVE_BSEARCH void *bsearch(const void *key, const void *base, size_t num, size_t size, int (*cmp)(const void *key, const void *elt)); #else #include #endif extern void (*lve_switch_task_namespaces)(struct task_struct *tsk, struct nsproxy *new); extern void (*lve_free_nsproxy)(struct nsproxy *p); #ifdef HAVE_TASKLIST_QRWLOCK extern qrwlock_t *lve_tasklist_lock_ptr; #else extern rwlock_t *lve_tasklist_lock_ptr; #endif #ifdef HAVE___FPUT extern void (*lve__fput)(struct file *file); #endif extern void (*lve_ub_sync_memcg)(struct user_beancounter *ub); extern void (*lve_cgroup_iter_start)(struct cgroup *cg, struct cgroup_iter *iter); extern void (*lve_cgroup_iter_end)(struct cgroup *cg, struct cgroup_iter *iter); extern struct task_struct * (*lve_cgroup_iter_next)(struct cgroup *cg, struct cgroup_iter *iter); extern void (*lve_put_filesystem)(struct file_system_type *fs); struct cgroupfs_root; #ifdef HAVE_CGOUPFS extern struct cgroup *(*lve_task_cgroup_from_root)(struct task_struct *task, struct cgroupfs_root *root); #else extern struct cgroup *(*lve_task_cgroup_from_root)(struct task_struct *task, struct cgroup_root *root); #endif int lve_resolve_symbols(void); extern void *lve_iolimits_rq_issue_ptr; extern void *lve_iolimits_wb_dirty_ptr; #ifndef HAVE_IOMAP_DIO_RW extern void *lve_iolimits_ext4_direct_IO_enter_ptr; extern void *lve_iolimits_xfs_file_direct_write_ptr; #endif extern int (*lve_task_work_add)(struct task_struct *task, struct callback_head *twork, bool); extern void *(*lve_task_work_cancel)(struct task_struct *task, void *func); #if OPENVZ_VERSION == 0 extern struct cred * lve_init_cred; #endif extern struct file * (*lve_get_empty_filp)(void); #ifdef IMPL_LINK_PROT_OLD extern int (*lve_filename_lookup)(int dfd, struct filename *name, unsigned int flags, struct nameidata *nd); #elif defined(IMPL_LINK_PROT_EXPERIMENTAL) extern int (*lve_filename_lookup)(int dfd, struct filename *name, unsigned int flags, struct path *path, struct path *root); #endif extern struct filename * (*lve_getname)(const char __user * filename); extern struct filename * (*lve_getname_kernel)(const char * filename); extern void (*lve_putname)(struct filename * filename); extern struct file * (*lve_alloc_empty_file_noaccount)(int flags, const struct cred *cred); #ifdef HAVE_TRY_TO_UNLAZY extern bool (*lve_try_to_unlazy)(struct nameidata *nd); #else extern int (*lve_unlazy_walk)(struct nameidata *nd); static inline bool lve_try_to_unlazy(struct nameidata *nd) { if (lve_unlazy_walk(nd) == 0) return true; return false; } #endif extern void (*lve_put_unused_fd)(struct files_struct *files, unsigned int fd); extern int (*lve_cgroupstats_build)(struct cgroupstats *stats, struct dentry *dentry); extern int (*lve_do_readlinkat)(int dfd, const char __user *pathname, char __user *buf, int bufsiz); extern int lve_sys_readlink(int dfd, const char __user *pathname, char __user *buf, int bufsiz); #ifdef IMPL_LINK_PROT_OLD #ifndef IMPL_LINK_PROT_EXPERIMENTAL extern int (*lve_lookup_slow)(struct nameidata *nd, struct path *path); #endif extern struct dentry * (*lve__lookup_hash)(struct qstr *, struct dentry *, unsigned int); extern int (*lve_follow_managed)(struct path *path, unsigned flags); #elif defined(IMPL_LINK_PROT_NEW) #ifndef IMPL_LINK_PROT_EXPERIMENTAL extern struct dentry * (*lve_lookup_slow)(const struct qstr *name, struct dentry *dir, unsigned int flags); #endif extern struct dentry * (*lve__lookup_slow)(const struct qstr *name, struct dentry *dir, unsigned int flags); #elif defined(IMPL_LINK_PROT_EXPERIMENTAL) #ifdef HAVE_OPEN_LAST struct open_flags; #define LVE_DO_LAST_SYM "open_last_lookups" extern char *(*lve_do_last)(struct nameidata *nd, struct file *file, const struct open_flags *op); /* XXXXXX */ extern char *(*lve_walk_component)(struct nameidata *nd, int flags); #else #define LVE_DO_LAST_SYM "do_last" extern int (*lve_do_last)(struct nameidata *nd, struct file *file, const void *op); extern int (*lve_walk_component)(struct nameidata *nd, int flags); #endif extern void (*lve_terminate_walk)(struct nameidata *nd); #if RHEL_MAJOR<9 extern int (*lve_do_renameat2)(int olddfd, const char __user *oldname, int newdfd, const char __user *newname, unsigned int flags); extern int (*lve_do_symlinkat)(const char __user *oldname, int newdfd, const char __user *newname); #else extern int (*lve_do_renameat2)(int olddfd, struct filename *oldname, int newdfd, struct filename *newname, unsigned int flags); extern int (*lve_do_symlinkat)(struct filename *oldname, int newdfd, struct filename *newname); #endif #endif extern int lve_lookup_slow_locked(struct nameidata *nd, struct path *path); #ifndef HAVE_2ARGS_CGROUP_ATTACH_TASK extern int (*lve_cgroup_attach_task)(struct cgroup *, struct task_struct *, bool); #endif extern void (*lve_proc_exit_connector)(struct task_struct *task); extern int (*lve_xfs_trans_dqresv)(void *tp, void *mp, void *dqp, long nblks, long ninos, uint flags); extern void (*lve_cgroup_post_fork)(struct task_struct *child, void *old_ss_priv); extern void (*lve_proc_sys_poll_notify)(struct ctl_table_poll *poll); extern long (*lve_tty_ioctl)(struct file *file, unsigned int cmd, unsigned long arg); #if RHEL_MAJOR == 0 extern int (*lve_de_thread)(struct task_struct *tsk); #endif extern struct dentry_operations *lve_tid_fd_dentry_operations; extern int (*lve_search_binary_handler)(struct linux_binprm *bprm); #endif