xref: /openbmc/linux/fs/smb/client/cached_dir.h (revision e95f3f74)
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