#include <linux/fs.h>
#include <linux/pagemap.h>
#include <linux/slab.h>
#include <linux/stat.h>
#include "cifspdu.h"
#include "cifsglob.h"
#include "cifsproto.h"
#include "cifs_unicode.h"
#include "cifs_debug.h"
#include "cifs_fs_sb.h"
#include "cifsfs.h"
#include "smb2proto.h"
#include "fs_context.h"
#include "cached_dir.h"
#include "reparse.h"
#define UNICODE_NAME_MAX …
#ifdef CONFIG_CIFS_DEBUG2
static void dump_cifs_file_struct(struct file *file, char *label)
{ … }
#else
static inline void dump_cifs_file_struct(struct file *file, char *label)
{
}
#endif
static void
cifs_prime_dcache(struct dentry *parent, struct qstr *name,
struct cifs_fattr *fattr)
{ … }
static void
cifs_fill_common_info(struct cifs_fattr *fattr, struct cifs_sb_info *cifs_sb)
{ … }
static void
cifs_posix_to_fattr(struct cifs_fattr *fattr, struct smb2_posix_info *info,
struct cifs_sb_info *cifs_sb)
{ … }
static void __dir_info_to_fattr(struct cifs_fattr *fattr, const void *info)
{ … }
void
cifs_dir_info_to_fattr(struct cifs_fattr *fattr, FILE_DIRECTORY_INFO *info,
struct cifs_sb_info *cifs_sb)
{ … }
static void cifs_fulldir_info_to_fattr(struct cifs_fattr *fattr,
const void *info,
struct cifs_sb_info *cifs_sb)
{ … }
static void
cifs_std_info_to_fattr(struct cifs_fattr *fattr, FIND_FILE_STANDARD_INFO *info,
struct cifs_sb_info *cifs_sb)
{ … }
static int
_initiate_cifs_search(const unsigned int xid, struct file *file,
const char *full_path)
{ … }
static int
initiate_cifs_search(const unsigned int xid, struct file *file,
const char *full_path)
{ … }
static int cifs_unicode_bytelen(const char *str)
{ … }
static char *nxt_dir_entry(char *old_entry, char *end_of_smb, int level)
{ … }
struct cifs_dirent { … };
static void cifs_fill_dirent_posix(struct cifs_dirent *de,
const struct smb2_posix_info *info)
{ … }
static void cifs_fill_dirent_unix(struct cifs_dirent *de,
const FILE_UNIX_INFO *info, bool is_unicode)
{ … }
static void cifs_fill_dirent_dir(struct cifs_dirent *de,
const FILE_DIRECTORY_INFO *info)
{ … }
static void cifs_fill_dirent_full(struct cifs_dirent *de,
const FILE_FULL_DIRECTORY_INFO *info)
{ … }
static void cifs_fill_dirent_search(struct cifs_dirent *de,
const SEARCH_ID_FULL_DIR_INFO *info)
{ … }
static void cifs_fill_dirent_both(struct cifs_dirent *de,
const FILE_BOTH_DIRECTORY_INFO *info)
{ … }
static void cifs_fill_dirent_std(struct cifs_dirent *de,
const FIND_FILE_STANDARD_INFO *info)
{ … }
static int cifs_fill_dirent(struct cifs_dirent *de, const void *info,
u16 level, bool is_unicode)
{ … }
#define UNICODE_DOT …
static int cifs_entry_is_dot(struct cifs_dirent *de, bool is_unicode)
{ … }
static int is_dir_changed(struct file *file)
{ … }
static int cifs_save_resume_key(const char *current_entry,
struct cifsFileInfo *file_info)
{ … }
static int
find_cifs_entry(const unsigned int xid, struct cifs_tcon *tcon, loff_t pos,
struct file *file, const char *full_path,
char **current_entry, int *num_to_ret)
{ … }
static bool emit_cached_dirents(struct cached_dirents *cde,
struct dir_context *ctx)
{ … }
static void update_cached_dirents_count(struct cached_dirents *cde,
struct dir_context *ctx)
{ … }
static void finished_cached_dirents_count(struct cached_dirents *cde,
struct dir_context *ctx)
{ … }
static void add_cached_dirent(struct cached_dirents *cde,
struct dir_context *ctx,
const char *name, int namelen,
struct cifs_fattr *fattr)
{ … }
static bool cifs_dir_emit(struct dir_context *ctx,
const char *name, int namelen,
struct cifs_fattr *fattr,
struct cached_fid *cfid)
{ … }
static int cifs_filldir(char *find_entry, struct file *file,
struct dir_context *ctx,
char *scratch_buf, unsigned int max_len,
struct cached_fid *cfid)
{ … }
int cifs_readdir(struct file *file, struct dir_context *ctx)
{ … }