cifsproto.h (30226B)
1/* SPDX-License-Identifier: LGPL-2.1 */ 2/* 3 * 4 * Copyright (c) International Business Machines Corp., 2002,2008 5 * Author(s): Steve French (sfrench@us.ibm.com) 6 * 7 */ 8#ifndef _CIFSPROTO_H 9#define _CIFSPROTO_H 10#include <linux/nls.h> 11#include "trace.h" 12#ifdef CONFIG_CIFS_DFS_UPCALL 13#include "dfs_cache.h" 14#endif 15 16struct statfs; 17struct smb_rqst; 18struct smb3_fs_context; 19 20/* 21 ***************************************************************** 22 * All Prototypes 23 ***************************************************************** 24 */ 25 26extern struct smb_hdr *cifs_buf_get(void); 27extern void cifs_buf_release(void *); 28extern struct smb_hdr *cifs_small_buf_get(void); 29extern void cifs_small_buf_release(void *); 30extern void free_rsp_buf(int, void *); 31extern int smb_send(struct TCP_Server_Info *, struct smb_hdr *, 32 unsigned int /* length */); 33extern unsigned int _get_xid(void); 34extern void _free_xid(unsigned int); 35#define get_xid() \ 36({ \ 37 unsigned int __xid = _get_xid(); \ 38 cifs_dbg(FYI, "VFS: in %s as Xid: %u with uid: %d\n", \ 39 __func__, __xid, \ 40 from_kuid(&init_user_ns, current_fsuid())); \ 41 trace_smb3_enter(__xid, __func__); \ 42 __xid; \ 43}) 44 45#define free_xid(curr_xid) \ 46do { \ 47 _free_xid(curr_xid); \ 48 cifs_dbg(FYI, "VFS: leaving %s (xid = %u) rc = %d\n", \ 49 __func__, curr_xid, (int)rc); \ 50 if (rc) \ 51 trace_smb3_exit_err(curr_xid, __func__, (int)rc); \ 52 else \ 53 trace_smb3_exit_done(curr_xid, __func__); \ 54} while (0) 55extern int init_cifs_idmap(void); 56extern void exit_cifs_idmap(void); 57extern int init_cifs_spnego(void); 58extern void exit_cifs_spnego(void); 59extern const char *build_path_from_dentry(struct dentry *, void *); 60extern char *build_path_from_dentry_optional_prefix(struct dentry *direntry, 61 void *page, bool prefix); 62static inline void *alloc_dentry_path(void) 63{ 64 return __getname(); 65} 66 67static inline void free_dentry_path(void *page) 68{ 69 if (page) 70 __putname(page); 71} 72 73extern char *cifs_build_path_to_root(struct smb3_fs_context *ctx, 74 struct cifs_sb_info *cifs_sb, 75 struct cifs_tcon *tcon, 76 int add_treename); 77extern char *build_wildcard_path_from_dentry(struct dentry *direntry); 78extern char *cifs_compose_mount_options(const char *sb_mountdata, 79 const char *fullpath, const struct dfs_info3_param *ref, 80 char **devname); 81/* extern void renew_parental_timestamps(struct dentry *direntry);*/ 82extern struct mid_q_entry *AllocMidQEntry(const struct smb_hdr *smb_buffer, 83 struct TCP_Server_Info *server); 84extern void DeleteMidQEntry(struct mid_q_entry *midEntry); 85extern void cifs_delete_mid(struct mid_q_entry *mid); 86extern void cifs_mid_q_entry_release(struct mid_q_entry *midEntry); 87extern void cifs_wake_up_task(struct mid_q_entry *mid); 88extern int cifs_handle_standard(struct TCP_Server_Info *server, 89 struct mid_q_entry *mid); 90extern int smb3_parse_devname(const char *devname, struct smb3_fs_context *ctx); 91extern int smb3_parse_opt(const char *options, const char *key, char **val); 92extern bool cifs_match_ipaddr(struct sockaddr *srcaddr, struct sockaddr *rhs); 93extern int cifs_discard_remaining_data(struct TCP_Server_Info *server); 94extern int cifs_call_async(struct TCP_Server_Info *server, 95 struct smb_rqst *rqst, 96 mid_receive_t *receive, mid_callback_t *callback, 97 mid_handle_t *handle, void *cbdata, const int flags, 98 const struct cifs_credits *exist_credits); 99extern struct TCP_Server_Info *cifs_pick_channel(struct cifs_ses *ses); 100extern int cifs_send_recv(const unsigned int xid, struct cifs_ses *ses, 101 struct TCP_Server_Info *server, 102 struct smb_rqst *rqst, int *resp_buf_type, 103 const int flags, struct kvec *resp_iov); 104extern int compound_send_recv(const unsigned int xid, struct cifs_ses *ses, 105 struct TCP_Server_Info *server, 106 const int flags, const int num_rqst, 107 struct smb_rqst *rqst, int *resp_buf_type, 108 struct kvec *resp_iov); 109extern int SendReceive(const unsigned int /* xid */ , struct cifs_ses *, 110 struct smb_hdr * /* input */ , 111 struct smb_hdr * /* out */ , 112 int * /* bytes returned */ , const int); 113extern int SendReceiveNoRsp(const unsigned int xid, struct cifs_ses *ses, 114 char *in_buf, int flags); 115extern struct mid_q_entry *cifs_setup_request(struct cifs_ses *, 116 struct TCP_Server_Info *, 117 struct smb_rqst *); 118extern struct mid_q_entry *cifs_setup_async_request(struct TCP_Server_Info *, 119 struct smb_rqst *); 120extern int cifs_check_receive(struct mid_q_entry *mid, 121 struct TCP_Server_Info *server, bool log_error); 122extern int cifs_wait_mtu_credits(struct TCP_Server_Info *server, 123 unsigned int size, unsigned int *num, 124 struct cifs_credits *credits); 125extern int SendReceive2(const unsigned int /* xid */ , struct cifs_ses *, 126 struct kvec *, int /* nvec to send */, 127 int * /* type of buf returned */, const int flags, 128 struct kvec * /* resp vec */); 129extern int SendReceiveBlockingLock(const unsigned int xid, 130 struct cifs_tcon *ptcon, 131 struct smb_hdr *in_buf , 132 struct smb_hdr *out_buf, 133 int *bytes_returned); 134void 135cifs_signal_cifsd_for_reconnect(struct TCP_Server_Info *server, 136 bool all_channels); 137void 138cifs_mark_tcp_ses_conns_for_reconnect(struct TCP_Server_Info *server, 139 bool mark_smb_session); 140extern int cifs_reconnect(struct TCP_Server_Info *server, 141 bool mark_smb_session); 142extern int checkSMB(char *buf, unsigned int len, struct TCP_Server_Info *srvr); 143extern bool is_valid_oplock_break(char *, struct TCP_Server_Info *); 144extern bool backup_cred(struct cifs_sb_info *); 145extern bool is_size_safe_to_change(struct cifsInodeInfo *, __u64 eof); 146extern void cifs_update_eof(struct cifsInodeInfo *cifsi, loff_t offset, 147 unsigned int bytes_written); 148extern struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *, int); 149extern int cifs_get_writable_file(struct cifsInodeInfo *cifs_inode, 150 int flags, 151 struct cifsFileInfo **ret_file); 152extern int cifs_get_writable_path(struct cifs_tcon *tcon, const char *name, 153 int flags, 154 struct cifsFileInfo **ret_file); 155extern struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *, bool); 156extern int cifs_get_readable_path(struct cifs_tcon *tcon, const char *name, 157 struct cifsFileInfo **ret_file); 158extern unsigned int smbCalcSize(void *buf, struct TCP_Server_Info *server); 159extern int decode_negTokenInit(unsigned char *security_blob, int length, 160 struct TCP_Server_Info *server); 161extern int cifs_convert_address(struct sockaddr *dst, const char *src, int len); 162extern void cifs_set_port(struct sockaddr *addr, const unsigned short int port); 163extern int map_smb_to_linux_error(char *buf, bool logErr); 164extern int map_and_check_smb_error(struct mid_q_entry *mid, bool logErr); 165extern void header_assemble(struct smb_hdr *, char /* command */ , 166 const struct cifs_tcon *, int /* length of 167 fixed section (word count) in two byte units */); 168extern int small_smb_init_no_tc(const int smb_cmd, const int wct, 169 struct cifs_ses *ses, 170 void **request_buf); 171extern enum securityEnum select_sectype(struct TCP_Server_Info *server, 172 enum securityEnum requested); 173extern int CIFS_SessSetup(const unsigned int xid, struct cifs_ses *ses, 174 struct TCP_Server_Info *server, 175 const struct nls_table *nls_cp); 176extern struct timespec64 cifs_NTtimeToUnix(__le64 utc_nanoseconds_since_1601); 177extern u64 cifs_UnixTimeToNT(struct timespec64); 178extern struct timespec64 cnvrtDosUnixTm(__le16 le_date, __le16 le_time, 179 int offset); 180extern void cifs_set_oplock_level(struct cifsInodeInfo *cinode, __u32 oplock); 181extern int cifs_get_writer(struct cifsInodeInfo *cinode); 182extern void cifs_put_writer(struct cifsInodeInfo *cinode); 183extern void cifs_done_oplock_break(struct cifsInodeInfo *cinode); 184extern int cifs_unlock_range(struct cifsFileInfo *cfile, 185 struct file_lock *flock, const unsigned int xid); 186extern int cifs_push_mandatory_locks(struct cifsFileInfo *cfile); 187 188extern void cifs_down_write(struct rw_semaphore *sem); 189extern struct cifsFileInfo *cifs_new_fileinfo(struct cifs_fid *fid, 190 struct file *file, 191 struct tcon_link *tlink, 192 __u32 oplock); 193extern int cifs_posix_open(const char *full_path, struct inode **inode, 194 struct super_block *sb, int mode, 195 unsigned int f_flags, __u32 *oplock, __u16 *netfid, 196 unsigned int xid); 197void cifs_fill_uniqueid(struct super_block *sb, struct cifs_fattr *fattr); 198extern void cifs_unix_basic_to_fattr(struct cifs_fattr *fattr, 199 FILE_UNIX_BASIC_INFO *info, 200 struct cifs_sb_info *cifs_sb); 201extern void cifs_dir_info_to_fattr(struct cifs_fattr *, FILE_DIRECTORY_INFO *, 202 struct cifs_sb_info *); 203extern int cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr); 204extern struct inode *cifs_iget(struct super_block *sb, 205 struct cifs_fattr *fattr); 206 207extern int cifs_get_inode_info(struct inode **inode, const char *full_path, 208 FILE_ALL_INFO *data, struct super_block *sb, 209 int xid, const struct cifs_fid *fid); 210extern int smb311_posix_get_inode_info(struct inode **pinode, const char *search_path, 211 struct super_block *sb, unsigned int xid); 212extern int cifs_get_inode_info_unix(struct inode **pinode, 213 const unsigned char *search_path, 214 struct super_block *sb, unsigned int xid); 215extern int cifs_set_file_info(struct inode *inode, struct iattr *attrs, 216 unsigned int xid, const char *full_path, __u32 dosattr); 217extern int cifs_rename_pending_delete(const char *full_path, 218 struct dentry *dentry, 219 const unsigned int xid); 220extern int sid_to_id(struct cifs_sb_info *cifs_sb, struct cifs_sid *psid, 221 struct cifs_fattr *fattr, uint sidtype); 222extern int cifs_acl_to_fattr(struct cifs_sb_info *cifs_sb, 223 struct cifs_fattr *fattr, struct inode *inode, 224 bool get_mode_from_special_sid, 225 const char *path, const struct cifs_fid *pfid); 226extern int id_mode_to_cifs_acl(struct inode *inode, const char *path, __u64 *pnmode, 227 kuid_t uid, kgid_t gid); 228extern struct cifs_ntsd *get_cifs_acl(struct cifs_sb_info *, struct inode *, 229 const char *, u32 *, u32); 230extern struct cifs_ntsd *get_cifs_acl_by_fid(struct cifs_sb_info *, 231 const struct cifs_fid *, u32 *, u32); 232extern int set_cifs_acl(struct cifs_ntsd *, __u32, struct inode *, 233 const char *, int); 234extern unsigned int setup_authusers_ACE(struct cifs_ace *pace); 235extern unsigned int setup_special_mode_ACE(struct cifs_ace *pace, __u64 nmode); 236extern unsigned int setup_special_user_owner_ACE(struct cifs_ace *pace); 237 238extern void dequeue_mid(struct mid_q_entry *mid, bool malformed); 239extern int cifs_read_from_socket(struct TCP_Server_Info *server, char *buf, 240 unsigned int to_read); 241extern ssize_t cifs_discard_from_socket(struct TCP_Server_Info *server, 242 size_t to_read); 243extern int cifs_read_page_from_socket(struct TCP_Server_Info *server, 244 struct page *page, 245 unsigned int page_offset, 246 unsigned int to_read); 247extern int cifs_setup_cifs_sb(struct cifs_sb_info *cifs_sb); 248extern int cifs_match_super(struct super_block *, void *); 249extern int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx); 250extern void cifs_umount(struct cifs_sb_info *); 251extern void cifs_mark_open_files_invalid(struct cifs_tcon *tcon); 252extern void cifs_reopen_persistent_handles(struct cifs_tcon *tcon); 253 254extern bool cifs_find_lock_conflict(struct cifsFileInfo *cfile, __u64 offset, 255 __u64 length, __u8 type, __u16 flags, 256 struct cifsLockInfo **conf_lock, 257 int rw_check); 258extern void cifs_add_pending_open(struct cifs_fid *fid, 259 struct tcon_link *tlink, 260 struct cifs_pending_open *open); 261extern void cifs_add_pending_open_locked(struct cifs_fid *fid, 262 struct tcon_link *tlink, 263 struct cifs_pending_open *open); 264extern void cifs_del_pending_open(struct cifs_pending_open *open); 265 266extern bool cifs_is_deferred_close(struct cifsFileInfo *cfile, 267 struct cifs_deferred_close **dclose); 268 269extern void cifs_add_deferred_close(struct cifsFileInfo *cfile, 270 struct cifs_deferred_close *dclose); 271 272extern void cifs_del_deferred_close(struct cifsFileInfo *cfile); 273 274extern void cifs_close_deferred_file(struct cifsInodeInfo *cifs_inode); 275 276extern void cifs_close_all_deferred_files(struct cifs_tcon *cifs_tcon); 277 278extern void cifs_close_deferred_file_under_dentry(struct cifs_tcon *cifs_tcon, 279 const char *path); 280extern struct TCP_Server_Info * 281cifs_get_tcp_session(struct smb3_fs_context *ctx, 282 struct TCP_Server_Info *primary_server); 283extern void cifs_put_tcp_session(struct TCP_Server_Info *server, 284 int from_reconnect); 285extern void cifs_put_tcon(struct cifs_tcon *tcon); 286 287#if IS_ENABLED(CONFIG_CIFS_DFS_UPCALL) 288extern void cifs_dfs_release_automount_timer(void); 289#else /* ! IS_ENABLED(CONFIG_CIFS_DFS_UPCALL) */ 290#define cifs_dfs_release_automount_timer() do { } while (0) 291#endif /* ! IS_ENABLED(CONFIG_CIFS_DFS_UPCALL) */ 292 293void cifs_proc_init(void); 294void cifs_proc_clean(void); 295 296extern void cifs_move_llist(struct list_head *source, struct list_head *dest); 297extern void cifs_free_llist(struct list_head *llist); 298extern void cifs_del_lock_waiters(struct cifsLockInfo *lock); 299 300extern int cifs_tree_connect(const unsigned int xid, struct cifs_tcon *tcon, 301 const struct nls_table *nlsc); 302 303extern int cifs_negotiate_protocol(const unsigned int xid, 304 struct cifs_ses *ses, 305 struct TCP_Server_Info *server); 306extern int cifs_setup_session(const unsigned int xid, struct cifs_ses *ses, 307 struct TCP_Server_Info *server, 308 struct nls_table *nls_info); 309extern int cifs_enable_signing(struct TCP_Server_Info *server, bool mnt_sign_required); 310extern int CIFSSMBNegotiate(const unsigned int xid, 311 struct cifs_ses *ses, 312 struct TCP_Server_Info *server); 313 314extern int CIFSTCon(const unsigned int xid, struct cifs_ses *ses, 315 const char *tree, struct cifs_tcon *tcon, 316 const struct nls_table *); 317 318extern int CIFSFindFirst(const unsigned int xid, struct cifs_tcon *tcon, 319 const char *searchName, struct cifs_sb_info *cifs_sb, 320 __u16 *searchHandle, __u16 search_flags, 321 struct cifs_search_info *psrch_inf, 322 bool msearch); 323 324extern int CIFSFindNext(const unsigned int xid, struct cifs_tcon *tcon, 325 __u16 searchHandle, __u16 search_flags, 326 struct cifs_search_info *psrch_inf); 327 328extern int CIFSFindClose(const unsigned int xid, struct cifs_tcon *tcon, 329 const __u16 search_handle); 330 331extern int CIFSSMBQFileInfo(const unsigned int xid, struct cifs_tcon *tcon, 332 u16 netfid, FILE_ALL_INFO *pFindData); 333extern int CIFSSMBQPathInfo(const unsigned int xid, struct cifs_tcon *tcon, 334 const char *search_Name, FILE_ALL_INFO *data, 335 int legacy /* whether to use old info level */, 336 const struct nls_table *nls_codepage, int remap); 337extern int SMBQueryInformation(const unsigned int xid, struct cifs_tcon *tcon, 338 const char *search_name, FILE_ALL_INFO *data, 339 const struct nls_table *nls_codepage, int remap); 340 341extern int CIFSSMBUnixQFileInfo(const unsigned int xid, struct cifs_tcon *tcon, 342 u16 netfid, FILE_UNIX_BASIC_INFO *pFindData); 343extern int CIFSSMBUnixQPathInfo(const unsigned int xid, 344 struct cifs_tcon *tcon, 345 const unsigned char *searchName, 346 FILE_UNIX_BASIC_INFO *pFindData, 347 const struct nls_table *nls_codepage, int remap); 348 349extern int CIFSGetDFSRefer(const unsigned int xid, struct cifs_ses *ses, 350 const char *search_name, 351 struct dfs_info3_param **target_nodes, 352 unsigned int *num_of_nodes, 353 const struct nls_table *nls_codepage, int remap); 354 355extern int parse_dfs_referrals(struct get_dfs_referral_rsp *rsp, u32 rsp_size, 356 unsigned int *num_of_nodes, 357 struct dfs_info3_param **target_nodes, 358 const struct nls_table *nls_codepage, int remap, 359 const char *searchName, bool is_unicode); 360extern void reset_cifs_unix_caps(unsigned int xid, struct cifs_tcon *tcon, 361 struct cifs_sb_info *cifs_sb, 362 struct smb3_fs_context *ctx); 363extern int CIFSSMBQFSInfo(const unsigned int xid, struct cifs_tcon *tcon, 364 struct kstatfs *FSData); 365extern int SMBOldQFSInfo(const unsigned int xid, struct cifs_tcon *tcon, 366 struct kstatfs *FSData); 367extern int CIFSSMBSetFSUnixInfo(const unsigned int xid, struct cifs_tcon *tcon, 368 __u64 cap); 369 370extern int CIFSSMBQFSAttributeInfo(const unsigned int xid, 371 struct cifs_tcon *tcon); 372extern int CIFSSMBQFSDeviceInfo(const unsigned int xid, struct cifs_tcon *tcon); 373extern int CIFSSMBQFSUnixInfo(const unsigned int xid, struct cifs_tcon *tcon); 374extern int CIFSSMBQFSPosixInfo(const unsigned int xid, struct cifs_tcon *tcon, 375 struct kstatfs *FSData); 376 377extern int CIFSSMBSetPathInfo(const unsigned int xid, struct cifs_tcon *tcon, 378 const char *fileName, const FILE_BASIC_INFO *data, 379 const struct nls_table *nls_codepage, 380 struct cifs_sb_info *cifs_sb); 381extern int CIFSSMBSetFileInfo(const unsigned int xid, struct cifs_tcon *tcon, 382 const FILE_BASIC_INFO *data, __u16 fid, 383 __u32 pid_of_opener); 384extern int CIFSSMBSetFileDisposition(const unsigned int xid, 385 struct cifs_tcon *tcon, 386 bool delete_file, __u16 fid, 387 __u32 pid_of_opener); 388extern int CIFSSMBSetEOF(const unsigned int xid, struct cifs_tcon *tcon, 389 const char *file_name, __u64 size, 390 struct cifs_sb_info *cifs_sb, bool set_allocation); 391extern int CIFSSMBSetFileSize(const unsigned int xid, struct cifs_tcon *tcon, 392 struct cifsFileInfo *cfile, __u64 size, 393 bool set_allocation); 394 395struct cifs_unix_set_info_args { 396 __u64 ctime; 397 __u64 atime; 398 __u64 mtime; 399 __u64 mode; 400 kuid_t uid; 401 kgid_t gid; 402 dev_t device; 403}; 404 405extern int CIFSSMBUnixSetFileInfo(const unsigned int xid, 406 struct cifs_tcon *tcon, 407 const struct cifs_unix_set_info_args *args, 408 u16 fid, u32 pid_of_opener); 409 410extern int CIFSSMBUnixSetPathInfo(const unsigned int xid, 411 struct cifs_tcon *tcon, const char *file_name, 412 const struct cifs_unix_set_info_args *args, 413 const struct nls_table *nls_codepage, 414 int remap); 415 416extern int CIFSSMBMkDir(const unsigned int xid, struct inode *inode, 417 umode_t mode, struct cifs_tcon *tcon, 418 const char *name, struct cifs_sb_info *cifs_sb); 419extern int CIFSSMBRmDir(const unsigned int xid, struct cifs_tcon *tcon, 420 const char *name, struct cifs_sb_info *cifs_sb); 421extern int CIFSPOSIXDelFile(const unsigned int xid, struct cifs_tcon *tcon, 422 const char *name, __u16 type, 423 const struct nls_table *nls_codepage, 424 int remap_special_chars); 425extern int CIFSSMBDelFile(const unsigned int xid, struct cifs_tcon *tcon, 426 const char *name, struct cifs_sb_info *cifs_sb); 427extern int CIFSSMBRename(const unsigned int xid, struct cifs_tcon *tcon, 428 const char *from_name, const char *to_name, 429 struct cifs_sb_info *cifs_sb); 430extern int CIFSSMBRenameOpenFile(const unsigned int xid, struct cifs_tcon *tcon, 431 int netfid, const char *target_name, 432 const struct nls_table *nls_codepage, 433 int remap_special_chars); 434extern int CIFSCreateHardLink(const unsigned int xid, struct cifs_tcon *tcon, 435 const char *from_name, const char *to_name, 436 struct cifs_sb_info *cifs_sb); 437extern int CIFSUnixCreateHardLink(const unsigned int xid, 438 struct cifs_tcon *tcon, 439 const char *fromName, const char *toName, 440 const struct nls_table *nls_codepage, 441 int remap_special_chars); 442extern int CIFSUnixCreateSymLink(const unsigned int xid, 443 struct cifs_tcon *tcon, 444 const char *fromName, const char *toName, 445 const struct nls_table *nls_codepage, int remap); 446extern int CIFSSMBUnixQuerySymLink(const unsigned int xid, 447 struct cifs_tcon *tcon, 448 const unsigned char *searchName, char **syminfo, 449 const struct nls_table *nls_codepage, int remap); 450extern int CIFSSMBQuerySymLink(const unsigned int xid, struct cifs_tcon *tcon, 451 __u16 fid, char **symlinkinfo, 452 const struct nls_table *nls_codepage); 453extern int CIFSSMB_set_compression(const unsigned int xid, 454 struct cifs_tcon *tcon, __u16 fid); 455extern int CIFS_open(const unsigned int xid, struct cifs_open_parms *oparms, 456 int *oplock, FILE_ALL_INFO *buf); 457extern int SMBLegacyOpen(const unsigned int xid, struct cifs_tcon *tcon, 458 const char *fileName, const int disposition, 459 const int access_flags, const int omode, 460 __u16 *netfid, int *pOplock, FILE_ALL_INFO *, 461 const struct nls_table *nls_codepage, int remap); 462extern int CIFSPOSIXCreate(const unsigned int xid, struct cifs_tcon *tcon, 463 u32 posix_flags, __u64 mode, __u16 *netfid, 464 FILE_UNIX_BASIC_INFO *pRetData, 465 __u32 *pOplock, const char *name, 466 const struct nls_table *nls_codepage, int remap); 467extern int CIFSSMBClose(const unsigned int xid, struct cifs_tcon *tcon, 468 const int smb_file_id); 469 470extern int CIFSSMBFlush(const unsigned int xid, struct cifs_tcon *tcon, 471 const int smb_file_id); 472 473extern int CIFSSMBRead(const unsigned int xid, struct cifs_io_parms *io_parms, 474 unsigned int *nbytes, char **buf, 475 int *return_buf_type); 476extern int CIFSSMBWrite(const unsigned int xid, struct cifs_io_parms *io_parms, 477 unsigned int *nbytes, const char *buf); 478extern int CIFSSMBWrite2(const unsigned int xid, struct cifs_io_parms *io_parms, 479 unsigned int *nbytes, struct kvec *iov, const int nvec); 480extern int CIFSGetSrvInodeNumber(const unsigned int xid, struct cifs_tcon *tcon, 481 const char *search_name, __u64 *inode_number, 482 const struct nls_table *nls_codepage, 483 int remap); 484 485extern int cifs_lockv(const unsigned int xid, struct cifs_tcon *tcon, 486 const __u16 netfid, const __u8 lock_type, 487 const __u32 num_unlock, const __u32 num_lock, 488 LOCKING_ANDX_RANGE *buf); 489extern int CIFSSMBLock(const unsigned int xid, struct cifs_tcon *tcon, 490 const __u16 netfid, const __u32 netpid, const __u64 len, 491 const __u64 offset, const __u32 numUnlock, 492 const __u32 numLock, const __u8 lockType, 493 const bool waitFlag, const __u8 oplock_level); 494extern int CIFSSMBPosixLock(const unsigned int xid, struct cifs_tcon *tcon, 495 const __u16 smb_file_id, const __u32 netpid, 496 const loff_t start_offset, const __u64 len, 497 struct file_lock *, const __u16 lock_type, 498 const bool waitFlag); 499extern int CIFSSMBTDis(const unsigned int xid, struct cifs_tcon *tcon); 500extern int CIFSSMBEcho(struct TCP_Server_Info *server); 501extern int CIFSSMBLogoff(const unsigned int xid, struct cifs_ses *ses); 502 503extern struct cifs_ses *sesInfoAlloc(void); 504extern void sesInfoFree(struct cifs_ses *); 505extern struct cifs_tcon *tconInfoAlloc(void); 506extern void tconInfoFree(struct cifs_tcon *); 507 508extern int cifs_sign_rqst(struct smb_rqst *rqst, struct TCP_Server_Info *server, 509 __u32 *pexpected_response_sequence_number); 510extern int cifs_sign_smbv(struct kvec *iov, int n_vec, struct TCP_Server_Info *, 511 __u32 *); 512extern int cifs_sign_smb(struct smb_hdr *, struct TCP_Server_Info *, __u32 *); 513extern int cifs_verify_signature(struct smb_rqst *rqst, 514 struct TCP_Server_Info *server, 515 __u32 expected_sequence_number); 516extern int setup_ntlmv2_rsp(struct cifs_ses *, const struct nls_table *); 517extern void cifs_crypto_secmech_release(struct TCP_Server_Info *server); 518extern int calc_seckey(struct cifs_ses *); 519extern int generate_smb30signingkey(struct cifs_ses *ses, 520 struct TCP_Server_Info *server); 521extern int generate_smb311signingkey(struct cifs_ses *ses, 522 struct TCP_Server_Info *server); 523 524extern int CIFSSMBCopy(unsigned int xid, 525 struct cifs_tcon *source_tcon, 526 const char *fromName, 527 const __u16 target_tid, 528 const char *toName, const int flags, 529 const struct nls_table *nls_codepage, 530 int remap_special_chars); 531extern ssize_t CIFSSMBQAllEAs(const unsigned int xid, struct cifs_tcon *tcon, 532 const unsigned char *searchName, 533 const unsigned char *ea_name, char *EAData, 534 size_t bufsize, struct cifs_sb_info *cifs_sb); 535extern int CIFSSMBSetEA(const unsigned int xid, struct cifs_tcon *tcon, 536 const char *fileName, const char *ea_name, 537 const void *ea_value, const __u16 ea_value_len, 538 const struct nls_table *nls_codepage, 539 struct cifs_sb_info *cifs_sb); 540extern int CIFSSMBGetCIFSACL(const unsigned int xid, struct cifs_tcon *tcon, 541 __u16 fid, struct cifs_ntsd **acl_inf, __u32 *buflen); 542extern int CIFSSMBSetCIFSACL(const unsigned int, struct cifs_tcon *, __u16, 543 struct cifs_ntsd *, __u32, int); 544extern int CIFSSMBGetPosixACL(const unsigned int xid, struct cifs_tcon *tcon, 545 const unsigned char *searchName, 546 char *acl_inf, const int buflen, const int acl_type, 547 const struct nls_table *nls_codepage, int remap_special_chars); 548extern int CIFSSMBSetPosixACL(const unsigned int xid, struct cifs_tcon *tcon, 549 const unsigned char *fileName, 550 const char *local_acl, const int buflen, const int acl_type, 551 const struct nls_table *nls_codepage, int remap_special_chars); 552extern int CIFSGetExtAttr(const unsigned int xid, struct cifs_tcon *tcon, 553 const int netfid, __u64 *pExtAttrBits, __u64 *pMask); 554extern void cifs_autodisable_serverino(struct cifs_sb_info *cifs_sb); 555extern bool couldbe_mf_symlink(const struct cifs_fattr *fattr); 556extern int check_mf_symlink(unsigned int xid, struct cifs_tcon *tcon, 557 struct cifs_sb_info *cifs_sb, 558 struct cifs_fattr *fattr, 559 const unsigned char *path); 560extern int E_md4hash(const unsigned char *passwd, unsigned char *p16, 561 const struct nls_table *codepage); 562 563extern int 564cifs_setup_volume_info(struct smb3_fs_context *ctx, const char *mntopts, const char *devname); 565 566extern struct TCP_Server_Info * 567cifs_find_tcp_session(struct smb3_fs_context *ctx); 568 569extern void cifs_put_smb_ses(struct cifs_ses *ses); 570 571extern struct cifs_ses * 572cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb3_fs_context *ctx); 573 574void cifs_readdata_release(struct kref *refcount); 575int cifs_async_readv(struct cifs_readdata *rdata); 576int cifs_readv_receive(struct TCP_Server_Info *server, struct mid_q_entry *mid); 577 578int cifs_async_writev(struct cifs_writedata *wdata, 579 void (*release)(struct kref *kref)); 580void cifs_writev_complete(struct work_struct *work); 581struct cifs_writedata *cifs_writedata_alloc(unsigned int nr_pages, 582 work_func_t complete); 583struct cifs_writedata *cifs_writedata_direct_alloc(struct page **pages, 584 work_func_t complete); 585void cifs_writedata_release(struct kref *refcount); 586int cifs_query_mf_symlink(unsigned int xid, struct cifs_tcon *tcon, 587 struct cifs_sb_info *cifs_sb, 588 const unsigned char *path, char *pbuf, 589 unsigned int *pbytes_read); 590int cifs_create_mf_symlink(unsigned int xid, struct cifs_tcon *tcon, 591 struct cifs_sb_info *cifs_sb, 592 const unsigned char *path, char *pbuf, 593 unsigned int *pbytes_written); 594int __cifs_calc_signature(struct smb_rqst *rqst, 595 struct TCP_Server_Info *server, char *signature, 596 struct shash_desc *shash); 597enum securityEnum cifs_select_sectype(struct TCP_Server_Info *, 598 enum securityEnum); 599struct cifs_aio_ctx *cifs_aio_ctx_alloc(void); 600void cifs_aio_ctx_release(struct kref *refcount); 601int setup_aio_ctx_iter(struct cifs_aio_ctx *ctx, struct iov_iter *iter, int rw); 602void smb2_cached_lease_break(struct work_struct *work); 603 604int cifs_alloc_hash(const char *name, struct crypto_shash **shash, 605 struct sdesc **sdesc); 606void cifs_free_hash(struct crypto_shash **shash, struct sdesc **sdesc); 607 608extern void rqst_page_get_length(struct smb_rqst *rqst, unsigned int page, 609 unsigned int *len, unsigned int *offset); 610struct cifs_chan * 611cifs_ses_find_chan(struct cifs_ses *ses, struct TCP_Server_Info *server); 612int cifs_try_adding_channels(struct cifs_sb_info *cifs_sb, struct cifs_ses *ses); 613bool is_server_using_iface(struct TCP_Server_Info *server, 614 struct cifs_server_iface *iface); 615bool is_ses_using_iface(struct cifs_ses *ses, struct cifs_server_iface *iface); 616void cifs_ses_mark_for_reconnect(struct cifs_ses *ses); 617 618unsigned int 619cifs_ses_get_chan_index(struct cifs_ses *ses, 620 struct TCP_Server_Info *server); 621void 622cifs_chan_set_in_reconnect(struct cifs_ses *ses, 623 struct TCP_Server_Info *server); 624void 625cifs_chan_clear_in_reconnect(struct cifs_ses *ses, 626 struct TCP_Server_Info *server); 627bool 628cifs_chan_in_reconnect(struct cifs_ses *ses, 629 struct TCP_Server_Info *server); 630void 631cifs_chan_set_need_reconnect(struct cifs_ses *ses, 632 struct TCP_Server_Info *server); 633void 634cifs_chan_clear_need_reconnect(struct cifs_ses *ses, 635 struct TCP_Server_Info *server); 636bool 637cifs_chan_needs_reconnect(struct cifs_ses *ses, 638 struct TCP_Server_Info *server); 639bool 640cifs_chan_is_iface_active(struct cifs_ses *ses, 641 struct TCP_Server_Info *server); 642int 643cifs_chan_update_iface(struct cifs_ses *ses, struct TCP_Server_Info *server); 644int 645SMB3_request_interfaces(const unsigned int xid, struct cifs_tcon *tcon); 646 647void extract_unc_hostname(const char *unc, const char **h, size_t *len); 648int copy_path_name(char *dst, const char *src); 649int smb2_parse_query_directory(struct cifs_tcon *tcon, struct kvec *rsp_iov, 650 int resp_buftype, 651 struct cifs_search_info *srch_inf); 652 653struct super_block *cifs_get_tcp_super(struct TCP_Server_Info *server); 654void cifs_put_tcp_super(struct super_block *sb); 655int cifs_update_super_prepath(struct cifs_sb_info *cifs_sb, char *prefix); 656char *extract_hostname(const char *unc); 657char *extract_sharename(const char *unc); 658 659#ifdef CONFIG_CIFS_DFS_UPCALL 660static inline int get_dfs_path(const unsigned int xid, struct cifs_ses *ses, 661 const char *old_path, 662 const struct nls_table *nls_codepage, 663 struct dfs_info3_param *referral, int remap) 664{ 665 return dfs_cache_find(xid, ses, nls_codepage, remap, old_path, 666 referral, NULL); 667} 668 669int match_target_ip(struct TCP_Server_Info *server, 670 const char *share, size_t share_len, 671 bool *result); 672 673int cifs_dfs_query_info_nonascii_quirk(const unsigned int xid, 674 struct cifs_tcon *tcon, 675 struct cifs_sb_info *cifs_sb, 676 const char *dfs_link_path); 677#endif 678 679static inline int cifs_create_options(struct cifs_sb_info *cifs_sb, int options) 680{ 681 if (cifs_sb && (backup_cred(cifs_sb))) 682 return options | CREATE_OPEN_BACKUP_INTENT; 683 else 684 return options; 685} 686 687struct super_block *cifs_get_tcon_super(struct cifs_tcon *tcon); 688void cifs_put_tcon_super(struct super_block *sb); 689 690#endif /* _CIFSPROTO_H */