82 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2/*3 * Functions to handle the cached directory entries4 *5 * Copyright (c) 2022, Ronnie Sahlberg <lsahlber@redhat.com>6 */7 8#ifndef _CACHED_DIR_H9#define _CACHED_DIR_H10 11 12struct cached_dirent {13 struct list_head entry;14 char *name;15 int namelen;16 loff_t pos;17 18 struct cifs_fattr fattr;19};20 21struct cached_dirents {22 bool is_valid:1;23 bool is_failed:1;24 struct dir_context *ctx; /*25 * Only used to make sure we only take entries26 * from a single context. Never dereferenced.27 */28 struct mutex de_mutex;29 int pos; /* Expected ctx->pos */30 struct list_head entries;31};32 33struct cached_fid {34 struct list_head entry;35 struct cached_fids *cfids;36 const char *path;37 bool has_lease:1;38 bool is_open:1;39 bool on_list:1;40 bool file_all_info_is_valid:1;41 unsigned long time; /* jiffies of when lease was taken */42 struct kref refcount;43 struct cifs_fid fid;44 spinlock_t fid_lock;45 struct cifs_tcon *tcon;46 struct dentry *dentry;47 struct work_struct lease_break;48 struct smb2_file_all_info file_all_info;49 struct cached_dirents dirents;50};51 52/* default MAX_CACHED_FIDS is 16 */53struct cached_fids {54 /* Must be held when:55 * - accessing the cfids->entries list56 */57 spinlock_t cfid_list_lock;58 int num_entries;59 struct list_head entries;60 struct delayed_work laundromat_work;61};62 63extern struct cached_fids *init_cached_dirs(void);64extern void free_cached_dirs(struct cached_fids *cfids);65extern int open_cached_dir(unsigned int xid, struct cifs_tcon *tcon,66 const char *path,67 struct cifs_sb_info *cifs_sb,68 bool lookup_only, struct cached_fid **cfid);69extern int open_cached_dir_by_dentry(struct cifs_tcon *tcon,70 struct dentry *dentry,71 struct cached_fid **cfid);72extern void close_cached_dir(struct cached_fid *cfid);73extern void drop_cached_dir_by_name(const unsigned int xid,74 struct cifs_tcon *tcon,75 const char *name,76 struct cifs_sb_info *cifs_sb);77extern void close_all_cached_dirs(struct cifs_sb_info *cifs_sb);78extern void invalidate_all_cached_dirs(struct cifs_tcon *tcon);79extern int cached_dir_lease_break(struct cifs_tcon *tcon, __u8 lease_key[16]);80 81#endif /* _CACHED_DIR_H */82