2018-11-14 21:01:21 +03:00
/* SPDX-License-Identifier: GPL-2.0 */
/*
* DFS referral cache routines
*
2019-03-19 22:54:29 +03:00
* Copyright ( c ) 2018 - 2019 Paulo Alcantara < palcantara @ suse . de >
2018-11-14 21:01:21 +03:00
*/
# ifndef _CIFS_DFS_CACHE_H
# define _CIFS_DFS_CACHE_H
# include <linux/nls.h>
# include <linux/list.h>
2021-06-05 01:25:29 +03:00
# include <linux/uuid.h>
2018-11-14 21:01:21 +03:00
# include "cifsglob.h"
2023-04-27 10:40:08 +03:00
extern struct workqueue_struct * dfscache_wq ;
extern atomic_t dfs_cache_ttl ;
2021-07-16 09:26:41 +03:00
# define DFS_CACHE_TGT_LIST_INIT(var) { .tl_numtgts = 0, .tl_list = LIST_HEAD_INIT((var).tl_list), }
2018-11-14 21:01:21 +03:00
struct dfs_cache_tgt_list {
int tl_numtgts ;
struct list_head tl_list ;
} ;
struct dfs_cache_tgt_iterator {
char * it_name ;
2020-07-21 15:36:42 +03:00
int it_path_consumed ;
2018-11-14 21:01:21 +03:00
struct list_head it_list ;
} ;
2021-06-05 01:25:30 +03:00
int dfs_cache_init ( void ) ;
void dfs_cache_destroy ( void ) ;
2020-02-04 04:37:17 +03:00
extern const struct proc_ops dfscache_proc_ops ;
2018-11-14 21:01:21 +03:00
2021-06-05 01:25:30 +03:00
int dfs_cache_find ( const unsigned int xid , struct cifs_ses * ses , const struct nls_table * cp ,
int remap , const char * path , struct dfs_info3_param * ref ,
struct dfs_cache_tgt_list * tgt_list ) ;
int dfs_cache_noreq_find ( const char * path , struct dfs_info3_param * ref ,
struct dfs_cache_tgt_list * tgt_list ) ;
2022-12-17 03:41:31 +03:00
void dfs_cache_noreq_update_tgthint ( const char * path , const struct dfs_cache_tgt_iterator * it ) ;
2021-06-05 01:25:30 +03:00
int dfs_cache_get_tgt_referral ( const char * path , const struct dfs_cache_tgt_iterator * it ,
struct dfs_info3_param * ref ) ;
int dfs_cache_get_tgt_share ( char * path , const struct dfs_cache_tgt_iterator * it , char * * share ,
char * * prefix ) ;
char * dfs_cache_canonical_path ( const char * path , const struct nls_table * cp , int remap ) ;
2021-07-16 09:26:41 +03:00
int dfs_cache_remount_fs ( struct cifs_sb_info * cifs_sb ) ;
2023-04-27 10:40:08 +03:00
void dfs_cache_refresh ( struct work_struct * work ) ;
2020-02-21 01:49:34 +03:00
2018-11-14 21:01:21 +03:00
static inline struct dfs_cache_tgt_iterator *
dfs_cache_get_next_tgt ( struct dfs_cache_tgt_list * tl ,
struct dfs_cache_tgt_iterator * it )
{
if ( ! tl | | list_empty ( & tl - > tl_list ) | | ! it | |
list_is_last ( & it - > it_list , & tl - > tl_list ) )
return NULL ;
return list_next_entry ( it , it_list ) ;
}
static inline struct dfs_cache_tgt_iterator *
dfs_cache_get_tgt_iterator ( struct dfs_cache_tgt_list * tl )
{
if ( ! tl )
return NULL ;
return list_first_entry_or_null ( & tl - > tl_list ,
struct dfs_cache_tgt_iterator ,
it_list ) ;
}
static inline void dfs_cache_free_tgts ( struct dfs_cache_tgt_list * tl )
{
struct dfs_cache_tgt_iterator * it , * nit ;
if ( ! tl | | list_empty ( & tl - > tl_list ) )
return ;
list_for_each_entry_safe ( it , nit , & tl - > tl_list , it_list ) {
list_del ( & it - > it_list ) ;
kfree ( it - > it_name ) ;
kfree ( it ) ;
}
tl - > tl_numtgts = 0 ;
}
static inline const char *
dfs_cache_get_tgt_name ( const struct dfs_cache_tgt_iterator * it )
{
return it ? it - > it_name : NULL ;
}
static inline int
dfs_cache_get_nr_tgts ( const struct dfs_cache_tgt_list * tl )
{
return tl ? tl - > tl_numtgts : 0 ;
}
2023-04-27 10:40:08 +03:00
static inline int dfs_cache_get_ttl ( void )
{
return atomic_read ( & dfs_cache_ttl ) ;
}
2018-11-14 21:01:21 +03:00
# endif /* _CIFS_DFS_CACHE_H */