1 /* SPDX-License-Identifier: GPL-2.0 */
3 * DFS referral cache routines
5 * Copyright (c) 2018 Paulo Alcantara <palcantara@suse.de>
8 #ifndef _CIFS_DFS_CACHE_H
9 #define _CIFS_DFS_CACHE_H
11 #include <linux/nls.h>
12 #include <linux/list.h>
15 struct dfs_cache_tgt_list
{
17 struct list_head tl_list
;
20 struct dfs_cache_tgt_iterator
{
22 struct list_head it_list
;
25 extern int dfs_cache_init(void);
26 extern void dfs_cache_destroy(void);
27 extern const struct file_operations dfscache_proc_fops
;
29 extern int dfs_cache_find(const unsigned int xid
, struct cifs_ses
*ses
,
30 const struct nls_table
*nls_codepage
, int remap
,
31 const char *path
, struct dfs_info3_param
*ref
,
32 struct dfs_cache_tgt_list
*tgt_list
);
33 extern int dfs_cache_noreq_find(const char *path
, struct dfs_info3_param
*ref
,
34 struct dfs_cache_tgt_list
*tgt_list
);
35 extern int dfs_cache_update_tgthint(const unsigned int xid
,
37 const struct nls_table
*nls_codepage
,
38 int remap
, const char *path
,
39 const struct dfs_cache_tgt_iterator
*it
);
41 dfs_cache_noreq_update_tgthint(const char *path
,
42 const struct dfs_cache_tgt_iterator
*it
);
43 extern int dfs_cache_get_tgt_referral(const char *path
,
44 const struct dfs_cache_tgt_iterator
*it
,
45 struct dfs_info3_param
*ref
);
46 extern int dfs_cache_add_vol(struct smb_vol
*vol
, const char *fullpath
);
47 extern int dfs_cache_update_vol(const char *fullpath
,
48 struct TCP_Server_Info
*server
);
49 extern void dfs_cache_del_vol(const char *fullpath
);
51 static inline struct dfs_cache_tgt_iterator
*
52 dfs_cache_get_next_tgt(struct dfs_cache_tgt_list
*tl
,
53 struct dfs_cache_tgt_iterator
*it
)
55 if (!tl
|| list_empty(&tl
->tl_list
) || !it
||
56 list_is_last(&it
->it_list
, &tl
->tl_list
))
58 return list_next_entry(it
, it_list
);
61 static inline struct dfs_cache_tgt_iterator
*
62 dfs_cache_get_tgt_iterator(struct dfs_cache_tgt_list
*tl
)
66 return list_first_entry_or_null(&tl
->tl_list
,
67 struct dfs_cache_tgt_iterator
,
71 static inline void dfs_cache_free_tgts(struct dfs_cache_tgt_list
*tl
)
73 struct dfs_cache_tgt_iterator
*it
, *nit
;
75 if (!tl
|| list_empty(&tl
->tl_list
))
77 list_for_each_entry_safe(it
, nit
, &tl
->tl_list
, it_list
) {
78 list_del(&it
->it_list
);
85 static inline const char *
86 dfs_cache_get_tgt_name(const struct dfs_cache_tgt_iterator
*it
)
88 return it
? it
->it_name
: NULL
;
92 dfs_cache_get_nr_tgts(const struct dfs_cache_tgt_list
*tl
)
94 return tl
? tl
->tl_numtgts
: 0;
97 #endif /* _CIFS_DFS_CACHE_H */