138c8a9a5SSteve French /* SPDX-License-Identifier: GPL-2.0 */ 238c8a9a5SSteve French /* 338c8a9a5SSteve French * Functions to handle the cached directory entries 438c8a9a5SSteve French * 538c8a9a5SSteve French * Copyright (c) 2022, Ronnie Sahlberg <lsahlber@redhat.com> 638c8a9a5SSteve French */ 738c8a9a5SSteve French 838c8a9a5SSteve French #ifndef _CACHED_DIR_H 938c8a9a5SSteve French #define _CACHED_DIR_H 1038c8a9a5SSteve French 1138c8a9a5SSteve French 1238c8a9a5SSteve French struct cached_dirent { 1338c8a9a5SSteve French struct list_head entry; 1438c8a9a5SSteve French char *name; 1538c8a9a5SSteve French int namelen; 1638c8a9a5SSteve French loff_t pos; 1738c8a9a5SSteve French 1838c8a9a5SSteve French struct cifs_fattr fattr; 1938c8a9a5SSteve French }; 2038c8a9a5SSteve French 2138c8a9a5SSteve French struct cached_dirents { 2238c8a9a5SSteve French bool is_valid:1; 2338c8a9a5SSteve French bool is_failed:1; 2438c8a9a5SSteve French struct dir_context *ctx; /* 2538c8a9a5SSteve French * Only used to make sure we only take entries 2638c8a9a5SSteve French * from a single context. Never dereferenced. 2738c8a9a5SSteve French */ 2838c8a9a5SSteve French struct mutex de_mutex; 2938c8a9a5SSteve French int pos; /* Expected ctx->pos */ 3038c8a9a5SSteve French struct list_head entries; 3138c8a9a5SSteve French }; 3238c8a9a5SSteve French 3338c8a9a5SSteve French struct cached_fid { 3438c8a9a5SSteve French struct list_head entry; 3538c8a9a5SSteve French struct cached_fids *cfids; 3638c8a9a5SSteve French const char *path; 3738c8a9a5SSteve French bool has_lease:1; 3838c8a9a5SSteve French bool is_open:1; 3938c8a9a5SSteve French bool on_list:1; 4038c8a9a5SSteve French bool file_all_info_is_valid:1; 4138c8a9a5SSteve French unsigned long time; /* jiffies of when lease was taken */ 4238c8a9a5SSteve French struct kref refcount; 4338c8a9a5SSteve French struct cifs_fid fid; 4438c8a9a5SSteve French spinlock_t fid_lock; 4538c8a9a5SSteve French struct cifs_tcon *tcon; 4638c8a9a5SSteve French struct dentry *dentry; 4738c8a9a5SSteve French struct work_struct lease_break; 4838c8a9a5SSteve French struct smb2_file_all_info file_all_info; 4938c8a9a5SSteve French struct cached_dirents dirents; 5038c8a9a5SSteve French }; 5138c8a9a5SSteve French 526a50d71dSSteve French /* default MAX_CACHED_FIDS is 16 */ 5338c8a9a5SSteve French struct cached_fids { 5438c8a9a5SSteve French /* Must be held when: 5538c8a9a5SSteve French * - accessing the cfids->entries list 5638c8a9a5SSteve French */ 5738c8a9a5SSteve French spinlock_t cfid_list_lock; 5838c8a9a5SSteve French int num_entries; 5938c8a9a5SSteve French struct list_head entries; 60*e95f3f74SPaulo Alcantara struct delayed_work laundromat_work; 6138c8a9a5SSteve French }; 6238c8a9a5SSteve French 6338c8a9a5SSteve French extern struct cached_fids *init_cached_dirs(void); 6438c8a9a5SSteve French extern void free_cached_dirs(struct cached_fids *cfids); 6538c8a9a5SSteve French extern int open_cached_dir(unsigned int xid, struct cifs_tcon *tcon, 6638c8a9a5SSteve French const char *path, 6738c8a9a5SSteve French struct cifs_sb_info *cifs_sb, 6838c8a9a5SSteve French bool lookup_only, struct cached_fid **cfid); 6938c8a9a5SSteve French extern int open_cached_dir_by_dentry(struct cifs_tcon *tcon, 7038c8a9a5SSteve French struct dentry *dentry, 7138c8a9a5SSteve French struct cached_fid **cfid); 7238c8a9a5SSteve French extern void close_cached_dir(struct cached_fid *cfid); 7338c8a9a5SSteve French extern void drop_cached_dir_by_name(const unsigned int xid, 7438c8a9a5SSteve French struct cifs_tcon *tcon, 7538c8a9a5SSteve French const char *name, 7638c8a9a5SSteve French struct cifs_sb_info *cifs_sb); 7738c8a9a5SSteve French extern void close_all_cached_dirs(struct cifs_sb_info *cifs_sb); 7838c8a9a5SSteve French extern void invalidate_all_cached_dirs(struct cifs_tcon *tcon); 7938c8a9a5SSteve French extern int cached_dir_lease_break(struct cifs_tcon *tcon, __u8 lease_key[16]); 8038c8a9a5SSteve French 8138c8a9a5SSteve French #endif /* _CACHED_DIR_H */ 82