#include <crypto/hash.h>
#include <linux/kernel.h>
#include <linux/bio.h>
#include <linux/blk-cgroup.h>
#include <linux/file.h>
#include <linux/fs.h>
#include <linux/pagemap.h>
#include <linux/highmem.h>
#include <linux/time.h>
#include <linux/init.h>
#include <linux/string.h>
#include <linux/backing-dev.h>
#include <linux/writeback.h>
#include <linux/compat.h>
#include <linux/xattr.h>
#include <linux/posix_acl.h>
#include <linux/falloc.h>
#include <linux/slab.h>
#include <linux/ratelimit.h>
#include <linux/btrfs.h>
#include <linux/blkdev.h>
#include <linux/posix_acl_xattr.h>
#include <linux/uio.h>
#include <linux/magic.h>
#include <linux/iversion.h>
#include <linux/swap.h>
#include <linux/migrate.h>
#include <linux/sched/mm.h>
#include <linux/iomap.h>
#include <asm/unaligned.h>
#include <linux/fsverity.h>
#include "misc.h"
#include "ctree.h"
#include "disk-io.h"
#include "transaction.h"
#include "btrfs_inode.h"
#include "ordered-data.h"
#include "xattr.h"
#include "tree-log.h"
#include "bio.h"
#include "compression.h"
#include "locking.h"
#include "props.h"
#include "qgroup.h"
#include "delalloc-space.h"
#include "block-group.h"
#include "space-info.h"
#include "zoned.h"
#include "subpage.h"
#include "inode-item.h"
#include "fs.h"
#include "accessors.h"
#include "extent-tree.h"
#include "root-tree.h"
#include "defrag.h"
#include "dir-item.h"
#include "file-item.h"
#include "uuid-tree.h"
#include "ioctl.h"
#include "file.h"
#include "acl.h"
#include "relocation.h"
#include "verity.h"
#include "super.h"
#include "orphan.h"
#include "backref.h"
#include "raid-stripe-tree.h"
#include "fiemap.h"
struct btrfs_iget_args { … };
struct btrfs_rename_ctx { … };
struct data_reloc_warn { … };
static struct lock_class_key file_extent_tree_class;
static const struct inode_operations btrfs_dir_inode_operations;
static const struct inode_operations btrfs_symlink_inode_operations;
static const struct inode_operations btrfs_special_inode_operations;
static const struct inode_operations btrfs_file_inode_operations;
static const struct address_space_operations btrfs_aops;
static const struct file_operations btrfs_dir_file_operations;
static struct kmem_cache *btrfs_inode_cachep;
static int btrfs_setsize(struct inode *inode, struct iattr *attr);
static int btrfs_truncate(struct btrfs_inode *inode, bool skip_writeback);
static noinline int run_delalloc_cow(struct btrfs_inode *inode,
struct page *locked_page, u64 start,
u64 end, struct writeback_control *wbc,
bool pages_dirty);
static int data_reloc_print_warning_inode(u64 inum, u64 offset, u64 num_bytes,
u64 root, void *warn_ctx)
{ … }
static void print_data_reloc_error(const struct btrfs_inode *inode, u64 file_off,
const u8 *csum, const u8 *csum_expected,
int mirror_num)
{ … }
static void __cold btrfs_print_data_csum_error(struct btrfs_inode *inode,
u64 logical_start, u8 *csum, u8 *csum_expected, int mirror_num)
{ … }
int btrfs_inode_lock(struct btrfs_inode *inode, unsigned int ilock_flags)
{ … }
void btrfs_inode_unlock(struct btrfs_inode *inode, unsigned int ilock_flags)
{ … }
static inline void btrfs_cleanup_ordered_extents(struct btrfs_inode *inode,
struct page *locked_page,
u64 offset, u64 bytes)
{ … }
static int btrfs_dirty_inode(struct btrfs_inode *inode);
static int btrfs_init_inode_security(struct btrfs_trans_handle *trans,
struct btrfs_new_inode_args *args)
{ … }
static int insert_inline_extent(struct btrfs_trans_handle *trans,
struct btrfs_path *path,
struct btrfs_inode *inode, bool extent_inserted,
size_t size, size_t compressed_size,
int compress_type,
struct folio *compressed_folio,
bool update_i_size)
{ … }
static bool can_cow_file_range_inline(struct btrfs_inode *inode,
u64 offset, u64 size,
size_t compressed_size)
{ … }
static noinline int __cow_file_range_inline(struct btrfs_inode *inode, u64 offset,
u64 size, size_t compressed_size,
int compress_type,
struct folio *compressed_folio,
bool update_i_size)
{ … }
static noinline int cow_file_range_inline(struct btrfs_inode *inode,
struct page *locked_page,
u64 offset, u64 end,
size_t compressed_size,
int compress_type,
struct folio *compressed_folio,
bool update_i_size)
{ … }
struct async_extent { … };
struct async_chunk { … };
struct async_cow { … };
static noinline int add_async_extent(struct async_chunk *cow,
u64 start, u64 ram_size,
u64 compressed_size,
struct folio **folios,
unsigned long nr_folios,
int compress_type)
{ … }
static inline int inode_need_compress(struct btrfs_inode *inode, u64 start,
u64 end)
{ … }
static inline void inode_should_defrag(struct btrfs_inode *inode,
u64 start, u64 end, u64 num_bytes, u32 small_write)
{ … }
static int extent_range_clear_dirty_for_io(struct inode *inode, u64 start, u64 end)
{ … }
static void compress_file_range(struct btrfs_work *work)
{ … }
static void free_async_extent_pages(struct async_extent *async_extent)
{ … }
static void submit_uncompressed_range(struct btrfs_inode *inode,
struct async_extent *async_extent,
struct page *locked_page)
{ … }
static void submit_one_async_extent(struct async_chunk *async_chunk,
struct async_extent *async_extent,
u64 *alloc_hint)
{ … }
u64 btrfs_get_extent_allocation_hint(struct btrfs_inode *inode, u64 start,
u64 num_bytes)
{ … }
static noinline int cow_file_range(struct btrfs_inode *inode,
struct page *locked_page, u64 start, u64 end,
u64 *done_offset,
bool keep_locked, bool no_inline)
{ … }
static noinline void submit_compressed_extents(struct btrfs_work *work, bool do_free)
{ … }
static bool run_delalloc_compressed(struct btrfs_inode *inode,
struct page *locked_page, u64 start,
u64 end, struct writeback_control *wbc)
{ … }
static noinline int run_delalloc_cow(struct btrfs_inode *inode,
struct page *locked_page, u64 start,
u64 end, struct writeback_control *wbc,
bool pages_dirty)
{ … }
static int fallback_to_cow(struct btrfs_inode *inode, struct page *locked_page,
const u64 start, const u64 end)
{ … }
struct can_nocow_file_extent_args { … };
static int can_nocow_file_extent(struct btrfs_path *path,
struct btrfs_key *key,
struct btrfs_inode *inode,
struct can_nocow_file_extent_args *args)
{ … }
static noinline int run_delalloc_nocow(struct btrfs_inode *inode,
struct page *locked_page,
const u64 start, const u64 end)
{ … }
static bool should_nocow(struct btrfs_inode *inode, u64 start, u64 end)
{ … }
int btrfs_run_delalloc_range(struct btrfs_inode *inode, struct page *locked_page,
u64 start, u64 end, struct writeback_control *wbc)
{ … }
void btrfs_split_delalloc_extent(struct btrfs_inode *inode,
struct extent_state *orig, u64 split)
{ … }
void btrfs_merge_delalloc_extent(struct btrfs_inode *inode, struct extent_state *new,
struct extent_state *other)
{ … }
static void btrfs_add_delalloc_inode(struct btrfs_inode *inode)
{ … }
void btrfs_del_delalloc_inode(struct btrfs_inode *inode)
{ … }
void btrfs_set_delalloc_extent(struct btrfs_inode *inode, struct extent_state *state,
u32 bits)
{ … }
void btrfs_clear_delalloc_extent(struct btrfs_inode *inode,
struct extent_state *state, u32 bits)
{ … }
static int add_pending_csums(struct btrfs_trans_handle *trans,
struct list_head *list)
{ … }
static int btrfs_find_new_delalloc_bytes(struct btrfs_inode *inode,
const u64 start,
const u64 len,
struct extent_state **cached_state)
{ … }
int btrfs_set_extent_delalloc(struct btrfs_inode *inode, u64 start, u64 end,
unsigned int extra_bits,
struct extent_state **cached_state)
{ … }
struct btrfs_writepage_fixup { … };
static void btrfs_writepage_fixup_worker(struct btrfs_work *work)
{ … }
int btrfs_writepage_cow_fixup(struct page *page)
{ … }
static int insert_reserved_file_extent(struct btrfs_trans_handle *trans,
struct btrfs_inode *inode, u64 file_pos,
struct btrfs_file_extent_item *stack_fi,
const bool update_inode_bytes,
u64 qgroup_reserved)
{ … }
static void btrfs_release_delalloc_bytes(struct btrfs_fs_info *fs_info,
u64 start, u64 len)
{ … }
static int insert_ordered_extent_file_extent(struct btrfs_trans_handle *trans,
struct btrfs_ordered_extent *oe)
{ … }
int btrfs_finish_one_ordered(struct btrfs_ordered_extent *ordered_extent)
{ … }
int btrfs_finish_ordered_io(struct btrfs_ordered_extent *ordered)
{ … }
int btrfs_check_sector_csum(struct btrfs_fs_info *fs_info, struct page *page,
u32 pgoff, u8 *csum, const u8 * const csum_expected)
{ … }
bool btrfs_data_csum_ok(struct btrfs_bio *bbio, struct btrfs_device *dev,
u32 bio_offset, struct bio_vec *bv)
{ … }
void btrfs_add_delayed_iput(struct btrfs_inode *inode)
{ … }
static void run_delayed_iput_locked(struct btrfs_fs_info *fs_info,
struct btrfs_inode *inode)
{ … }
static void btrfs_run_delayed_iput(struct btrfs_fs_info *fs_info,
struct btrfs_inode *inode)
{ … }
void btrfs_run_delayed_iputs(struct btrfs_fs_info *fs_info)
{ … }
int btrfs_wait_on_delayed_iputs(struct btrfs_fs_info *fs_info)
{ … }
int btrfs_orphan_add(struct btrfs_trans_handle *trans,
struct btrfs_inode *inode)
{ … }
static int btrfs_orphan_del(struct btrfs_trans_handle *trans,
struct btrfs_inode *inode)
{ … }
int btrfs_orphan_cleanup(struct btrfs_root *root)
{ … }
static noinline int acls_after_inode_item(struct extent_buffer *leaf,
int slot, u64 objectid,
int *first_xattr_slot)
{ … }
static int btrfs_init_file_extent_tree(struct btrfs_inode *inode)
{ … }
static int btrfs_read_locked_inode(struct inode *inode,
struct btrfs_path *in_path)
{ … }
static void fill_inode_item(struct btrfs_trans_handle *trans,
struct extent_buffer *leaf,
struct btrfs_inode_item *item,
struct inode *inode)
{ … }
static noinline int btrfs_update_inode_item(struct btrfs_trans_handle *trans,
struct btrfs_inode *inode)
{ … }
int btrfs_update_inode(struct btrfs_trans_handle *trans,
struct btrfs_inode *inode)
{ … }
int btrfs_update_inode_fallback(struct btrfs_trans_handle *trans,
struct btrfs_inode *inode)
{ … }
static int __btrfs_unlink_inode(struct btrfs_trans_handle *trans,
struct btrfs_inode *dir,
struct btrfs_inode *inode,
const struct fscrypt_str *name,
struct btrfs_rename_ctx *rename_ctx)
{ … }
int btrfs_unlink_inode(struct btrfs_trans_handle *trans,
struct btrfs_inode *dir, struct btrfs_inode *inode,
const struct fscrypt_str *name)
{ … }
static struct btrfs_trans_handle *__unlink_start_trans(struct btrfs_inode *dir)
{ … }
static int btrfs_unlink(struct inode *dir, struct dentry *dentry)
{ … }
static int btrfs_unlink_subvol(struct btrfs_trans_handle *trans,
struct btrfs_inode *dir, struct dentry *dentry)
{ … }
static noinline int may_destroy_subvol(struct btrfs_root *root)
{ … }
static void btrfs_prune_dentries(struct btrfs_root *root)
{ … }
int btrfs_delete_subvolume(struct btrfs_inode *dir, struct dentry *dentry)
{ … }
static int btrfs_rmdir(struct inode *dir, struct dentry *dentry)
{ … }
int btrfs_truncate_block(struct btrfs_inode *inode, loff_t from, loff_t len,
int front)
{ … }
static int maybe_insert_hole(struct btrfs_inode *inode, u64 offset, u64 len)
{ … }
int btrfs_cont_expand(struct btrfs_inode *inode, loff_t oldsize, loff_t size)
{ … }
static int btrfs_setsize(struct inode *inode, struct iattr *attr)
{ … }
static int btrfs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
struct iattr *attr)
{ … }
static void evict_inode_truncate_pages(struct inode *inode)
{ … }
static struct btrfs_trans_handle *evict_refill_and_join(struct btrfs_root *root,
struct btrfs_block_rsv *rsv)
{ … }
void btrfs_evict_inode(struct inode *inode)
{ … }
static int btrfs_inode_by_name(struct btrfs_inode *dir, struct dentry *dentry,
struct btrfs_key *location, u8 *type)
{ … }
static int fixup_tree_root_location(struct btrfs_fs_info *fs_info,
struct btrfs_inode *dir,
struct dentry *dentry,
struct btrfs_key *location,
struct btrfs_root **sub_root)
{ … }
static int btrfs_add_inode_to_root(struct btrfs_inode *inode, bool prealloc)
{ … }
static void btrfs_del_inode_from_root(struct btrfs_inode *inode)
{ … }
static int btrfs_init_locked_inode(struct inode *inode, void *p)
{ … }
static int btrfs_find_actor(struct inode *inode, void *opaque)
{ … }
static struct inode *btrfs_iget_locked(u64 ino, struct btrfs_root *root)
{ … }
struct inode *btrfs_iget_path(u64 ino, struct btrfs_root *root,
struct btrfs_path *path)
{ … }
struct inode *btrfs_iget(u64 ino, struct btrfs_root *root)
{ … }
static struct inode *new_simple_dir(struct inode *dir,
struct btrfs_key *key,
struct btrfs_root *root)
{ … }
static_assert(…);
static_assert(…);
static_assert(…);
static_assert(…);
static_assert(…);
static_assert(…);
static_assert(…);
static_assert(…);
static inline u8 btrfs_inode_type(struct inode *inode)
{ … }
struct inode *btrfs_lookup_dentry(struct inode *dir, struct dentry *dentry)
{ … }
static int btrfs_dentry_delete(const struct dentry *dentry)
{ … }
static struct dentry *btrfs_lookup(struct inode *dir, struct dentry *dentry,
unsigned int flags)
{ … }
static int btrfs_set_inode_index_count(struct btrfs_inode *inode)
{ … }
static int btrfs_get_dir_last_index(struct btrfs_inode *dir, u64 *index)
{ … }
static int btrfs_opendir(struct inode *inode, struct file *file)
{ … }
static loff_t btrfs_dir_llseek(struct file *file, loff_t offset, int whence)
{ … }
struct dir_entry { … };
static int btrfs_filldir(void *addr, int entries, struct dir_context *ctx)
{ … }
static int btrfs_real_readdir(struct file *file, struct dir_context *ctx)
{ … }
static int btrfs_dirty_inode(struct btrfs_inode *inode)
{ … }
static int btrfs_update_time(struct inode *inode, int flags)
{ … }
int btrfs_set_inode_index(struct btrfs_inode *dir, u64 *index)
{ … }
static int btrfs_insert_inode_locked(struct inode *inode)
{ … }
int btrfs_new_inode_prepare(struct btrfs_new_inode_args *args,
unsigned int *trans_num_items)
{ … }
void btrfs_new_inode_args_destroy(struct btrfs_new_inode_args *args)
{ … }
static void btrfs_inherit_iflags(struct btrfs_inode *inode, struct btrfs_inode *dir)
{ … }
int btrfs_create_new_inode(struct btrfs_trans_handle *trans,
struct btrfs_new_inode_args *args)
{ … }
int btrfs_add_link(struct btrfs_trans_handle *trans,
struct btrfs_inode *parent_inode, struct btrfs_inode *inode,
const struct fscrypt_str *name, int add_backref, u64 index)
{ … }
static int btrfs_create_common(struct inode *dir, struct dentry *dentry,
struct inode *inode)
{ … }
static int btrfs_mknod(struct mnt_idmap *idmap, struct inode *dir,
struct dentry *dentry, umode_t mode, dev_t rdev)
{ … }
static int btrfs_create(struct mnt_idmap *idmap, struct inode *dir,
struct dentry *dentry, umode_t mode, bool excl)
{ … }
static int btrfs_link(struct dentry *old_dentry, struct inode *dir,
struct dentry *dentry)
{ … }
static int btrfs_mkdir(struct mnt_idmap *idmap, struct inode *dir,
struct dentry *dentry, umode_t mode)
{ … }
static noinline int uncompress_inline(struct btrfs_path *path,
struct page *page,
struct btrfs_file_extent_item *item)
{ … }
static int read_inline_extent(struct btrfs_inode *inode, struct btrfs_path *path,
struct page *page)
{ … }
struct extent_map *btrfs_get_extent(struct btrfs_inode *inode,
struct page *page, u64 start, u64 len)
{ … }
static bool btrfs_extent_readonly(struct btrfs_fs_info *fs_info, u64 bytenr)
{ … }
noinline int can_nocow_extent(struct inode *inode, u64 offset, u64 *len,
struct btrfs_file_extent *file_extent,
bool nowait, bool strict)
{ … }
struct extent_map *btrfs_create_io_em(struct btrfs_inode *inode, u64 start,
const struct btrfs_file_extent *file_extent,
int type)
{ … }
static void wait_subpage_spinlock(struct page *page)
{ … }
static int btrfs_launder_folio(struct folio *folio)
{ … }
static bool __btrfs_release_folio(struct folio *folio, gfp_t gfp_flags)
{ … }
static bool btrfs_release_folio(struct folio *folio, gfp_t gfp_flags)
{ … }
#ifdef CONFIG_MIGRATION
static int btrfs_migrate_folio(struct address_space *mapping,
struct folio *dst, struct folio *src,
enum migrate_mode mode)
{ … }
#else
#define btrfs_migrate_folio …
#endif
static void btrfs_invalidate_folio(struct folio *folio, size_t offset,
size_t length)
{ … }
static int btrfs_truncate(struct btrfs_inode *inode, bool skip_writeback)
{ … }
struct inode *btrfs_new_subvol_inode(struct mnt_idmap *idmap,
struct inode *dir)
{ … }
struct inode *btrfs_alloc_inode(struct super_block *sb)
{ … }
#ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS
void btrfs_test_destroy_inode(struct inode *inode)
{ … }
#endif
void btrfs_free_inode(struct inode *inode)
{ … }
void btrfs_destroy_inode(struct inode *vfs_inode)
{ … }
int btrfs_drop_inode(struct inode *inode)
{ … }
static void init_once(void *foo)
{ … }
void __cold btrfs_destroy_cachep(void)
{ … }
int __init btrfs_init_cachep(void)
{ … }
static int btrfs_getattr(struct mnt_idmap *idmap,
const struct path *path, struct kstat *stat,
u32 request_mask, unsigned int flags)
{ … }
static int btrfs_rename_exchange(struct inode *old_dir,
struct dentry *old_dentry,
struct inode *new_dir,
struct dentry *new_dentry)
{ … }
static struct inode *new_whiteout_inode(struct mnt_idmap *idmap,
struct inode *dir)
{ … }
static int btrfs_rename(struct mnt_idmap *idmap,
struct inode *old_dir, struct dentry *old_dentry,
struct inode *new_dir, struct dentry *new_dentry,
unsigned int flags)
{ … }
static int btrfs_rename2(struct mnt_idmap *idmap, struct inode *old_dir,
struct dentry *old_dentry, struct inode *new_dir,
struct dentry *new_dentry, unsigned int flags)
{ … }
struct btrfs_delalloc_work { … };
static void btrfs_run_delalloc_work(struct btrfs_work *work)
{ … }
static struct btrfs_delalloc_work *btrfs_alloc_delalloc_work(struct inode *inode)
{ … }
static int start_delalloc_inodes(struct btrfs_root *root,
struct writeback_control *wbc, bool snapshot,
bool in_reclaim_context)
{ … }
int btrfs_start_delalloc_snapshot(struct btrfs_root *root, bool in_reclaim_context)
{ … }
int btrfs_start_delalloc_roots(struct btrfs_fs_info *fs_info, long nr,
bool in_reclaim_context)
{ … }
static int btrfs_symlink(struct mnt_idmap *idmap, struct inode *dir,
struct dentry *dentry, const char *symname)
{ … }
static struct btrfs_trans_handle *insert_prealloc_file_extent(
struct btrfs_trans_handle *trans_in,
struct btrfs_inode *inode,
struct btrfs_key *ins,
u64 file_offset)
{ … }
static int __btrfs_prealloc_file_range(struct inode *inode, int mode,
u64 start, u64 num_bytes, u64 min_size,
loff_t actual_len, u64 *alloc_hint,
struct btrfs_trans_handle *trans)
{ … }
int btrfs_prealloc_file_range(struct inode *inode, int mode,
u64 start, u64 num_bytes, u64 min_size,
loff_t actual_len, u64 *alloc_hint)
{ … }
int btrfs_prealloc_file_range_trans(struct inode *inode,
struct btrfs_trans_handle *trans, int mode,
u64 start, u64 num_bytes, u64 min_size,
loff_t actual_len, u64 *alloc_hint)
{ … }
static int btrfs_permission(struct mnt_idmap *idmap,
struct inode *inode, int mask)
{ … }
static int btrfs_tmpfile(struct mnt_idmap *idmap, struct inode *dir,
struct file *file, umode_t mode)
{ … }
void btrfs_set_range_writeback(struct btrfs_inode *inode, u64 start, u64 end)
{ … }
int btrfs_encoded_io_compression_from_extent(struct btrfs_fs_info *fs_info,
int compress_type)
{ … }
static ssize_t btrfs_encoded_read_inline(
struct kiocb *iocb,
struct iov_iter *iter, u64 start,
u64 lockend,
struct extent_state **cached_state,
u64 extent_start, size_t count,
struct btrfs_ioctl_encoded_io_args *encoded,
bool *unlocked)
{ … }
struct btrfs_encoded_read_private { … };
static void btrfs_encoded_read_endio(struct btrfs_bio *bbio)
{ … }
int btrfs_encoded_read_regular_fill_pages(struct btrfs_inode *inode,
u64 file_offset, u64 disk_bytenr,
u64 disk_io_size, struct page **pages)
{ … }
static ssize_t btrfs_encoded_read_regular(struct kiocb *iocb,
struct iov_iter *iter,
u64 start, u64 lockend,
struct extent_state **cached_state,
u64 disk_bytenr, u64 disk_io_size,
size_t count, bool compressed,
bool *unlocked)
{ … }
ssize_t btrfs_encoded_read(struct kiocb *iocb, struct iov_iter *iter,
struct btrfs_ioctl_encoded_io_args *encoded)
{ … }
ssize_t btrfs_do_encoded_write(struct kiocb *iocb, struct iov_iter *from,
const struct btrfs_ioctl_encoded_io_args *encoded)
{ … }
#ifdef CONFIG_SWAP
static int btrfs_add_swapfile_pin(struct inode *inode, void *ptr,
bool is_block_group)
{ … }
static void btrfs_free_swapfile_pins(struct inode *inode)
{ … }
struct btrfs_swap_info { … };
static int btrfs_add_swap_extent(struct swap_info_struct *sis,
struct btrfs_swap_info *bsi)
{ … }
static void btrfs_swap_deactivate(struct file *file)
{ … }
static int btrfs_swap_activate(struct swap_info_struct *sis, struct file *file,
sector_t *span)
{ … }
#else
static void btrfs_swap_deactivate(struct file *file)
{
}
static int btrfs_swap_activate(struct swap_info_struct *sis, struct file *file,
sector_t *span)
{
return -EOPNOTSUPP;
}
#endif
void btrfs_update_inode_bytes(struct btrfs_inode *inode,
const u64 add_bytes,
const u64 del_bytes)
{ … }
void btrfs_assert_inode_range_clean(struct btrfs_inode *inode, u64 start, u64 end)
{ … }
struct btrfs_inode *btrfs_find_first_inode(struct btrfs_root *root, u64 min_ino)
{ … }
static const struct inode_operations btrfs_dir_inode_operations = …;
static const struct file_operations btrfs_dir_file_operations = …;
static const struct address_space_operations btrfs_aops = …;
static const struct inode_operations btrfs_file_inode_operations = …;
static const struct inode_operations btrfs_special_inode_operations = …;
static const struct inode_operations btrfs_symlink_inode_operations = …;
const struct dentry_operations btrfs_dentry_operations = …;