#include <asm/unaligned.h>
#include <linux/fs.h>
#include <linux/f2fs_fs.h>
#include <linux/sched/signal.h>
#include <linux/unicode.h>
#include "f2fs.h"
#include "node.h"
#include "acl.h"
#include "xattr.h"
#include <trace/events/f2fs.h>
#if IS_ENABLED(CONFIG_UNICODE)
extern struct kmem_cache *f2fs_cf_name_slab;
#endif
static unsigned long dir_blocks(struct inode *inode)
{ … }
static unsigned int dir_buckets(unsigned int level, int dir_level)
{ … }
static unsigned int bucket_blocks(unsigned int level)
{ … }
#if IS_ENABLED(CONFIG_UNICODE)
int f2fs_init_casefolded_name(const struct inode *dir,
struct f2fs_filename *fname)
{ … }
void f2fs_free_casefolded_name(struct f2fs_filename *fname)
{ … }
#endif
static int __f2fs_setup_filename(const struct inode *dir,
const struct fscrypt_name *crypt_name,
struct f2fs_filename *fname)
{ … }
int f2fs_setup_filename(struct inode *dir, const struct qstr *iname,
int lookup, struct f2fs_filename *fname)
{ … }
int f2fs_prepare_lookup(struct inode *dir, struct dentry *dentry,
struct f2fs_filename *fname)
{ … }
void f2fs_free_filename(struct f2fs_filename *fname)
{ … }
static unsigned long dir_block_index(unsigned int level,
int dir_level, unsigned int idx)
{ … }
static struct f2fs_dir_entry *find_in_block(struct inode *dir,
struct page *dentry_page,
const struct f2fs_filename *fname,
int *max_slots)
{ … }
static inline int f2fs_match_name(const struct inode *dir,
const struct f2fs_filename *fname,
const u8 *de_name, u32 de_name_len)
{ … }
struct f2fs_dir_entry *f2fs_find_target_dentry(const struct f2fs_dentry_ptr *d,
const struct f2fs_filename *fname, int *max_slots)
{ … }
static struct f2fs_dir_entry *find_in_level(struct inode *dir,
unsigned int level,
const struct f2fs_filename *fname,
struct page **res_page)
{ … }
struct f2fs_dir_entry *__f2fs_find_entry(struct inode *dir,
const struct f2fs_filename *fname,
struct page **res_page)
{ … }
struct f2fs_dir_entry *f2fs_find_entry(struct inode *dir,
const struct qstr *child, struct page **res_page)
{ … }
struct f2fs_dir_entry *f2fs_parent_dir(struct inode *dir, struct page **p)
{ … }
ino_t f2fs_inode_by_name(struct inode *dir, const struct qstr *qstr,
struct page **page)
{ … }
void f2fs_set_link(struct inode *dir, struct f2fs_dir_entry *de,
struct page *page, struct inode *inode)
{ … }
static void init_dent_inode(struct inode *dir, struct inode *inode,
const struct f2fs_filename *fname,
struct page *ipage)
{ … }
void f2fs_do_make_empty_dir(struct inode *inode, struct inode *parent,
struct f2fs_dentry_ptr *d)
{ … }
static int make_empty_dir(struct inode *inode,
struct inode *parent, struct page *page)
{ … }
struct page *f2fs_init_inode_metadata(struct inode *inode, struct inode *dir,
const struct f2fs_filename *fname, struct page *dpage)
{ … }
void f2fs_update_parent_metadata(struct inode *dir, struct inode *inode,
unsigned int current_depth)
{ … }
int f2fs_room_for_filename(const void *bitmap, int slots, int max_slots)
{ … }
bool f2fs_has_enough_room(struct inode *dir, struct page *ipage,
const struct f2fs_filename *fname)
{ … }
void f2fs_update_dentry(nid_t ino, umode_t mode, struct f2fs_dentry_ptr *d,
const struct fscrypt_str *name, f2fs_hash_t name_hash,
unsigned int bit_pos)
{ … }
int f2fs_add_regular_entry(struct inode *dir, const struct f2fs_filename *fname,
struct inode *inode, nid_t ino, umode_t mode)
{ … }
int f2fs_add_dentry(struct inode *dir, const struct f2fs_filename *fname,
struct inode *inode, nid_t ino, umode_t mode)
{ … }
int f2fs_do_add_link(struct inode *dir, const struct qstr *name,
struct inode *inode, nid_t ino, umode_t mode)
{ … }
int f2fs_do_tmpfile(struct inode *inode, struct inode *dir,
struct f2fs_filename *fname)
{ … }
void f2fs_drop_nlink(struct inode *dir, struct inode *inode)
{ … }
void f2fs_delete_entry(struct f2fs_dir_entry *dentry, struct page *page,
struct inode *dir, struct inode *inode)
{ … }
bool f2fs_empty_dir(struct inode *dir)
{ … }
int f2fs_fill_dentries(struct dir_context *ctx, struct f2fs_dentry_ptr *d,
unsigned int start_pos, struct fscrypt_str *fstr)
{ … }
static int f2fs_readdir(struct file *file, struct dir_context *ctx)
{ … }
const struct file_operations f2fs_dir_operations = …;