#include "fuse_i.h"
#include <linux/pagemap.h>
#include <linux/slab.h>
#include <linux/file.h>
#include <linux/seq_file.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/fs_context.h>
#include <linux/fs_parser.h>
#include <linux/statfs.h>
#include <linux/random.h>
#include <linux/sched.h>
#include <linux/exportfs.h>
#include <linux/posix_acl.h>
#include <linux/pid_namespace.h>
#include <uapi/linux/magic.h>
MODULE_AUTHOR(…) …;
MODULE_DESCRIPTION(…) …;
MODULE_LICENSE(…) …;
static struct kmem_cache *fuse_inode_cachep;
struct list_head fuse_conn_list;
DEFINE_MUTEX(…) …;
static int set_global_limit(const char *val, const struct kernel_param *kp);
unsigned max_user_bgreq;
module_param_call(…);
__MODULE_PARM_TYPE(…) …;
MODULE_PARM_DESC(…) …;
unsigned max_user_congthresh;
module_param_call(…);
__MODULE_PARM_TYPE(…) …;
MODULE_PARM_DESC(…) …;
#define FUSE_DEFAULT_BLKSIZE …
#define FUSE_DEFAULT_MAX_BACKGROUND …
#define FUSE_DEFAULT_CONGESTION_THRESHOLD …
#ifdef CONFIG_BLOCK
static struct file_system_type fuseblk_fs_type;
#endif
struct fuse_forget_link *fuse_alloc_forget(void)
{ … }
static struct fuse_submount_lookup *fuse_alloc_submount_lookup(void)
{ … }
static struct inode *fuse_alloc_inode(struct super_block *sb)
{ … }
static void fuse_free_inode(struct inode *inode)
{ … }
static void fuse_cleanup_submount_lookup(struct fuse_conn *fc,
struct fuse_submount_lookup *sl)
{ … }
static void fuse_evict_inode(struct inode *inode)
{ … }
static int fuse_reconfigure(struct fs_context *fsc)
{ … }
static ino_t fuse_squash_ino(u64 ino64)
{ … }
void fuse_change_attributes_common(struct inode *inode, struct fuse_attr *attr,
struct fuse_statx *sx,
u64 attr_valid, u32 cache_mask)
{ … }
u32 fuse_get_cache_mask(struct inode *inode)
{ … }
void fuse_change_attributes(struct inode *inode, struct fuse_attr *attr,
struct fuse_statx *sx,
u64 attr_valid, u64 attr_version)
{ … }
static void fuse_init_submount_lookup(struct fuse_submount_lookup *sl,
u64 nodeid)
{ … }
static void fuse_init_inode(struct inode *inode, struct fuse_attr *attr,
struct fuse_conn *fc)
{ … }
static int fuse_inode_eq(struct inode *inode, void *_nodeidp)
{ … }
static int fuse_inode_set(struct inode *inode, void *_nodeidp)
{ … }
struct inode *fuse_iget(struct super_block *sb, u64 nodeid,
int generation, struct fuse_attr *attr,
u64 attr_valid, u64 attr_version)
{ … }
struct inode *fuse_ilookup(struct fuse_conn *fc, u64 nodeid,
struct fuse_mount **fm)
{ … }
int fuse_reverse_inval_inode(struct fuse_conn *fc, u64 nodeid,
loff_t offset, loff_t len)
{ … }
bool fuse_lock_inode(struct inode *inode)
{ … }
void fuse_unlock_inode(struct inode *inode, bool locked)
{ … }
static void fuse_umount_begin(struct super_block *sb)
{ … }
static void fuse_send_destroy(struct fuse_mount *fm)
{ … }
static void convert_fuse_statfs(struct kstatfs *stbuf, struct fuse_kstatfs *attr)
{ … }
static int fuse_statfs(struct dentry *dentry, struct kstatfs *buf)
{ … }
static struct fuse_sync_bucket *fuse_sync_bucket_alloc(void)
{ … }
static void fuse_sync_fs_writes(struct fuse_conn *fc)
{ … }
static int fuse_sync_fs(struct super_block *sb, int wait)
{ … }
enum { … };
static const struct fs_parameter_spec fuse_fs_parameters[] = …;
static int fuse_parse_param(struct fs_context *fsc, struct fs_parameter *param)
{ … }
static void fuse_free_fsc(struct fs_context *fsc)
{ … }
static int fuse_show_options(struct seq_file *m, struct dentry *root)
{ … }
static void fuse_iqueue_init(struct fuse_iqueue *fiq,
const struct fuse_iqueue_ops *ops,
void *priv)
{ … }
static void fuse_pqueue_init(struct fuse_pqueue *fpq)
{ … }
void fuse_conn_init(struct fuse_conn *fc, struct fuse_mount *fm,
struct user_namespace *user_ns,
const struct fuse_iqueue_ops *fiq_ops, void *fiq_priv)
{ … }
EXPORT_SYMBOL_GPL(…);
static void delayed_release(struct rcu_head *p)
{ … }
void fuse_conn_put(struct fuse_conn *fc)
{ … }
EXPORT_SYMBOL_GPL(…);
struct fuse_conn *fuse_conn_get(struct fuse_conn *fc)
{ … }
EXPORT_SYMBOL_GPL(…);
static struct inode *fuse_get_root_inode(struct super_block *sb, unsigned mode)
{ … }
struct fuse_inode_handle { … };
static struct dentry *fuse_get_dentry(struct super_block *sb,
struct fuse_inode_handle *handle)
{ … }
static int fuse_encode_fh(struct inode *inode, u32 *fh, int *max_len,
struct inode *parent)
{ … }
static struct dentry *fuse_fh_to_dentry(struct super_block *sb,
struct fid *fid, int fh_len, int fh_type)
{ … }
static struct dentry *fuse_fh_to_parent(struct super_block *sb,
struct fid *fid, int fh_len, int fh_type)
{ … }
static struct dentry *fuse_get_parent(struct dentry *child)
{ … }
static const struct export_operations fuse_export_fid_operations = …;
static const struct export_operations fuse_export_operations = …;
static const struct super_operations fuse_super_operations = …;
static void sanitize_global_limit(unsigned *limit)
{ … }
static int set_global_limit(const char *val, const struct kernel_param *kp)
{ … }
static void process_init_limits(struct fuse_conn *fc, struct fuse_init_out *arg)
{ … }
struct fuse_init_args { … };
static void process_init_reply(struct fuse_mount *fm, struct fuse_args *args,
int error)
{ … }
void fuse_send_init(struct fuse_mount *fm)
{ … }
EXPORT_SYMBOL_GPL(…);
void fuse_free_conn(struct fuse_conn *fc)
{ … }
EXPORT_SYMBOL_GPL(…);
static int fuse_bdi_init(struct fuse_conn *fc, struct super_block *sb)
{ … }
struct fuse_dev *fuse_dev_alloc(void)
{ … }
EXPORT_SYMBOL_GPL(…);
void fuse_dev_install(struct fuse_dev *fud, struct fuse_conn *fc)
{ … }
EXPORT_SYMBOL_GPL(…);
struct fuse_dev *fuse_dev_alloc_install(struct fuse_conn *fc)
{ … }
EXPORT_SYMBOL_GPL(…);
void fuse_dev_free(struct fuse_dev *fud)
{ … }
EXPORT_SYMBOL_GPL(…);
static void fuse_fill_attr_from_inode(struct fuse_attr *attr,
const struct fuse_inode *fi)
{ … }
static void fuse_sb_defaults(struct super_block *sb)
{ … }
static int fuse_fill_super_submount(struct super_block *sb,
struct fuse_inode *parent_fi)
{ … }
static int fuse_get_tree_submount(struct fs_context *fsc)
{ … }
static const struct fs_context_operations fuse_context_submount_ops = …;
int fuse_init_fs_context_submount(struct fs_context *fsc)
{ … }
EXPORT_SYMBOL_GPL(…);
int fuse_fill_super_common(struct super_block *sb, struct fuse_fs_context *ctx)
{ … }
EXPORT_SYMBOL_GPL(…);
static int fuse_fill_super(struct super_block *sb, struct fs_context *fsc)
{ … }
static int fuse_set_no_super(struct super_block *sb, struct fs_context *fsc)
{ … }
static int fuse_test_super(struct super_block *sb, struct fs_context *fsc)
{ … }
static int fuse_get_tree(struct fs_context *fsc)
{ … }
static const struct fs_context_operations fuse_context_ops = …;
static int fuse_init_fs_context(struct fs_context *fsc)
{ … }
bool fuse_mount_remove(struct fuse_mount *fm)
{ … }
EXPORT_SYMBOL_GPL(…);
void fuse_conn_destroy(struct fuse_mount *fm)
{ … }
EXPORT_SYMBOL_GPL(…);
static void fuse_sb_destroy(struct super_block *sb)
{ … }
void fuse_mount_destroy(struct fuse_mount *fm)
{ … }
EXPORT_SYMBOL(…);
static void fuse_kill_sb_anon(struct super_block *sb)
{ … }
static struct file_system_type fuse_fs_type = …;
MODULE_ALIAS_FS(…) …;
#ifdef CONFIG_BLOCK
static void fuse_kill_sb_blk(struct super_block *sb)
{ … }
static struct file_system_type fuseblk_fs_type = …;
MODULE_ALIAS_FS(…) …;
static inline int register_fuseblk(void)
{ … }
static inline void unregister_fuseblk(void)
{ … }
#else
static inline int register_fuseblk(void)
{
return 0;
}
static inline void unregister_fuseblk(void)
{
}
#endif
static void fuse_inode_init_once(void *foo)
{ … }
static int __init fuse_fs_init(void)
{ … }
static void fuse_fs_cleanup(void)
{ … }
static struct kobject *fuse_kobj;
static int fuse_sysfs_init(void)
{ … }
static void fuse_sysfs_cleanup(void)
{ … }
static int __init fuse_init(void)
{ … }
static void __exit fuse_exit(void)
{ … }
module_init(…) …;
module_exit(fuse_exit);