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