1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3 * SMB1 (CIFS) version specific operations
4 *
5 * Copyright (c) 2012, Jeff Layton <jlayton@redhat.com>
6 */
7
8 #include <linux/pagemap.h>
9 #include <linux/vfs.h>
10 #include <uapi/linux/magic.h>
11 #include "cifsglob.h"
12 #include "cifsproto.h"
13 #include "cifs_debug.h"
14 #include "cifspdu.h"
15 #include "cifs_unicode.h"
16 #include "fs_context.h"
17
18 /*
19 * An NT cancel request header looks just like the original request except:
20 *
21 * The Command is SMB_COM_NT_CANCEL
22 * The WordCount is zeroed out
23 * The ByteCount is zeroed out
24 *
25 * This function mangles an existing request buffer into a
26 * SMB_COM_NT_CANCEL request and then sends it.
27 */
28 static int
send_nt_cancel(struct TCP_Server_Info * server,struct smb_rqst * rqst,struct mid_q_entry * mid)29 send_nt_cancel(struct TCP_Server_Info *server, struct smb_rqst *rqst,
30 struct mid_q_entry *mid)
31 {
32 int rc = 0;
33 struct smb_hdr *in_buf = (struct smb_hdr *)rqst->rq_iov[0].iov_base;
34
35 /* -4 for RFC1001 length and +2 for BCC field */
36 in_buf->smb_buf_length = cpu_to_be32(sizeof(struct smb_hdr) - 4 + 2);
37 in_buf->Command = SMB_COM_NT_CANCEL;
38 in_buf->WordCount = 0;
39 put_bcc(0, in_buf);
40
41 cifs_server_lock(server);
42 rc = cifs_sign_smb(in_buf, server, &mid->sequence_number);
43 if (rc) {
44 cifs_server_unlock(server);
45 return rc;
46 }
47
48 /*
49 * The response to this call was already factored into the sequence
50 * number when the call went out, so we must adjust it back downward
51 * after signing here.
52 */
53 --server->sequence_number;
54 rc = smb_send(server, in_buf, be32_to_cpu(in_buf->smb_buf_length));
55 if (rc < 0)
56 server->sequence_number--;
57
58 cifs_server_unlock(server);
59
60 cifs_dbg(FYI, "issued NT_CANCEL for mid %u, rc = %d\n",
61 get_mid(in_buf), rc);
62
63 return rc;
64 }
65
66 static bool
cifs_compare_fids(struct cifsFileInfo * ob1,struct cifsFileInfo * ob2)67 cifs_compare_fids(struct cifsFileInfo *ob1, struct cifsFileInfo *ob2)
68 {
69 return ob1->fid.netfid == ob2->fid.netfid;
70 }
71
72 static unsigned int
cifs_read_data_offset(char * buf)73 cifs_read_data_offset(char *buf)
74 {
75 READ_RSP *rsp = (READ_RSP *)buf;
76 return le16_to_cpu(rsp->DataOffset);
77 }
78
79 static unsigned int
cifs_read_data_length(char * buf,bool in_remaining)80 cifs_read_data_length(char *buf, bool in_remaining)
81 {
82 READ_RSP *rsp = (READ_RSP *)buf;
83 /* It's a bug reading remaining data for SMB1 packets */
84 WARN_ON(in_remaining);
85 return (le16_to_cpu(rsp->DataLengthHigh) << 16) +
86 le16_to_cpu(rsp->DataLength);
87 }
88
89 static struct mid_q_entry *
cifs_find_mid(struct TCP_Server_Info * server,char * buffer)90 cifs_find_mid(struct TCP_Server_Info *server, char *buffer)
91 {
92 struct smb_hdr *buf = (struct smb_hdr *)buffer;
93 struct mid_q_entry *mid;
94
95 spin_lock(&server->mid_lock);
96 list_for_each_entry(mid, &server->pending_mid_q, qhead) {
97 if (compare_mid(mid->mid, buf) &&
98 mid->mid_state == MID_REQUEST_SUBMITTED &&
99 le16_to_cpu(mid->command) == buf->Command) {
100 kref_get(&mid->refcount);
101 spin_unlock(&server->mid_lock);
102 return mid;
103 }
104 }
105 spin_unlock(&server->mid_lock);
106 return NULL;
107 }
108
109 static void
cifs_add_credits(struct TCP_Server_Info * server,const struct cifs_credits * credits,const int optype)110 cifs_add_credits(struct TCP_Server_Info *server,
111 const struct cifs_credits *credits, const int optype)
112 {
113 spin_lock(&server->req_lock);
114 server->credits += credits->value;
115 server->in_flight--;
116 spin_unlock(&server->req_lock);
117 wake_up(&server->request_q);
118 }
119
120 static void
cifs_set_credits(struct TCP_Server_Info * server,const int val)121 cifs_set_credits(struct TCP_Server_Info *server, const int val)
122 {
123 spin_lock(&server->req_lock);
124 server->credits = val;
125 server->oplocks = val > 1 ? enable_oplocks : false;
126 spin_unlock(&server->req_lock);
127 }
128
129 static int *
cifs_get_credits_field(struct TCP_Server_Info * server,const int optype)130 cifs_get_credits_field(struct TCP_Server_Info *server, const int optype)
131 {
132 return &server->credits;
133 }
134
135 static unsigned int
cifs_get_credits(struct mid_q_entry * mid)136 cifs_get_credits(struct mid_q_entry *mid)
137 {
138 return 1;
139 }
140
141 /*
142 * Find a free multiplex id (SMB mid). Otherwise there could be
143 * mid collisions which might cause problems, demultiplexing the
144 * wrong response to this request. Multiplex ids could collide if
145 * one of a series requests takes much longer than the others, or
146 * if a very large number of long lived requests (byte range
147 * locks or FindNotify requests) are pending. No more than
148 * 64K-1 requests can be outstanding at one time. If no
149 * mids are available, return zero. A future optimization
150 * could make the combination of mids and uid the key we use
151 * to demultiplex on (rather than mid alone).
152 * In addition to the above check, the cifs demultiplex
153 * code already used the command code as a secondary
154 * check of the frame and if signing is negotiated the
155 * response would be discarded if the mid were the same
156 * but the signature was wrong. Since the mid is not put in the
157 * pending queue until later (when it is about to be dispatched)
158 * we do have to limit the number of outstanding requests
159 * to somewhat less than 64K-1 although it is hard to imagine
160 * so many threads being in the vfs at one time.
161 */
162 static __u64
cifs_get_next_mid(struct TCP_Server_Info * server)163 cifs_get_next_mid(struct TCP_Server_Info *server)
164 {
165 __u64 mid = 0;
166 __u16 last_mid, cur_mid;
167 bool collision, reconnect = false;
168
169 spin_lock(&server->mid_lock);
170
171 /* mid is 16 bit only for CIFS/SMB */
172 cur_mid = (__u16)((server->CurrentMid) & 0xffff);
173 /* we do not want to loop forever */
174 last_mid = cur_mid;
175 cur_mid++;
176 /* avoid 0xFFFF MID */
177 if (cur_mid == 0xffff)
178 cur_mid++;
179
180 /*
181 * This nested loop looks more expensive than it is.
182 * In practice the list of pending requests is short,
183 * fewer than 50, and the mids are likely to be unique
184 * on the first pass through the loop unless some request
185 * takes longer than the 64 thousand requests before it
186 * (and it would also have to have been a request that
187 * did not time out).
188 */
189 while (cur_mid != last_mid) {
190 struct mid_q_entry *mid_entry;
191 unsigned int num_mids;
192
193 collision = false;
194 if (cur_mid == 0)
195 cur_mid++;
196
197 num_mids = 0;
198 list_for_each_entry(mid_entry, &server->pending_mid_q, qhead) {
199 ++num_mids;
200 if (mid_entry->mid == cur_mid &&
201 mid_entry->mid_state == MID_REQUEST_SUBMITTED) {
202 /* This mid is in use, try a different one */
203 collision = true;
204 break;
205 }
206 }
207
208 /*
209 * if we have more than 32k mids in the list, then something
210 * is very wrong. Possibly a local user is trying to DoS the
211 * box by issuing long-running calls and SIGKILL'ing them. If
212 * we get to 2^16 mids then we're in big trouble as this
213 * function could loop forever.
214 *
215 * Go ahead and assign out the mid in this situation, but force
216 * an eventual reconnect to clean out the pending_mid_q.
217 */
218 if (num_mids > 32768)
219 reconnect = true;
220
221 if (!collision) {
222 mid = (__u64)cur_mid;
223 server->CurrentMid = mid;
224 break;
225 }
226 cur_mid++;
227 }
228 spin_unlock(&server->mid_lock);
229
230 if (reconnect) {
231 cifs_signal_cifsd_for_reconnect(server, false);
232 }
233
234 return mid;
235 }
236
237 /*
238 return codes:
239 0 not a transact2, or all data present
240 >0 transact2 with that much data missing
241 -EINVAL invalid transact2
242 */
243 static int
check2ndT2(char * buf)244 check2ndT2(char *buf)
245 {
246 struct smb_hdr *pSMB = (struct smb_hdr *)buf;
247 struct smb_t2_rsp *pSMBt;
248 int remaining;
249 __u16 total_data_size, data_in_this_rsp;
250
251 if (pSMB->Command != SMB_COM_TRANSACTION2)
252 return 0;
253
254 /* check for plausible wct, bcc and t2 data and parm sizes */
255 /* check for parm and data offset going beyond end of smb */
256 if (pSMB->WordCount != 10) { /* coalesce_t2 depends on this */
257 cifs_dbg(FYI, "Invalid transact2 word count\n");
258 return -EINVAL;
259 }
260
261 pSMBt = (struct smb_t2_rsp *)pSMB;
262
263 total_data_size = get_unaligned_le16(&pSMBt->t2_rsp.TotalDataCount);
264 data_in_this_rsp = get_unaligned_le16(&pSMBt->t2_rsp.DataCount);
265
266 if (total_data_size == data_in_this_rsp)
267 return 0;
268 else if (total_data_size < data_in_this_rsp) {
269 cifs_dbg(FYI, "total data %d smaller than data in frame %d\n",
270 total_data_size, data_in_this_rsp);
271 return -EINVAL;
272 }
273
274 remaining = total_data_size - data_in_this_rsp;
275
276 cifs_dbg(FYI, "missing %d bytes from transact2, check next response\n",
277 remaining);
278 if (total_data_size > CIFSMaxBufSize) {
279 cifs_dbg(VFS, "TotalDataSize %d is over maximum buffer %d\n",
280 total_data_size, CIFSMaxBufSize);
281 return -EINVAL;
282 }
283 return remaining;
284 }
285
286 static int
coalesce_t2(char * second_buf,struct smb_hdr * target_hdr)287 coalesce_t2(char *second_buf, struct smb_hdr *target_hdr)
288 {
289 struct smb_t2_rsp *pSMBs = (struct smb_t2_rsp *)second_buf;
290 struct smb_t2_rsp *pSMBt = (struct smb_t2_rsp *)target_hdr;
291 char *data_area_of_tgt;
292 char *data_area_of_src;
293 int remaining;
294 unsigned int byte_count, total_in_tgt;
295 __u16 tgt_total_cnt, src_total_cnt, total_in_src;
296
297 src_total_cnt = get_unaligned_le16(&pSMBs->t2_rsp.TotalDataCount);
298 tgt_total_cnt = get_unaligned_le16(&pSMBt->t2_rsp.TotalDataCount);
299
300 if (tgt_total_cnt != src_total_cnt)
301 cifs_dbg(FYI, "total data count of primary and secondary t2 differ source=%hu target=%hu\n",
302 src_total_cnt, tgt_total_cnt);
303
304 total_in_tgt = get_unaligned_le16(&pSMBt->t2_rsp.DataCount);
305
306 remaining = tgt_total_cnt - total_in_tgt;
307
308 if (remaining < 0) {
309 cifs_dbg(FYI, "Server sent too much data. tgt_total_cnt=%hu total_in_tgt=%u\n",
310 tgt_total_cnt, total_in_tgt);
311 return -EPROTO;
312 }
313
314 if (remaining == 0) {
315 /* nothing to do, ignore */
316 cifs_dbg(FYI, "no more data remains\n");
317 return 0;
318 }
319
320 total_in_src = get_unaligned_le16(&pSMBs->t2_rsp.DataCount);
321 if (remaining < total_in_src)
322 cifs_dbg(FYI, "transact2 2nd response contains too much data\n");
323
324 /* find end of first SMB data area */
325 data_area_of_tgt = (char *)&pSMBt->hdr.Protocol +
326 get_unaligned_le16(&pSMBt->t2_rsp.DataOffset);
327
328 /* validate target area */
329 data_area_of_src = (char *)&pSMBs->hdr.Protocol +
330 get_unaligned_le16(&pSMBs->t2_rsp.DataOffset);
331
332 data_area_of_tgt += total_in_tgt;
333
334 total_in_tgt += total_in_src;
335 /* is the result too big for the field? */
336 if (total_in_tgt > USHRT_MAX) {
337 cifs_dbg(FYI, "coalesced DataCount too large (%u)\n",
338 total_in_tgt);
339 return -EPROTO;
340 }
341 put_unaligned_le16(total_in_tgt, &pSMBt->t2_rsp.DataCount);
342
343 /* fix up the BCC */
344 byte_count = get_bcc(target_hdr);
345 byte_count += total_in_src;
346 /* is the result too big for the field? */
347 if (byte_count > USHRT_MAX) {
348 cifs_dbg(FYI, "coalesced BCC too large (%u)\n", byte_count);
349 return -EPROTO;
350 }
351 put_bcc(byte_count, target_hdr);
352
353 byte_count = be32_to_cpu(target_hdr->smb_buf_length);
354 byte_count += total_in_src;
355 /* don't allow buffer to overflow */
356 if (byte_count > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) {
357 cifs_dbg(FYI, "coalesced BCC exceeds buffer size (%u)\n",
358 byte_count);
359 return -ENOBUFS;
360 }
361 target_hdr->smb_buf_length = cpu_to_be32(byte_count);
362
363 /* copy second buffer into end of first buffer */
364 memcpy(data_area_of_tgt, data_area_of_src, total_in_src);
365
366 if (remaining != total_in_src) {
367 /* more responses to go */
368 cifs_dbg(FYI, "waiting for more secondary responses\n");
369 return 1;
370 }
371
372 /* we are done */
373 cifs_dbg(FYI, "found the last secondary response\n");
374 return 0;
375 }
376
377 static void
cifs_downgrade_oplock(struct TCP_Server_Info * server,struct cifsInodeInfo * cinode,__u32 oplock,__u16 epoch,bool * purge_cache)378 cifs_downgrade_oplock(struct TCP_Server_Info *server,
379 struct cifsInodeInfo *cinode, __u32 oplock,
380 __u16 epoch, bool *purge_cache)
381 {
382 cifs_set_oplock_level(cinode, oplock);
383 }
384
385 static bool
cifs_check_trans2(struct mid_q_entry * mid,struct TCP_Server_Info * server,char * buf,int malformed)386 cifs_check_trans2(struct mid_q_entry *mid, struct TCP_Server_Info *server,
387 char *buf, int malformed)
388 {
389 if (malformed)
390 return false;
391 if (check2ndT2(buf) <= 0)
392 return false;
393 mid->multiRsp = true;
394 if (mid->resp_buf) {
395 /* merge response - fix up 1st*/
396 malformed = coalesce_t2(buf, mid->resp_buf);
397 if (malformed > 0)
398 return true;
399 /* All parts received or packet is malformed. */
400 mid->multiEnd = true;
401 dequeue_mid(mid, malformed);
402 return true;
403 }
404 if (!server->large_buf) {
405 /*FIXME: switch to already allocated largebuf?*/
406 cifs_dbg(VFS, "1st trans2 resp needs bigbuf\n");
407 } else {
408 /* Have first buffer */
409 mid->resp_buf = buf;
410 mid->large_buf = true;
411 server->bigbuf = NULL;
412 }
413 return true;
414 }
415
416 static bool
cifs_need_neg(struct TCP_Server_Info * server)417 cifs_need_neg(struct TCP_Server_Info *server)
418 {
419 return server->maxBuf == 0;
420 }
421
422 static int
cifs_negotiate(const unsigned int xid,struct cifs_ses * ses,struct TCP_Server_Info * server)423 cifs_negotiate(const unsigned int xid,
424 struct cifs_ses *ses,
425 struct TCP_Server_Info *server)
426 {
427 int rc;
428 rc = CIFSSMBNegotiate(xid, ses, server);
429 return rc;
430 }
431
432 static unsigned int
cifs_negotiate_wsize(struct cifs_tcon * tcon,struct smb3_fs_context * ctx)433 cifs_negotiate_wsize(struct cifs_tcon *tcon, struct smb3_fs_context *ctx)
434 {
435 __u64 unix_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
436 struct TCP_Server_Info *server = tcon->ses->server;
437 unsigned int wsize;
438
439 /* start with specified wsize, or default */
440 if (ctx->got_wsize)
441 wsize = ctx->vol_wsize;
442 else if (tcon->unix_ext && (unix_cap & CIFS_UNIX_LARGE_WRITE_CAP))
443 wsize = CIFS_DEFAULT_IOSIZE;
444 else
445 wsize = CIFS_DEFAULT_NON_POSIX_WSIZE;
446
447 /* can server support 24-bit write sizes? (via UNIX extensions) */
448 if (!tcon->unix_ext || !(unix_cap & CIFS_UNIX_LARGE_WRITE_CAP))
449 wsize = min_t(unsigned int, wsize, CIFS_MAX_RFC1002_WSIZE);
450
451 /*
452 * no CAP_LARGE_WRITE_X or is signing enabled without CAP_UNIX set?
453 * Limit it to max buffer offered by the server, minus the size of the
454 * WRITEX header, not including the 4 byte RFC1001 length.
455 */
456 if (!(server->capabilities & CAP_LARGE_WRITE_X) ||
457 (!(server->capabilities & CAP_UNIX) && server->sign))
458 wsize = min_t(unsigned int, wsize,
459 server->maxBuf - sizeof(WRITE_REQ) + 4);
460
461 /* hard limit of CIFS_MAX_WSIZE */
462 wsize = min_t(unsigned int, wsize, CIFS_MAX_WSIZE);
463
464 return wsize;
465 }
466
467 static unsigned int
cifs_negotiate_rsize(struct cifs_tcon * tcon,struct smb3_fs_context * ctx)468 cifs_negotiate_rsize(struct cifs_tcon *tcon, struct smb3_fs_context *ctx)
469 {
470 __u64 unix_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
471 struct TCP_Server_Info *server = tcon->ses->server;
472 unsigned int rsize, defsize;
473
474 /*
475 * Set default value...
476 *
477 * HACK alert! Ancient servers have very small buffers. Even though
478 * MS-CIFS indicates that servers are only limited by the client's
479 * bufsize for reads, testing against win98se shows that it throws
480 * INVALID_PARAMETER errors if you try to request too large a read.
481 * OS/2 just sends back short reads.
482 *
483 * If the server doesn't advertise CAP_LARGE_READ_X, then assume that
484 * it can't handle a read request larger than its MaxBufferSize either.
485 */
486 if (tcon->unix_ext && (unix_cap & CIFS_UNIX_LARGE_READ_CAP))
487 defsize = CIFS_DEFAULT_IOSIZE;
488 else if (server->capabilities & CAP_LARGE_READ_X)
489 defsize = CIFS_DEFAULT_NON_POSIX_RSIZE;
490 else
491 defsize = server->maxBuf - sizeof(READ_RSP);
492
493 rsize = ctx->got_rsize ? ctx->vol_rsize : defsize;
494
495 /*
496 * no CAP_LARGE_READ_X? Then MS-CIFS states that we must limit this to
497 * the client's MaxBufferSize.
498 */
499 if (!(server->capabilities & CAP_LARGE_READ_X))
500 rsize = min_t(unsigned int, CIFSMaxBufSize, rsize);
501
502 /* hard limit of CIFS_MAX_RSIZE */
503 rsize = min_t(unsigned int, rsize, CIFS_MAX_RSIZE);
504
505 return rsize;
506 }
507
508 static void
cifs_qfs_tcon(const unsigned int xid,struct cifs_tcon * tcon,struct cifs_sb_info * cifs_sb)509 cifs_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon,
510 struct cifs_sb_info *cifs_sb)
511 {
512 CIFSSMBQFSDeviceInfo(xid, tcon);
513 CIFSSMBQFSAttributeInfo(xid, tcon);
514 }
515
516 static int
cifs_is_path_accessible(const unsigned int xid,struct cifs_tcon * tcon,struct cifs_sb_info * cifs_sb,const char * full_path)517 cifs_is_path_accessible(const unsigned int xid, struct cifs_tcon *tcon,
518 struct cifs_sb_info *cifs_sb, const char *full_path)
519 {
520 int rc;
521 FILE_ALL_INFO *file_info;
522
523 file_info = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
524 if (file_info == NULL)
525 return -ENOMEM;
526
527 rc = CIFSSMBQPathInfo(xid, tcon, full_path, file_info,
528 0 /* not legacy */, cifs_sb->local_nls,
529 cifs_remap(cifs_sb));
530
531 if (rc == -EOPNOTSUPP || rc == -EINVAL)
532 rc = SMBQueryInformation(xid, tcon, full_path, file_info,
533 cifs_sb->local_nls, cifs_remap(cifs_sb));
534 kfree(file_info);
535 return rc;
536 }
537
cifs_query_path_info(const unsigned int xid,struct cifs_tcon * tcon,struct cifs_sb_info * cifs_sb,const char * full_path,struct cifs_open_info_data * data)538 static int cifs_query_path_info(const unsigned int xid,
539 struct cifs_tcon *tcon,
540 struct cifs_sb_info *cifs_sb,
541 const char *full_path,
542 struct cifs_open_info_data *data)
543 {
544 int rc = -EOPNOTSUPP;
545 FILE_ALL_INFO fi = {};
546 struct cifs_search_info search_info = {};
547 bool non_unicode_wildcard = false;
548
549 data->symlink = false;
550 data->adjust_tz = false;
551
552 /*
553 * First try CIFSSMBQPathInfo() function which returns more info
554 * (NumberOfLinks) than CIFSFindFirst() fallback function.
555 * Some servers like Win9x do not support SMB_QUERY_FILE_ALL_INFO over
556 * TRANS2_QUERY_PATH_INFORMATION, but supports it with filehandle over
557 * TRANS2_QUERY_FILE_INFORMATION (function CIFSSMBQFileInfo(). But SMB
558 * Open command on non-NT servers works only for files, does not work
559 * for directories. And moreover Win9x SMB server returns bogus data in
560 * SMB_QUERY_FILE_ALL_INFO Attributes field. So for non-NT servers,
561 * do not even use CIFSSMBQPathInfo() or CIFSSMBQFileInfo() function.
562 */
563 if (tcon->ses->capabilities & CAP_NT_SMBS)
564 rc = CIFSSMBQPathInfo(xid, tcon, full_path, &fi, 0 /* not legacy */,
565 cifs_sb->local_nls, cifs_remap(cifs_sb));
566
567 /*
568 * Non-UNICODE variant of fallback functions below expands wildcards,
569 * so they cannot be used for querying paths with wildcard characters.
570 */
571 if (rc && !(tcon->ses->capabilities & CAP_UNICODE) && strpbrk(full_path, "*?\"><"))
572 non_unicode_wildcard = true;
573
574 /*
575 * Then fallback to CIFSFindFirst() which works also with non-NT servers
576 * but does not does not provide NumberOfLinks.
577 */
578 if ((rc == -EOPNOTSUPP || rc == -EINVAL) &&
579 !non_unicode_wildcard) {
580 if (!(tcon->ses->capabilities & tcon->ses->server->vals->cap_nt_find))
581 search_info.info_level = SMB_FIND_FILE_INFO_STANDARD;
582 else
583 search_info.info_level = SMB_FIND_FILE_FULL_DIRECTORY_INFO;
584 rc = CIFSFindFirst(xid, tcon, full_path, cifs_sb, NULL,
585 CIFS_SEARCH_CLOSE_ALWAYS | CIFS_SEARCH_CLOSE_AT_END,
586 &search_info, false);
587 if (rc == 0) {
588 if (!(tcon->ses->capabilities & tcon->ses->server->vals->cap_nt_find)) {
589 FIND_FILE_STANDARD_INFO *di;
590 int offset = tcon->ses->server->timeAdj;
591
592 di = (FIND_FILE_STANDARD_INFO *)search_info.srch_entries_start;
593 fi.CreationTime = cpu_to_le64(cifs_UnixTimeToNT(cnvrtDosUnixTm(
594 di->CreationDate, di->CreationTime, offset)));
595 fi.LastAccessTime = cpu_to_le64(cifs_UnixTimeToNT(cnvrtDosUnixTm(
596 di->LastAccessDate, di->LastAccessTime, offset)));
597 fi.LastWriteTime = cpu_to_le64(cifs_UnixTimeToNT(cnvrtDosUnixTm(
598 di->LastWriteDate, di->LastWriteTime, offset)));
599 fi.ChangeTime = fi.LastWriteTime;
600 fi.Attributes = cpu_to_le32(le16_to_cpu(di->Attributes));
601 fi.AllocationSize = cpu_to_le64(le32_to_cpu(di->AllocationSize));
602 fi.EndOfFile = cpu_to_le64(le32_to_cpu(di->DataSize));
603 } else {
604 FILE_FULL_DIRECTORY_INFO *di;
605
606 di = (FILE_FULL_DIRECTORY_INFO *)search_info.srch_entries_start;
607 fi.CreationTime = di->CreationTime;
608 fi.LastAccessTime = di->LastAccessTime;
609 fi.LastWriteTime = di->LastWriteTime;
610 fi.ChangeTime = di->ChangeTime;
611 fi.Attributes = di->ExtFileAttributes;
612 fi.AllocationSize = di->AllocationSize;
613 fi.EndOfFile = di->EndOfFile;
614 fi.EASize = di->EaSize;
615 }
616 fi.NumberOfLinks = cpu_to_le32(1);
617 fi.DeletePending = 0;
618 fi.Directory = !!(le32_to_cpu(fi.Attributes) & ATTR_DIRECTORY);
619 cifs_buf_release(search_info.ntwrk_buf_start);
620 } else if (!full_path[0]) {
621 /*
622 * CIFSFindFirst() does not work on root path if the
623 * root path was exported on the server from the top
624 * level path (drive letter).
625 */
626 rc = -EOPNOTSUPP;
627 }
628 }
629
630 /*
631 * If everything failed then fallback to the legacy SMB command
632 * SMB_COM_QUERY_INFORMATION which works with all servers, but
633 * provide just few information.
634 */
635 if ((rc == -EOPNOTSUPP || rc == -EINVAL) && !non_unicode_wildcard) {
636 rc = SMBQueryInformation(xid, tcon, full_path, &fi, cifs_sb->local_nls,
637 cifs_remap(cifs_sb));
638 data->adjust_tz = true;
639 } else if ((rc == -EOPNOTSUPP || rc == -EINVAL) && non_unicode_wildcard) {
640 /* Path with non-UNICODE wildcard character cannot exist. */
641 rc = -ENOENT;
642 }
643
644 if (!rc) {
645 int tmprc;
646 int oplock = 0;
647 struct cifs_fid fid;
648 struct cifs_open_parms oparms;
649
650 move_cifs_info_to_smb2(&data->fi, &fi);
651
652 if (!(le32_to_cpu(fi.Attributes) & ATTR_REPARSE))
653 return 0;
654
655 oparms = (struct cifs_open_parms) {
656 .tcon = tcon,
657 .cifs_sb = cifs_sb,
658 .desired_access = FILE_READ_ATTRIBUTES,
659 .create_options = cifs_create_options(cifs_sb, 0),
660 .disposition = FILE_OPEN,
661 .path = full_path,
662 .fid = &fid,
663 };
664
665 /* Need to check if this is a symbolic link or not */
666 tmprc = CIFS_open(xid, &oparms, &oplock, NULL);
667 if (tmprc == -EOPNOTSUPP)
668 data->symlink = true;
669 else if (tmprc == 0)
670 CIFSSMBClose(xid, tcon, fid.netfid);
671 }
672
673 #ifdef CONFIG_CIFS_XATTR
674 /*
675 * For WSL CHR and BLK reparse points it is required to fetch
676 * EA $LXDEV which contains major and minor device numbers.
677 */
678 if (!rc && data->reparse_point) {
679 struct smb2_file_full_ea_info *ea;
680
681 ea = (struct smb2_file_full_ea_info *)data->wsl.eas;
682 rc = CIFSSMBQAllEAs(xid, tcon, full_path, SMB2_WSL_XATTR_DEV,
683 &ea->ea_data[SMB2_WSL_XATTR_NAME_LEN + 1],
684 SMB2_WSL_XATTR_DEV_SIZE, cifs_sb);
685 if (rc == SMB2_WSL_XATTR_DEV_SIZE) {
686 ea->next_entry_offset = cpu_to_le32(0);
687 ea->flags = 0;
688 ea->ea_name_length = SMB2_WSL_XATTR_NAME_LEN;
689 ea->ea_value_length = cpu_to_le16(SMB2_WSL_XATTR_DEV_SIZE);
690 memcpy(&ea->ea_data[0], SMB2_WSL_XATTR_DEV, SMB2_WSL_XATTR_NAME_LEN + 1);
691 data->wsl.eas_len = sizeof(*ea) + SMB2_WSL_XATTR_NAME_LEN + 1 +
692 SMB2_WSL_XATTR_DEV_SIZE;
693 rc = 0;
694 } else if (rc >= 0) {
695 /* It is an error if EA $LXDEV has wrong size. */
696 rc = -EINVAL;
697 } else {
698 /*
699 * In all other cases ignore error if fetching
700 * of EA $LXDEV failed. It is needed only for
701 * WSL CHR and BLK reparse points and wsl_to_fattr()
702 * handle the case when EA is missing.
703 */
704 rc = 0;
705 }
706 }
707 #endif
708
709 return rc;
710 }
711
cifs_get_srv_inum(const unsigned int xid,struct cifs_tcon * tcon,struct cifs_sb_info * cifs_sb,const char * full_path,u64 * uniqueid,struct cifs_open_info_data * unused)712 static int cifs_get_srv_inum(const unsigned int xid, struct cifs_tcon *tcon,
713 struct cifs_sb_info *cifs_sb, const char *full_path,
714 u64 *uniqueid, struct cifs_open_info_data *unused)
715 {
716 /*
717 * We can not use the IndexNumber field by default from Windows or
718 * Samba (in ALL_INFO buf) but we can request it explicitly. The SNIA
719 * CIFS spec claims that this value is unique within the scope of a
720 * share, and the windows docs hint that it's actually unique
721 * per-machine.
722 *
723 * There may be higher info levels that work but are there Windows
724 * server or network appliances for which IndexNumber field is not
725 * guaranteed unique?
726 */
727 return CIFSGetSrvInodeNumber(xid, tcon, full_path, uniqueid,
728 cifs_sb->local_nls,
729 cifs_remap(cifs_sb));
730 }
731
cifs_query_file_info(const unsigned int xid,struct cifs_tcon * tcon,struct cifsFileInfo * cfile,struct cifs_open_info_data * data)732 static int cifs_query_file_info(const unsigned int xid, struct cifs_tcon *tcon,
733 struct cifsFileInfo *cfile, struct cifs_open_info_data *data)
734 {
735 int rc;
736 FILE_ALL_INFO fi = {};
737
738 /*
739 * CIFSSMBQFileInfo() for non-NT servers returns bogus data in
740 * Attributes fields. So do not use this command for non-NT servers.
741 */
742 if (!(tcon->ses->capabilities & CAP_NT_SMBS))
743 return -EOPNOTSUPP;
744
745 if (cfile->symlink_target) {
746 data->symlink_target = kstrdup(cfile->symlink_target, GFP_KERNEL);
747 if (!data->symlink_target)
748 return -ENOMEM;
749 }
750
751 rc = CIFSSMBQFileInfo(xid, tcon, cfile->fid.netfid, &fi);
752 if (!rc)
753 move_cifs_info_to_smb2(&data->fi, &fi);
754 return rc;
755 }
756
757 static void
cifs_clear_stats(struct cifs_tcon * tcon)758 cifs_clear_stats(struct cifs_tcon *tcon)
759 {
760 atomic_set(&tcon->stats.cifs_stats.num_writes, 0);
761 atomic_set(&tcon->stats.cifs_stats.num_reads, 0);
762 atomic_set(&tcon->stats.cifs_stats.num_flushes, 0);
763 atomic_set(&tcon->stats.cifs_stats.num_oplock_brks, 0);
764 atomic_set(&tcon->stats.cifs_stats.num_opens, 0);
765 atomic_set(&tcon->stats.cifs_stats.num_posixopens, 0);
766 atomic_set(&tcon->stats.cifs_stats.num_posixmkdirs, 0);
767 atomic_set(&tcon->stats.cifs_stats.num_closes, 0);
768 atomic_set(&tcon->stats.cifs_stats.num_deletes, 0);
769 atomic_set(&tcon->stats.cifs_stats.num_mkdirs, 0);
770 atomic_set(&tcon->stats.cifs_stats.num_rmdirs, 0);
771 atomic_set(&tcon->stats.cifs_stats.num_renames, 0);
772 atomic_set(&tcon->stats.cifs_stats.num_t2renames, 0);
773 atomic_set(&tcon->stats.cifs_stats.num_ffirst, 0);
774 atomic_set(&tcon->stats.cifs_stats.num_fnext, 0);
775 atomic_set(&tcon->stats.cifs_stats.num_fclose, 0);
776 atomic_set(&tcon->stats.cifs_stats.num_hardlinks, 0);
777 atomic_set(&tcon->stats.cifs_stats.num_symlinks, 0);
778 atomic_set(&tcon->stats.cifs_stats.num_locks, 0);
779 atomic_set(&tcon->stats.cifs_stats.num_acl_get, 0);
780 atomic_set(&tcon->stats.cifs_stats.num_acl_set, 0);
781 }
782
783 static void
cifs_print_stats(struct seq_file * m,struct cifs_tcon * tcon)784 cifs_print_stats(struct seq_file *m, struct cifs_tcon *tcon)
785 {
786 seq_printf(m, " Oplocks breaks: %d",
787 atomic_read(&tcon->stats.cifs_stats.num_oplock_brks));
788 seq_printf(m, "\nReads: %d Bytes: %llu",
789 atomic_read(&tcon->stats.cifs_stats.num_reads),
790 (long long)(tcon->bytes_read));
791 seq_printf(m, "\nWrites: %d Bytes: %llu",
792 atomic_read(&tcon->stats.cifs_stats.num_writes),
793 (long long)(tcon->bytes_written));
794 seq_printf(m, "\nFlushes: %d",
795 atomic_read(&tcon->stats.cifs_stats.num_flushes));
796 seq_printf(m, "\nLocks: %d HardLinks: %d Symlinks: %d",
797 atomic_read(&tcon->stats.cifs_stats.num_locks),
798 atomic_read(&tcon->stats.cifs_stats.num_hardlinks),
799 atomic_read(&tcon->stats.cifs_stats.num_symlinks));
800 seq_printf(m, "\nOpens: %d Closes: %d Deletes: %d",
801 atomic_read(&tcon->stats.cifs_stats.num_opens),
802 atomic_read(&tcon->stats.cifs_stats.num_closes),
803 atomic_read(&tcon->stats.cifs_stats.num_deletes));
804 seq_printf(m, "\nPosix Opens: %d Posix Mkdirs: %d",
805 atomic_read(&tcon->stats.cifs_stats.num_posixopens),
806 atomic_read(&tcon->stats.cifs_stats.num_posixmkdirs));
807 seq_printf(m, "\nMkdirs: %d Rmdirs: %d",
808 atomic_read(&tcon->stats.cifs_stats.num_mkdirs),
809 atomic_read(&tcon->stats.cifs_stats.num_rmdirs));
810 seq_printf(m, "\nRenames: %d T2 Renames %d",
811 atomic_read(&tcon->stats.cifs_stats.num_renames),
812 atomic_read(&tcon->stats.cifs_stats.num_t2renames));
813 seq_printf(m, "\nFindFirst: %d FNext %d FClose %d",
814 atomic_read(&tcon->stats.cifs_stats.num_ffirst),
815 atomic_read(&tcon->stats.cifs_stats.num_fnext),
816 atomic_read(&tcon->stats.cifs_stats.num_fclose));
817 }
818
819 static void
cifs_mkdir_setinfo(struct inode * inode,const char * full_path,struct cifs_sb_info * cifs_sb,struct cifs_tcon * tcon,const unsigned int xid)820 cifs_mkdir_setinfo(struct inode *inode, const char *full_path,
821 struct cifs_sb_info *cifs_sb, struct cifs_tcon *tcon,
822 const unsigned int xid)
823 {
824 FILE_BASIC_INFO info;
825 struct cifsInodeInfo *cifsInode;
826 u32 dosattrs;
827 int rc;
828
829 memset(&info, 0, sizeof(info));
830 cifsInode = CIFS_I(inode);
831 dosattrs = cifsInode->cifsAttrs|ATTR_READONLY;
832 info.Attributes = cpu_to_le32(dosattrs);
833 rc = CIFSSMBSetPathInfo(xid, tcon, full_path, &info, cifs_sb->local_nls,
834 cifs_sb);
835 if (rc == 0)
836 cifsInode->cifsAttrs = dosattrs;
837 }
838
cifs_open_file(const unsigned int xid,struct cifs_open_parms * oparms,__u32 * oplock,void * buf)839 static int cifs_open_file(const unsigned int xid, struct cifs_open_parms *oparms, __u32 *oplock,
840 void *buf)
841 {
842 struct cifs_open_info_data *data = buf;
843 FILE_ALL_INFO fi = {};
844 int rc;
845
846 if (!(oparms->tcon->ses->capabilities & CAP_NT_SMBS))
847 rc = SMBLegacyOpen(xid, oparms->tcon, oparms->path,
848 oparms->disposition,
849 oparms->desired_access,
850 oparms->create_options,
851 &oparms->fid->netfid, oplock, &fi,
852 oparms->cifs_sb->local_nls,
853 cifs_remap(oparms->cifs_sb));
854 else
855 rc = CIFS_open(xid, oparms, oplock, &fi);
856
857 if (!rc && data)
858 move_cifs_info_to_smb2(&data->fi, &fi);
859
860 return rc;
861 }
862
863 static void
cifs_set_fid(struct cifsFileInfo * cfile,struct cifs_fid * fid,__u32 oplock)864 cifs_set_fid(struct cifsFileInfo *cfile, struct cifs_fid *fid, __u32 oplock)
865 {
866 struct cifsInodeInfo *cinode = CIFS_I(d_inode(cfile->dentry));
867 cfile->fid.netfid = fid->netfid;
868 cifs_set_oplock_level(cinode, oplock);
869 cinode->can_cache_brlcks = CIFS_CACHE_WRITE(cinode);
870 }
871
872 static int
cifs_close_file(const unsigned int xid,struct cifs_tcon * tcon,struct cifs_fid * fid)873 cifs_close_file(const unsigned int xid, struct cifs_tcon *tcon,
874 struct cifs_fid *fid)
875 {
876 return CIFSSMBClose(xid, tcon, fid->netfid);
877 }
878
879 static int
cifs_flush_file(const unsigned int xid,struct cifs_tcon * tcon,struct cifs_fid * fid)880 cifs_flush_file(const unsigned int xid, struct cifs_tcon *tcon,
881 struct cifs_fid *fid)
882 {
883 return CIFSSMBFlush(xid, tcon, fid->netfid);
884 }
885
886 static int
cifs_sync_read(const unsigned int xid,struct cifs_fid * pfid,struct cifs_io_parms * parms,unsigned int * bytes_read,char ** buf,int * buf_type)887 cifs_sync_read(const unsigned int xid, struct cifs_fid *pfid,
888 struct cifs_io_parms *parms, unsigned int *bytes_read,
889 char **buf, int *buf_type)
890 {
891 parms->netfid = pfid->netfid;
892 return CIFSSMBRead(xid, parms, bytes_read, buf, buf_type);
893 }
894
895 static int
cifs_sync_write(const unsigned int xid,struct cifs_fid * pfid,struct cifs_io_parms * parms,unsigned int * written,struct kvec * iov,unsigned long nr_segs)896 cifs_sync_write(const unsigned int xid, struct cifs_fid *pfid,
897 struct cifs_io_parms *parms, unsigned int *written,
898 struct kvec *iov, unsigned long nr_segs)
899 {
900
901 parms->netfid = pfid->netfid;
902 return CIFSSMBWrite2(xid, parms, written, iov, nr_segs);
903 }
904
905 static int
smb_set_file_info(struct inode * inode,const char * full_path,FILE_BASIC_INFO * buf,const unsigned int xid)906 smb_set_file_info(struct inode *inode, const char *full_path,
907 FILE_BASIC_INFO *buf, const unsigned int xid)
908 {
909 int oplock = 0;
910 int rc;
911 __u32 netpid;
912 struct cifs_fid fid;
913 struct cifs_open_parms oparms;
914 struct cifsFileInfo *open_file;
915 FILE_BASIC_INFO new_buf;
916 struct cifs_open_info_data query_data;
917 __le64 write_time = buf->LastWriteTime;
918 struct cifsInodeInfo *cinode = CIFS_I(inode);
919 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
920 struct tcon_link *tlink = NULL;
921 struct cifs_tcon *tcon;
922
923 /* if the file is already open for write, just use that fileid */
924 open_file = find_writable_file(cinode, FIND_WR_FSUID_ONLY);
925
926 if (open_file) {
927 fid.netfid = open_file->fid.netfid;
928 netpid = open_file->pid;
929 tcon = tlink_tcon(open_file->tlink);
930 } else {
931 tlink = cifs_sb_tlink(cifs_sb);
932 if (IS_ERR(tlink)) {
933 rc = PTR_ERR(tlink);
934 tlink = NULL;
935 goto out;
936 }
937 tcon = tlink_tcon(tlink);
938 }
939
940 /*
941 * Non-NT servers interprets zero time value in SMB_SET_FILE_BASIC_INFO
942 * over TRANS2_SET_FILE_INFORMATION as a valid time value. NT servers
943 * interprets zero time value as do not change existing value on server.
944 * API of ->set_file_info() callback expects that zero time value has
945 * the NT meaning - do not change. Therefore if server is non-NT and
946 * some time values in "buf" are zero, then fetch missing time values.
947 */
948 if (!(tcon->ses->capabilities & CAP_NT_SMBS) &&
949 (!buf->CreationTime || !buf->LastAccessTime ||
950 !buf->LastWriteTime || !buf->ChangeTime)) {
951 rc = cifs_query_path_info(xid, tcon, cifs_sb, full_path, &query_data);
952 if (rc) {
953 if (open_file) {
954 cifsFileInfo_put(open_file);
955 open_file = NULL;
956 }
957 goto out;
958 }
959 /*
960 * Original write_time from buf->LastWriteTime is preserved
961 * as SMBSetInformation() interprets zero as do not change.
962 */
963 new_buf = *buf;
964 buf = &new_buf;
965 if (!buf->CreationTime)
966 buf->CreationTime = query_data.fi.CreationTime;
967 if (!buf->LastAccessTime)
968 buf->LastAccessTime = query_data.fi.LastAccessTime;
969 if (!buf->LastWriteTime)
970 buf->LastWriteTime = query_data.fi.LastWriteTime;
971 if (!buf->ChangeTime)
972 buf->ChangeTime = query_data.fi.ChangeTime;
973 }
974
975 if (open_file)
976 goto set_via_filehandle;
977
978 rc = CIFSSMBSetPathInfo(xid, tcon, full_path, buf, cifs_sb->local_nls,
979 cifs_sb);
980 if (rc == 0) {
981 cinode->cifsAttrs = le32_to_cpu(buf->Attributes);
982 goto out;
983 } else if (rc != -EOPNOTSUPP && rc != -EINVAL) {
984 goto out;
985 }
986
987 oparms = (struct cifs_open_parms) {
988 .tcon = tcon,
989 .cifs_sb = cifs_sb,
990 .desired_access = SYNCHRONIZE | FILE_WRITE_ATTRIBUTES,
991 .create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR),
992 .disposition = FILE_OPEN,
993 .path = full_path,
994 .fid = &fid,
995 };
996
997 if (S_ISDIR(inode->i_mode) && !(tcon->ses->capabilities & CAP_NT_SMBS)) {
998 /* Opening directory path is not possible on non-NT servers. */
999 rc = -EOPNOTSUPP;
1000 } else {
1001 /*
1002 * Use cifs_open_file() instead of CIFS_open() as the
1003 * cifs_open_file() selects the correct function which
1004 * works also on non-NT servers.
1005 */
1006 rc = cifs_open_file(xid, &oparms, &oplock, NULL);
1007 /*
1008 * Opening path for writing on non-NT servers is not
1009 * possible when the read-only attribute is already set.
1010 * Non-NT server in this case returns -EACCES. For those
1011 * servers the only possible way how to clear the read-only
1012 * bit is via SMB_COM_SETATTR command.
1013 */
1014 if (rc == -EACCES &&
1015 (cinode->cifsAttrs & ATTR_READONLY) &&
1016 le32_to_cpu(buf->Attributes) != 0 && /* 0 = do not change attrs */
1017 !(le32_to_cpu(buf->Attributes) & ATTR_READONLY) &&
1018 !(tcon->ses->capabilities & CAP_NT_SMBS))
1019 rc = -EOPNOTSUPP;
1020 }
1021
1022 /* Fallback to SMB_COM_SETATTR command when absolutelty needed. */
1023 if (rc == -EOPNOTSUPP) {
1024 cifs_dbg(FYI, "calling SetInformation since SetPathInfo for attrs/times not supported by this server\n");
1025 rc = SMBSetInformation(xid, tcon, full_path,
1026 buf->Attributes != 0 ? buf->Attributes : cpu_to_le32(cinode->cifsAttrs),
1027 write_time,
1028 cifs_sb->local_nls, cifs_sb);
1029 if (rc == 0)
1030 cinode->cifsAttrs = le32_to_cpu(buf->Attributes);
1031 else
1032 rc = -EACCES;
1033 goto out;
1034 }
1035
1036 if (rc != 0) {
1037 if (rc == -EIO)
1038 rc = -EINVAL;
1039 goto out;
1040 }
1041
1042 netpid = current->tgid;
1043 cifs_dbg(FYI, "calling SetFileInfo since SetPathInfo for attrs/times not supported by this server\n");
1044
1045 set_via_filehandle:
1046 rc = CIFSSMBSetFileInfo(xid, tcon, buf, fid.netfid, netpid);
1047 if (!rc)
1048 cinode->cifsAttrs = le32_to_cpu(buf->Attributes);
1049
1050 if (open_file == NULL)
1051 CIFSSMBClose(xid, tcon, fid.netfid);
1052 else
1053 cifsFileInfo_put(open_file);
1054
1055 /*
1056 * Setting the read-only bit is not honered on non-NT servers when done
1057 * via open-semantics. So for setting it, use SMB_COM_SETATTR command.
1058 * This command works only after the file is closed, so use it only when
1059 * operation was called without the filehandle.
1060 */
1061 if (open_file == NULL &&
1062 !(tcon->ses->capabilities & CAP_NT_SMBS) &&
1063 le32_to_cpu(buf->Attributes) & ATTR_READONLY) {
1064 SMBSetInformation(xid, tcon, full_path,
1065 buf->Attributes,
1066 0 /* do not change write time */,
1067 cifs_sb->local_nls, cifs_sb);
1068 }
1069 out:
1070 if (tlink != NULL)
1071 cifs_put_tlink(tlink);
1072 return rc;
1073 }
1074
1075 static int
cifs_set_compression(const unsigned int xid,struct cifs_tcon * tcon,struct cifsFileInfo * cfile)1076 cifs_set_compression(const unsigned int xid, struct cifs_tcon *tcon,
1077 struct cifsFileInfo *cfile)
1078 {
1079 return CIFSSMB_set_compression(xid, tcon, cfile->fid.netfid);
1080 }
1081
1082 static int
cifs_query_dir_first(const unsigned int xid,struct cifs_tcon * tcon,const char * path,struct cifs_sb_info * cifs_sb,struct cifs_fid * fid,__u16 search_flags,struct cifs_search_info * srch_inf)1083 cifs_query_dir_first(const unsigned int xid, struct cifs_tcon *tcon,
1084 const char *path, struct cifs_sb_info *cifs_sb,
1085 struct cifs_fid *fid, __u16 search_flags,
1086 struct cifs_search_info *srch_inf)
1087 {
1088 int rc;
1089
1090 rc = CIFSFindFirst(xid, tcon, path, cifs_sb,
1091 &fid->netfid, search_flags, srch_inf, true);
1092 if (rc)
1093 cifs_dbg(FYI, "find first failed=%d\n", rc);
1094 return rc;
1095 }
1096
1097 static int
cifs_query_dir_next(const unsigned int xid,struct cifs_tcon * tcon,struct cifs_fid * fid,__u16 search_flags,struct cifs_search_info * srch_inf)1098 cifs_query_dir_next(const unsigned int xid, struct cifs_tcon *tcon,
1099 struct cifs_fid *fid, __u16 search_flags,
1100 struct cifs_search_info *srch_inf)
1101 {
1102 return CIFSFindNext(xid, tcon, fid->netfid, search_flags, srch_inf);
1103 }
1104
1105 static int
cifs_close_dir(const unsigned int xid,struct cifs_tcon * tcon,struct cifs_fid * fid)1106 cifs_close_dir(const unsigned int xid, struct cifs_tcon *tcon,
1107 struct cifs_fid *fid)
1108 {
1109 return CIFSFindClose(xid, tcon, fid->netfid);
1110 }
1111
1112 static int
cifs_oplock_response(struct cifs_tcon * tcon,__u64 persistent_fid,__u64 volatile_fid,__u16 net_fid,struct cifsInodeInfo * cinode)1113 cifs_oplock_response(struct cifs_tcon *tcon, __u64 persistent_fid,
1114 __u64 volatile_fid, __u16 net_fid, struct cifsInodeInfo *cinode)
1115 {
1116 return CIFSSMBLock(0, tcon, net_fid, current->tgid, 0, 0, 0, 0,
1117 LOCKING_ANDX_OPLOCK_RELEASE, false, CIFS_CACHE_READ(cinode) ? 1 : 0);
1118 }
1119
1120 static int
cifs_queryfs(const unsigned int xid,struct cifs_tcon * tcon,const char * path,struct cifs_sb_info * cifs_sb,struct kstatfs * buf)1121 cifs_queryfs(const unsigned int xid, struct cifs_tcon *tcon,
1122 const char *path, struct cifs_sb_info *cifs_sb, struct kstatfs *buf)
1123 {
1124 int rc = -EOPNOTSUPP;
1125
1126 buf->f_type = CIFS_SUPER_MAGIC;
1127
1128 /*
1129 * We could add a second check for a QFS Unix capability bit
1130 */
1131 if ((tcon->ses->capabilities & CAP_UNIX) &&
1132 (CIFS_POSIX_EXTENSIONS & le64_to_cpu(tcon->fsUnixInfo.Capability)))
1133 rc = CIFSSMBQFSPosixInfo(xid, tcon, buf);
1134
1135 /*
1136 * Only need to call the old QFSInfo if failed on newer one,
1137 * e.g. by OS/2.
1138 **/
1139 if (rc && (tcon->ses->capabilities & CAP_NT_SMBS))
1140 rc = CIFSSMBQFSInfo(xid, tcon, buf);
1141
1142 /*
1143 * Some old Windows servers also do not support level 103, retry with
1144 * older level one if old server failed the previous call or we
1145 * bypassed it because we detected that this was an older LANMAN sess
1146 */
1147 if (rc)
1148 rc = SMBOldQFSInfo(xid, tcon, buf);
1149 return rc;
1150 }
1151
1152 static int
cifs_mand_lock(const unsigned int xid,struct cifsFileInfo * cfile,__u64 offset,__u64 length,__u32 type,int lock,int unlock,bool wait)1153 cifs_mand_lock(const unsigned int xid, struct cifsFileInfo *cfile, __u64 offset,
1154 __u64 length, __u32 type, int lock, int unlock, bool wait)
1155 {
1156 return CIFSSMBLock(xid, tlink_tcon(cfile->tlink), cfile->fid.netfid,
1157 current->tgid, length, offset, unlock, lock,
1158 (__u8)type, wait, 0);
1159 }
1160
1161 static int
cifs_unix_dfs_readlink(const unsigned int xid,struct cifs_tcon * tcon,const unsigned char * searchName,char ** symlinkinfo,const struct nls_table * nls_codepage)1162 cifs_unix_dfs_readlink(const unsigned int xid, struct cifs_tcon *tcon,
1163 const unsigned char *searchName, char **symlinkinfo,
1164 const struct nls_table *nls_codepage)
1165 {
1166 #ifdef CONFIG_CIFS_DFS_UPCALL
1167 int rc;
1168 struct dfs_info3_param referral = {0};
1169
1170 rc = get_dfs_path(xid, tcon->ses, searchName, nls_codepage, &referral,
1171 0);
1172
1173 if (!rc) {
1174 *symlinkinfo = kstrdup(referral.node_name, GFP_KERNEL);
1175 free_dfs_info_param(&referral);
1176 if (!*symlinkinfo)
1177 rc = -ENOMEM;
1178 }
1179 return rc;
1180 #else /* No DFS support */
1181 return -EREMOTE;
1182 #endif
1183 }
1184
cifs_query_symlink(const unsigned int xid,struct cifs_tcon * tcon,struct cifs_sb_info * cifs_sb,const char * full_path,char ** target_path)1185 static int cifs_query_symlink(const unsigned int xid,
1186 struct cifs_tcon *tcon,
1187 struct cifs_sb_info *cifs_sb,
1188 const char *full_path,
1189 char **target_path)
1190 {
1191 int rc;
1192
1193 cifs_tcon_dbg(FYI, "%s: path=%s\n", __func__, full_path);
1194
1195 if (!cap_unix(tcon->ses))
1196 return -EOPNOTSUPP;
1197
1198 rc = CIFSSMBUnixQuerySymLink(xid, tcon, full_path, target_path,
1199 cifs_sb->local_nls, cifs_remap(cifs_sb));
1200 if (rc == -EREMOTE)
1201 rc = cifs_unix_dfs_readlink(xid, tcon, full_path,
1202 target_path, cifs_sb->local_nls);
1203 return rc;
1204 }
1205
cifs_parse_reparse_point(struct cifs_sb_info * cifs_sb,const char * full_path,struct kvec * rsp_iov,struct cifs_open_info_data * data)1206 static int cifs_parse_reparse_point(struct cifs_sb_info *cifs_sb,
1207 const char *full_path,
1208 struct kvec *rsp_iov,
1209 struct cifs_open_info_data *data)
1210 {
1211 struct reparse_data_buffer *buf;
1212 TRANSACT_IOCTL_RSP *io = rsp_iov->iov_base;
1213 u32 plen = le16_to_cpu(io->ByteCount);
1214
1215 buf = (struct reparse_data_buffer *)((__u8 *)&io->hdr.Protocol +
1216 le32_to_cpu(io->DataOffset));
1217 return parse_reparse_point(buf, plen, cifs_sb, full_path, true, data);
1218 }
1219
1220 static bool
cifs_is_read_op(__u32 oplock)1221 cifs_is_read_op(__u32 oplock)
1222 {
1223 return oplock == OPLOCK_READ;
1224 }
1225
1226 static unsigned int
cifs_wp_retry_size(struct inode * inode)1227 cifs_wp_retry_size(struct inode *inode)
1228 {
1229 return CIFS_SB(inode->i_sb)->ctx->wsize;
1230 }
1231
1232 static bool
cifs_dir_needs_close(struct cifsFileInfo * cfile)1233 cifs_dir_needs_close(struct cifsFileInfo *cfile)
1234 {
1235 return !cfile->srch_inf.endOfSearch && !cfile->invalidHandle;
1236 }
1237
1238 static bool
cifs_can_echo(struct TCP_Server_Info * server)1239 cifs_can_echo(struct TCP_Server_Info *server)
1240 {
1241 if (server->tcpStatus == CifsGood)
1242 return true;
1243
1244 return false;
1245 }
1246
1247 static int
cifs_make_node(unsigned int xid,struct inode * inode,struct dentry * dentry,struct cifs_tcon * tcon,const char * full_path,umode_t mode,dev_t dev)1248 cifs_make_node(unsigned int xid, struct inode *inode,
1249 struct dentry *dentry, struct cifs_tcon *tcon,
1250 const char *full_path, umode_t mode, dev_t dev)
1251 {
1252 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1253 struct inode *newinode = NULL;
1254 int rc;
1255
1256 if (tcon->unix_ext) {
1257 /*
1258 * SMB1 Unix Extensions: requires server support but
1259 * works with all special files
1260 */
1261 struct cifs_unix_set_info_args args = {
1262 .mode = mode & ~current_umask(),
1263 .ctime = NO_CHANGE_64,
1264 .atime = NO_CHANGE_64,
1265 .mtime = NO_CHANGE_64,
1266 .device = dev,
1267 };
1268 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SET_UID) {
1269 args.uid = current_fsuid();
1270 args.gid = current_fsgid();
1271 } else {
1272 args.uid = INVALID_UID; /* no change */
1273 args.gid = INVALID_GID; /* no change */
1274 }
1275 rc = CIFSSMBUnixSetPathInfo(xid, tcon, full_path, &args,
1276 cifs_sb->local_nls,
1277 cifs_remap(cifs_sb));
1278 if (rc)
1279 return rc;
1280
1281 rc = cifs_get_inode_info_unix(&newinode, full_path,
1282 inode->i_sb, xid);
1283
1284 if (rc == 0)
1285 d_instantiate(dentry, newinode);
1286 return rc;
1287 }
1288 /*
1289 * Check if mounted with mount parm 'sfu' mount parm.
1290 * SFU emulation should work with all servers, but only
1291 * supports block and char device (no socket & fifo),
1292 * and was used by default in earlier versions of Windows
1293 */
1294 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL))
1295 return -EPERM;
1296 return cifs_sfu_make_node(xid, inode, dentry, tcon,
1297 full_path, mode, dev);
1298 }
1299
1300 struct smb_version_operations smb1_operations = {
1301 .send_cancel = send_nt_cancel,
1302 .compare_fids = cifs_compare_fids,
1303 .setup_request = cifs_setup_request,
1304 .setup_async_request = cifs_setup_async_request,
1305 .check_receive = cifs_check_receive,
1306 .add_credits = cifs_add_credits,
1307 .set_credits = cifs_set_credits,
1308 .get_credits_field = cifs_get_credits_field,
1309 .get_credits = cifs_get_credits,
1310 .wait_mtu_credits = cifs_wait_mtu_credits,
1311 .get_next_mid = cifs_get_next_mid,
1312 .read_data_offset = cifs_read_data_offset,
1313 .read_data_length = cifs_read_data_length,
1314 .map_error = map_smb_to_linux_error,
1315 .find_mid = cifs_find_mid,
1316 .check_message = checkSMB,
1317 .dump_detail = cifs_dump_detail,
1318 .clear_stats = cifs_clear_stats,
1319 .print_stats = cifs_print_stats,
1320 .is_oplock_break = is_valid_oplock_break,
1321 .downgrade_oplock = cifs_downgrade_oplock,
1322 .check_trans2 = cifs_check_trans2,
1323 .need_neg = cifs_need_neg,
1324 .negotiate = cifs_negotiate,
1325 .negotiate_wsize = cifs_negotiate_wsize,
1326 .negotiate_rsize = cifs_negotiate_rsize,
1327 .sess_setup = CIFS_SessSetup,
1328 .logoff = CIFSSMBLogoff,
1329 .tree_connect = CIFSTCon,
1330 .tree_disconnect = CIFSSMBTDis,
1331 .get_dfs_refer = CIFSGetDFSRefer,
1332 .qfs_tcon = cifs_qfs_tcon,
1333 .is_path_accessible = cifs_is_path_accessible,
1334 .can_echo = cifs_can_echo,
1335 .query_path_info = cifs_query_path_info,
1336 .query_reparse_point = cifs_query_reparse_point,
1337 .query_file_info = cifs_query_file_info,
1338 .get_srv_inum = cifs_get_srv_inum,
1339 .set_path_size = CIFSSMBSetEOF,
1340 .set_file_size = CIFSSMBSetFileSize,
1341 .set_file_info = smb_set_file_info,
1342 .set_compression = cifs_set_compression,
1343 .echo = CIFSSMBEcho,
1344 .mkdir = CIFSSMBMkDir,
1345 .mkdir_setinfo = cifs_mkdir_setinfo,
1346 .rmdir = CIFSSMBRmDir,
1347 .unlink = CIFSSMBDelFile,
1348 .rename_pending_delete = cifs_rename_pending_delete,
1349 .rename = CIFSSMBRename,
1350 .create_hardlink = CIFSCreateHardLink,
1351 .query_symlink = cifs_query_symlink,
1352 .parse_reparse_point = cifs_parse_reparse_point,
1353 .open = cifs_open_file,
1354 .set_fid = cifs_set_fid,
1355 .close = cifs_close_file,
1356 .flush = cifs_flush_file,
1357 .async_readv = cifs_async_readv,
1358 .async_writev = cifs_async_writev,
1359 .sync_read = cifs_sync_read,
1360 .sync_write = cifs_sync_write,
1361 .query_dir_first = cifs_query_dir_first,
1362 .query_dir_next = cifs_query_dir_next,
1363 .close_dir = cifs_close_dir,
1364 .calc_smb_size = smbCalcSize,
1365 .oplock_response = cifs_oplock_response,
1366 .queryfs = cifs_queryfs,
1367 .mand_lock = cifs_mand_lock,
1368 .mand_unlock_range = cifs_unlock_range,
1369 .push_mand_locks = cifs_push_mandatory_locks,
1370 .query_mf_symlink = cifs_query_mf_symlink,
1371 .create_mf_symlink = cifs_create_mf_symlink,
1372 .is_read_op = cifs_is_read_op,
1373 .wp_retry_size = cifs_wp_retry_size,
1374 .dir_needs_close = cifs_dir_needs_close,
1375 .select_sectype = cifs_select_sectype,
1376 #ifdef CONFIG_CIFS_XATTR
1377 .query_all_EAs = CIFSSMBQAllEAs,
1378 .set_EA = CIFSSMBSetEA,
1379 #endif /* CIFS_XATTR */
1380 .get_acl = get_cifs_acl,
1381 .get_acl_by_fid = get_cifs_acl_by_fid,
1382 .set_acl = set_cifs_acl,
1383 .make_node = cifs_make_node,
1384 };
1385
1386 struct smb_version_values smb1_values = {
1387 .version_string = SMB1_VERSION_STRING,
1388 .protocol_id = SMB10_PROT_ID,
1389 .large_lock_type = LOCKING_ANDX_LARGE_FILES,
1390 .exclusive_lock_type = 0,
1391 .shared_lock_type = LOCKING_ANDX_SHARED_LOCK,
1392 .unlock_lock_type = 0,
1393 .header_preamble_size = 4,
1394 .header_size = sizeof(struct smb_hdr),
1395 .max_header_size = MAX_CIFS_HDR_SIZE,
1396 .read_rsp_size = sizeof(READ_RSP),
1397 .lock_cmd = cpu_to_le16(SMB_COM_LOCKING_ANDX),
1398 .cap_unix = CAP_UNIX,
1399 .cap_nt_find = CAP_NT_SMBS | CAP_NT_FIND,
1400 .cap_large_files = CAP_LARGE_FILES,
1401 .signing_enabled = SECMODE_SIGN_ENABLED,
1402 .signing_required = SECMODE_SIGN_REQUIRED,
1403 };
1404