Blame view
fs/cifs/smb1ops.c
32.2 KB
23db65f51 cifs: add a smb_v... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/* * SMB1 (CIFS) version specific operations * * Copyright (c) 2012, Jeff Layton <jlayton@redhat.com> * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License v2 as published * by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See * the GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ |
24985c53d CIFS: Move r/wsiz... |
19 |
#include <linux/pagemap.h> |
76ec5e338 CIFS: Move statfs... |
20 |
#include <linux/vfs.h> |
23db65f51 cifs: add a smb_v... |
21 |
#include "cifsglob.h" |
121b046af cifs: convert sen... |
22 23 |
#include "cifsproto.h" #include "cifs_debug.h" |
106dc538a CIFS: Separate pr... |
24 |
#include "cifspdu.h" |
121b046af cifs: convert sen... |
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
/* * An NT cancel request header looks just like the original request except: * * The Command is SMB_COM_NT_CANCEL * The WordCount is zeroed out * The ByteCount is zeroed out * * This function mangles an existing request buffer into a * SMB_COM_NT_CANCEL request and then sends it. */ static int send_nt_cancel(struct TCP_Server_Info *server, void *buf, struct mid_q_entry *mid) { int rc = 0; struct smb_hdr *in_buf = (struct smb_hdr *)buf; /* -4 for RFC1001 length and +2 for BCC field */ in_buf->smb_buf_length = cpu_to_be32(sizeof(struct smb_hdr) - 4 + 2); in_buf->Command = SMB_COM_NT_CANCEL; in_buf->WordCount = 0; put_bcc(0, in_buf); mutex_lock(&server->srv_mutex); rc = cifs_sign_smb(in_buf, server, &mid->sequence_number); if (rc) { mutex_unlock(&server->srv_mutex); return rc; } |
31efee60f cifs: adjust sequ... |
55 56 57 58 59 60 61 |
/* * The response to this call was already factored into the sequence * number when the call went out, so we must adjust it back downward * after signing here. */ --server->sequence_number; |
121b046af cifs: convert sen... |
62 |
rc = smb_send(server, in_buf, be32_to_cpu(in_buf->smb_buf_length)); |
ad313cb86 cifs: on send fai... |
63 64 |
if (rc < 0) server->sequence_number--; |
121b046af cifs: convert sen... |
65 |
mutex_unlock(&server->srv_mutex); |
f96637be0 [CIFS] cifs: Rena... |
66 67 |
cifs_dbg(FYI, "issued NT_CANCEL for mid %u, rc = %d ", |
3d378d3fd cifs: Make big en... |
68 |
get_mid(in_buf), rc); |
121b046af cifs: convert sen... |
69 70 71 |
return rc; } |
23db65f51 cifs: add a smb_v... |
72 |
|
55157dfbb CIFS: Separate pr... |
73 74 75 |
static bool cifs_compare_fids(struct cifsFileInfo *ob1, struct cifsFileInfo *ob2) { |
4b4de76e3 CIFS: Replace net... |
76 |
return ob1->fid.netfid == ob2->fid.netfid; |
55157dfbb CIFS: Separate pr... |
77 |
} |
eb3787111 CIFS: Move protoc... |
78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
static unsigned int cifs_read_data_offset(char *buf) { READ_RSP *rsp = (READ_RSP *)buf; return le16_to_cpu(rsp->DataOffset); } static unsigned int cifs_read_data_length(char *buf) { READ_RSP *rsp = (READ_RSP *)buf; return (le16_to_cpu(rsp->DataLengthHigh) << 16) + le16_to_cpu(rsp->DataLength); } |
8aa26f3ed CIFS: Move protoc... |
92 93 94 95 96 97 98 99 |
static struct mid_q_entry * cifs_find_mid(struct TCP_Server_Info *server, char *buffer) { struct smb_hdr *buf = (struct smb_hdr *)buffer; struct mid_q_entry *mid; spin_lock(&GlobalMid_Lock); list_for_each_entry(mid, &server->pending_mid_q, qhead) { |
3d378d3fd cifs: Make big en... |
100 |
if (compare_mid(mid->mid, buf) && |
8aa26f3ed CIFS: Move protoc... |
101 102 103 104 105 106 107 108 109 |
mid->mid_state == MID_REQUEST_SUBMITTED && le16_to_cpu(mid->command) == buf->Command) { spin_unlock(&GlobalMid_Lock); return mid; } } spin_unlock(&GlobalMid_Lock); return NULL; } |
452757897 CIFS: Move add/se... |
110 |
static void |
a891f0f89 CIFS: Extend cred... |
111 112 |
cifs_add_credits(struct TCP_Server_Info *server, const unsigned int add, const int optype) |
452757897 CIFS: Move add/se... |
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
{ spin_lock(&server->req_lock); server->credits += add; server->in_flight--; spin_unlock(&server->req_lock); wake_up(&server->request_q); } static void cifs_set_credits(struct TCP_Server_Info *server, const int val) { spin_lock(&server->req_lock); server->credits = val; server->oplocks = val > 1 ? enable_oplocks : false; spin_unlock(&server->req_lock); } static int * |
a891f0f89 CIFS: Extend cred... |
131 |
cifs_get_credits_field(struct TCP_Server_Info *server, const int optype) |
452757897 CIFS: Move add/se... |
132 133 134 |
{ return &server->credits; } |
a891f0f89 CIFS: Extend cred... |
135 136 137 138 139 |
static unsigned int cifs_get_credits(struct mid_q_entry *mid) { return 1; } |
882573606 CIFS: Move get_ne... |
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 |
/* * Find a free multiplex id (SMB mid). Otherwise there could be * mid collisions which might cause problems, demultiplexing the * wrong response to this request. Multiplex ids could collide if * one of a series requests takes much longer than the others, or * if a very large number of long lived requests (byte range * locks or FindNotify requests) are pending. No more than * 64K-1 requests can be outstanding at one time. If no * mids are available, return zero. A future optimization * could make the combination of mids and uid the key we use * to demultiplex on (rather than mid alone). * In addition to the above check, the cifs demultiplex * code already used the command code as a secondary * check of the frame and if signing is negotiated the * response would be discarded if the mid were the same * but the signature was wrong. Since the mid is not put in the * pending queue until later (when it is about to be dispatched) * we do have to limit the number of outstanding requests * to somewhat less than 64K-1 although it is hard to imagine * so many threads being in the vfs at one time. */ static __u64 cifs_get_next_mid(struct TCP_Server_Info *server) { __u64 mid = 0; __u16 last_mid, cur_mid; bool collision; spin_lock(&GlobalMid_Lock); /* mid is 16 bit only for CIFS/SMB */ cur_mid = (__u16)((server->CurrentMid) & 0xffff); /* we do not want to loop forever */ last_mid = cur_mid; cur_mid++; /* * This nested loop looks more expensive than it is. * In practice the list of pending requests is short, * fewer than 50, and the mids are likely to be unique * on the first pass through the loop unless some request * takes longer than the 64 thousand requests before it * (and it would also have to have been a request that * did not time out). */ while (cur_mid != last_mid) { struct mid_q_entry *mid_entry; unsigned int num_mids; collision = false; if (cur_mid == 0) cur_mid++; num_mids = 0; list_for_each_entry(mid_entry, &server->pending_mid_q, qhead) { ++num_mids; if (mid_entry->mid == cur_mid && mid_entry->mid_state == MID_REQUEST_SUBMITTED) { /* This mid is in use, try a different one */ collision = true; break; } } /* * if we have more than 32k mids in the list, then something * is very wrong. Possibly a local user is trying to DoS the * box by issuing long-running calls and SIGKILL'ing them. If * we get to 2^16 mids then we're in big trouble as this * function could loop forever. * * Go ahead and assign out the mid in this situation, but force * an eventual reconnect to clean out the pending_mid_q. */ if (num_mids > 32768) server->tcpStatus = CifsNeedReconnect; if (!collision) { mid = (__u64)cur_mid; server->CurrentMid = mid; break; } cur_mid++; } spin_unlock(&GlobalMid_Lock); return mid; } |
316cf94a9 CIFS: Move trans2... |
227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 |
/* return codes: 0 not a transact2, or all data present >0 transact2 with that much data missing -EINVAL invalid transact2 */ static int check2ndT2(char *buf) { struct smb_hdr *pSMB = (struct smb_hdr *)buf; struct smb_t2_rsp *pSMBt; int remaining; __u16 total_data_size, data_in_this_rsp; if (pSMB->Command != SMB_COM_TRANSACTION2) return 0; /* check for plausible wct, bcc and t2 data and parm sizes */ /* check for parm and data offset going beyond end of smb */ if (pSMB->WordCount != 10) { /* coalesce_t2 depends on this */ |
f96637be0 [CIFS] cifs: Rena... |
247 248 |
cifs_dbg(FYI, "invalid transact2 word count "); |
316cf94a9 CIFS: Move trans2... |
249 250 251 252 253 254 255 256 257 258 259 |
return -EINVAL; } pSMBt = (struct smb_t2_rsp *)pSMB; total_data_size = get_unaligned_le16(&pSMBt->t2_rsp.TotalDataCount); data_in_this_rsp = get_unaligned_le16(&pSMBt->t2_rsp.DataCount); if (total_data_size == data_in_this_rsp) return 0; else if (total_data_size < data_in_this_rsp) { |
f96637be0 [CIFS] cifs: Rena... |
260 261 262 |
cifs_dbg(FYI, "total data %d smaller than data in frame %d ", total_data_size, data_in_this_rsp); |
316cf94a9 CIFS: Move trans2... |
263 264 265 266 |
return -EINVAL; } remaining = total_data_size - data_in_this_rsp; |
f96637be0 [CIFS] cifs: Rena... |
267 268 269 |
cifs_dbg(FYI, "missing %d bytes from transact2, check next response ", remaining); |
316cf94a9 CIFS: Move trans2... |
270 |
if (total_data_size > CIFSMaxBufSize) { |
f96637be0 [CIFS] cifs: Rena... |
271 272 273 |
cifs_dbg(VFS, "TotalDataSize %d is over maximum buffer %d ", total_data_size, CIFSMaxBufSize); |
316cf94a9 CIFS: Move trans2... |
274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 |
return -EINVAL; } return remaining; } static int coalesce_t2(char *second_buf, struct smb_hdr *target_hdr) { struct smb_t2_rsp *pSMBs = (struct smb_t2_rsp *)second_buf; struct smb_t2_rsp *pSMBt = (struct smb_t2_rsp *)target_hdr; char *data_area_of_tgt; char *data_area_of_src; int remaining; unsigned int byte_count, total_in_tgt; __u16 tgt_total_cnt, src_total_cnt, total_in_src; src_total_cnt = get_unaligned_le16(&pSMBs->t2_rsp.TotalDataCount); tgt_total_cnt = get_unaligned_le16(&pSMBt->t2_rsp.TotalDataCount); if (tgt_total_cnt != src_total_cnt) |
f96637be0 [CIFS] cifs: Rena... |
294 295 296 |
cifs_dbg(FYI, "total data count of primary and secondary t2 differ source=%hu target=%hu ", src_total_cnt, tgt_total_cnt); |
316cf94a9 CIFS: Move trans2... |
297 298 299 300 301 302 |
total_in_tgt = get_unaligned_le16(&pSMBt->t2_rsp.DataCount); remaining = tgt_total_cnt - total_in_tgt; if (remaining < 0) { |
f96637be0 [CIFS] cifs: Rena... |
303 304 305 |
cifs_dbg(FYI, "Server sent too much data. tgt_total_cnt=%hu total_in_tgt=%hu ", tgt_total_cnt, total_in_tgt); |
316cf94a9 CIFS: Move trans2... |
306 307 308 309 310 |
return -EPROTO; } if (remaining == 0) { /* nothing to do, ignore */ |
f96637be0 [CIFS] cifs: Rena... |
311 312 |
cifs_dbg(FYI, "no more data remains "); |
316cf94a9 CIFS: Move trans2... |
313 314 315 316 317 |
return 0; } total_in_src = get_unaligned_le16(&pSMBs->t2_rsp.DataCount); if (remaining < total_in_src) |
f96637be0 [CIFS] cifs: Rena... |
318 319 |
cifs_dbg(FYI, "transact2 2nd response contains too much data "); |
316cf94a9 CIFS: Move trans2... |
320 321 322 323 324 325 326 327 328 329 330 331 332 333 |
/* find end of first SMB data area */ data_area_of_tgt = (char *)&pSMBt->hdr.Protocol + get_unaligned_le16(&pSMBt->t2_rsp.DataOffset); /* validate target area */ data_area_of_src = (char *)&pSMBs->hdr.Protocol + get_unaligned_le16(&pSMBs->t2_rsp.DataOffset); data_area_of_tgt += total_in_tgt; total_in_tgt += total_in_src; /* is the result too big for the field? */ if (total_in_tgt > USHRT_MAX) { |
f96637be0 [CIFS] cifs: Rena... |
334 335 336 |
cifs_dbg(FYI, "coalesced DataCount too large (%u) ", total_in_tgt); |
316cf94a9 CIFS: Move trans2... |
337 338 339 340 341 342 343 344 345 |
return -EPROTO; } put_unaligned_le16(total_in_tgt, &pSMBt->t2_rsp.DataCount); /* fix up the BCC */ byte_count = get_bcc(target_hdr); byte_count += total_in_src; /* is the result too big for the field? */ if (byte_count > USHRT_MAX) { |
f96637be0 [CIFS] cifs: Rena... |
346 347 |
cifs_dbg(FYI, "coalesced BCC too large (%u) ", byte_count); |
316cf94a9 CIFS: Move trans2... |
348 349 350 351 352 353 354 355 |
return -EPROTO; } put_bcc(byte_count, target_hdr); byte_count = be32_to_cpu(target_hdr->smb_buf_length); byte_count += total_in_src; /* don't allow buffer to overflow */ if (byte_count > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) { |
f96637be0 [CIFS] cifs: Rena... |
356 357 358 |
cifs_dbg(FYI, "coalesced BCC exceeds buffer size (%u) ", byte_count); |
316cf94a9 CIFS: Move trans2... |
359 360 361 362 363 364 365 366 367 |
return -ENOBUFS; } target_hdr->smb_buf_length = cpu_to_be32(byte_count); /* copy second buffer into end of first buffer */ memcpy(data_area_of_tgt, data_area_of_src, total_in_src); if (remaining != total_in_src) { /* more responses to go */ |
f96637be0 [CIFS] cifs: Rena... |
368 369 |
cifs_dbg(FYI, "waiting for more secondary responses "); |
316cf94a9 CIFS: Move trans2... |
370 371 372 373 |
return 1; } /* we are done */ |
f96637be0 [CIFS] cifs: Rena... |
374 375 |
cifs_dbg(FYI, "found the last secondary response "); |
316cf94a9 CIFS: Move trans2... |
376 377 |
return 0; } |
c11f1df50 cifs: Wait for wr... |
378 379 380 381 382 383 384 385 386 |
static void cifs_downgrade_oplock(struct TCP_Server_Info *server, struct cifsInodeInfo *cinode, bool set_level2) { if (set_level2) cifs_set_oplock_level(cinode, OPLOCK_READ); else cifs_set_oplock_level(cinode, 0); } |
316cf94a9 CIFS: Move trans2... |
387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 |
static bool cifs_check_trans2(struct mid_q_entry *mid, struct TCP_Server_Info *server, char *buf, int malformed) { if (malformed) return false; if (check2ndT2(buf) <= 0) return false; mid->multiRsp = true; if (mid->resp_buf) { /* merge response - fix up 1st*/ malformed = coalesce_t2(buf, mid->resp_buf); if (malformed > 0) return true; /* All parts received or packet is malformed. */ mid->multiEnd = true; dequeue_mid(mid, malformed); return true; } if (!server->large_buf) { /*FIXME: switch to already allocated largebuf?*/ |
f96637be0 [CIFS] cifs: Rena... |
408 409 |
cifs_dbg(VFS, "1st trans2 resp needs bigbuf "); |
316cf94a9 CIFS: Move trans2... |
410 411 412 413 414 415 416 417 |
} else { /* Have first buffer */ mid->resp_buf = buf; mid->large_buf = true; server->bigbuf = NULL; } return true; } |
286170aa2 CIFS: Move protoc... |
418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 |
static bool cifs_need_neg(struct TCP_Server_Info *server) { return server->maxBuf == 0; } static int cifs_negotiate(const unsigned int xid, struct cifs_ses *ses) { int rc; rc = CIFSSMBNegotiate(xid, ses); if (rc == -EAGAIN) { /* retry only once on 1st time connection */ set_credits(ses->server, 1); rc = CIFSSMBNegotiate(xid, ses); if (rc == -EAGAIN) rc = -EHOSTDOWN; } return rc; } |
24985c53d CIFS: Move r/wsiz... |
438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 |
static unsigned int cifs_negotiate_wsize(struct cifs_tcon *tcon, struct smb_vol *volume_info) { __u64 unix_cap = le64_to_cpu(tcon->fsUnixInfo.Capability); struct TCP_Server_Info *server = tcon->ses->server; unsigned int wsize; /* start with specified wsize, or default */ if (volume_info->wsize) wsize = volume_info->wsize; else if (tcon->unix_ext && (unix_cap & CIFS_UNIX_LARGE_WRITE_CAP)) wsize = CIFS_DEFAULT_IOSIZE; else wsize = CIFS_DEFAULT_NON_POSIX_WSIZE; /* can server support 24-bit write sizes? (via UNIX extensions) */ if (!tcon->unix_ext || !(unix_cap & CIFS_UNIX_LARGE_WRITE_CAP)) wsize = min_t(unsigned int, wsize, CIFS_MAX_RFC1002_WSIZE); /* * no CAP_LARGE_WRITE_X or is signing enabled without CAP_UNIX set? * Limit it to max buffer offered by the server, minus the size of the * WRITEX header, not including the 4 byte RFC1001 length. */ if (!(server->capabilities & CAP_LARGE_WRITE_X) || |
38d77c50b cifs: track the e... |
463 |
(!(server->capabilities & CAP_UNIX) && server->sign)) |
24985c53d CIFS: Move r/wsiz... |
464 465 |
wsize = min_t(unsigned int, wsize, server->maxBuf - sizeof(WRITE_REQ) + 4); |
24985c53d CIFS: Move r/wsiz... |
466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 |
/* hard limit of CIFS_MAX_WSIZE */ wsize = min_t(unsigned int, wsize, CIFS_MAX_WSIZE); return wsize; } static unsigned int cifs_negotiate_rsize(struct cifs_tcon *tcon, struct smb_vol *volume_info) { __u64 unix_cap = le64_to_cpu(tcon->fsUnixInfo.Capability); struct TCP_Server_Info *server = tcon->ses->server; unsigned int rsize, defsize; /* * Set default value... * * HACK alert! Ancient servers have very small buffers. Even though * MS-CIFS indicates that servers are only limited by the client's * bufsize for reads, testing against win98se shows that it throws * INVALID_PARAMETER errors if you try to request too large a read. * OS/2 just sends back short reads. * * If the server doesn't advertise CAP_LARGE_READ_X, then assume that * it can't handle a read request larger than its MaxBufferSize either. */ if (tcon->unix_ext && (unix_cap & CIFS_UNIX_LARGE_READ_CAP)) defsize = CIFS_DEFAULT_IOSIZE; else if (server->capabilities & CAP_LARGE_READ_X) defsize = CIFS_DEFAULT_NON_POSIX_RSIZE; else defsize = server->maxBuf - sizeof(READ_RSP); rsize = volume_info->rsize ? volume_info->rsize : defsize; /* * no CAP_LARGE_READ_X? Then MS-CIFS states that we must limit this to * the client's MaxBufferSize. */ if (!(server->capabilities & CAP_LARGE_READ_X)) rsize = min_t(unsigned int, CIFSMaxBufSize, rsize); |
24985c53d CIFS: Move r/wsiz... |
506 507 508 509 510 |
/* hard limit of CIFS_MAX_RSIZE */ rsize = min_t(unsigned int, rsize, CIFS_MAX_RSIZE); return rsize; } |
af4281dc2 CIFS: Move inform... |
511 512 513 514 515 516 |
static void cifs_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon) { CIFSSMBQFSDeviceInfo(xid, tcon); CIFSSMBQFSAttributeInfo(xid, tcon); } |
68889f269 CIFS: Move is_pat... |
517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 |
static int cifs_is_path_accessible(const unsigned int xid, struct cifs_tcon *tcon, struct cifs_sb_info *cifs_sb, const char *full_path) { int rc; FILE_ALL_INFO *file_info; file_info = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL); if (file_info == NULL) return -ENOMEM; rc = CIFSSMBQPathInfo(xid, tcon, full_path, file_info, 0 /* not legacy */, cifs_sb->local_nls, cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); if (rc == -EOPNOTSUPP || rc == -EINVAL) rc = SMBQueryInformation(xid, tcon, full_path, file_info, cifs_sb->local_nls, cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); kfree(file_info); return rc; } |
1208ef1f7 CIFS: Move query ... |
540 541 542 |
static int cifs_query_path_info(const unsigned int xid, struct cifs_tcon *tcon, struct cifs_sb_info *cifs_sb, const char *full_path, |
eb85d94bd CIFS: Fix symboli... |
543 |
FILE_ALL_INFO *data, bool *adjustTZ, bool *symlink) |
1208ef1f7 CIFS: Move query ... |
544 545 |
{ int rc; |
eb85d94bd CIFS: Fix symboli... |
546 |
*symlink = false; |
1208ef1f7 CIFS: Move query ... |
547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 |
/* could do find first instead but this returns more info */ rc = CIFSSMBQPathInfo(xid, tcon, full_path, data, 0 /* not legacy */, cifs_sb->local_nls, cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); /* * BB optimize code so we do not make the above call when server claims * no NT SMB support and the above call failed at least once - set flag * in tcon or mount. */ if ((rc == -EOPNOTSUPP) || (rc == -EINVAL)) { rc = SMBQueryInformation(xid, tcon, full_path, data, cifs_sb->local_nls, cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); *adjustTZ = true; } |
eb85d94bd CIFS: Fix symboli... |
563 564 565 566 |
if (!rc && (le32_to_cpu(data->Attributes) & ATTR_REPARSE)) { int tmprc; int oplock = 0; |
d81b8a40e CIFS: Cleanup cif... |
567 568 569 570 571 572 573 574 575 576 577 |
struct cifs_fid fid; struct cifs_open_parms oparms; oparms.tcon = tcon; oparms.cifs_sb = cifs_sb; oparms.desired_access = FILE_READ_ATTRIBUTES; oparms.create_options = 0; oparms.disposition = FILE_OPEN; oparms.path = full_path; oparms.fid = &fid; oparms.reconnect = false; |
eb85d94bd CIFS: Fix symboli... |
578 579 |
/* Need to check if this is a symbolic link or not */ |
d81b8a40e CIFS: Cleanup cif... |
580 |
tmprc = CIFS_open(xid, &oparms, &oplock, NULL); |
eb85d94bd CIFS: Fix symboli... |
581 582 583 |
if (tmprc == -EOPNOTSUPP) *symlink = true; else |
d81b8a40e CIFS: Cleanup cif... |
584 |
CIFSSMBClose(xid, tcon, fid.netfid); |
eb85d94bd CIFS: Fix symboli... |
585 |
} |
1208ef1f7 CIFS: Move query ... |
586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 |
return rc; } static int cifs_get_srv_inum(const unsigned int xid, struct cifs_tcon *tcon, struct cifs_sb_info *cifs_sb, const char *full_path, u64 *uniqueid, FILE_ALL_INFO *data) { /* * We can not use the IndexNumber field by default from Windows or * Samba (in ALL_INFO buf) but we can request it explicitly. The SNIA * CIFS spec claims that this value is unique within the scope of a * share, and the windows docs hint that it's actually unique * per-machine. * * There may be higher info levels that work but are there Windows * server or network appliances for which IndexNumber field is not * guaranteed unique? */ return CIFSGetSrvInodeNumber(xid, tcon, full_path, uniqueid, cifs_sb->local_nls, cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); } |
4ad650445 CIFS: Move guery ... |
610 611 612 613 614 615 |
static int cifs_query_file_info(const unsigned int xid, struct cifs_tcon *tcon, struct cifs_fid *fid, FILE_ALL_INFO *data) { return CIFSSMBQFileInfo(xid, tcon, fid->netfid, data); } |
44c581866 CIFS: Move clear/... |
616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 |
static void cifs_clear_stats(struct cifs_tcon *tcon) { #ifdef CONFIG_CIFS_STATS atomic_set(&tcon->stats.cifs_stats.num_writes, 0); atomic_set(&tcon->stats.cifs_stats.num_reads, 0); atomic_set(&tcon->stats.cifs_stats.num_flushes, 0); atomic_set(&tcon->stats.cifs_stats.num_oplock_brks, 0); atomic_set(&tcon->stats.cifs_stats.num_opens, 0); atomic_set(&tcon->stats.cifs_stats.num_posixopens, 0); atomic_set(&tcon->stats.cifs_stats.num_posixmkdirs, 0); atomic_set(&tcon->stats.cifs_stats.num_closes, 0); atomic_set(&tcon->stats.cifs_stats.num_deletes, 0); atomic_set(&tcon->stats.cifs_stats.num_mkdirs, 0); atomic_set(&tcon->stats.cifs_stats.num_rmdirs, 0); atomic_set(&tcon->stats.cifs_stats.num_renames, 0); atomic_set(&tcon->stats.cifs_stats.num_t2renames, 0); atomic_set(&tcon->stats.cifs_stats.num_ffirst, 0); atomic_set(&tcon->stats.cifs_stats.num_fnext, 0); atomic_set(&tcon->stats.cifs_stats.num_fclose, 0); atomic_set(&tcon->stats.cifs_stats.num_hardlinks, 0); atomic_set(&tcon->stats.cifs_stats.num_symlinks, 0); atomic_set(&tcon->stats.cifs_stats.num_locks, 0); atomic_set(&tcon->stats.cifs_stats.num_acl_get, 0); atomic_set(&tcon->stats.cifs_stats.num_acl_set, 0); #endif } static void cifs_print_stats(struct seq_file *m, struct cifs_tcon *tcon) { #ifdef CONFIG_CIFS_STATS seq_printf(m, " Oplocks breaks: %d", atomic_read(&tcon->stats.cifs_stats.num_oplock_brks)); seq_printf(m, " Reads: %d Bytes: %llu", atomic_read(&tcon->stats.cifs_stats.num_reads), (long long)(tcon->bytes_read)); seq_printf(m, " Writes: %d Bytes: %llu", atomic_read(&tcon->stats.cifs_stats.num_writes), (long long)(tcon->bytes_written)); seq_printf(m, " Flushes: %d", atomic_read(&tcon->stats.cifs_stats.num_flushes)); seq_printf(m, " Locks: %d HardLinks: %d Symlinks: %d", atomic_read(&tcon->stats.cifs_stats.num_locks), atomic_read(&tcon->stats.cifs_stats.num_hardlinks), atomic_read(&tcon->stats.cifs_stats.num_symlinks)); seq_printf(m, " Opens: %d Closes: %d Deletes: %d", atomic_read(&tcon->stats.cifs_stats.num_opens), atomic_read(&tcon->stats.cifs_stats.num_closes), atomic_read(&tcon->stats.cifs_stats.num_deletes)); seq_printf(m, " Posix Opens: %d Posix Mkdirs: %d", atomic_read(&tcon->stats.cifs_stats.num_posixopens), atomic_read(&tcon->stats.cifs_stats.num_posixmkdirs)); seq_printf(m, " Mkdirs: %d Rmdirs: %d", atomic_read(&tcon->stats.cifs_stats.num_mkdirs), atomic_read(&tcon->stats.cifs_stats.num_rmdirs)); seq_printf(m, " Renames: %d T2 Renames %d", atomic_read(&tcon->stats.cifs_stats.num_renames), atomic_read(&tcon->stats.cifs_stats.num_t2renames)); seq_printf(m, " FindFirst: %d FNext %d FClose %d", atomic_read(&tcon->stats.cifs_stats.num_ffirst), atomic_read(&tcon->stats.cifs_stats.num_fnext), atomic_read(&tcon->stats.cifs_stats.num_fclose)); #endif } |
f436720e9 CIFS: Separate pr... |
690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 |
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) { FILE_BASIC_INFO info; struct cifsInodeInfo *cifsInode; u32 dosattrs; int rc; memset(&info, 0, sizeof(info)); cifsInode = CIFS_I(inode); dosattrs = cifsInode->cifsAttrs|ATTR_READONLY; info.Attributes = cpu_to_le32(dosattrs); rc = CIFSSMBSetPathInfo(xid, tcon, full_path, &info, cifs_sb->local_nls, cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); if (rc == 0) cifsInode->cifsAttrs = dosattrs; } |
fb1214e48 CIFS: Move open c... |
710 |
static int |
226730b4d CIFS: Introduce c... |
711 712 |
cifs_open_file(const unsigned int xid, struct cifs_open_parms *oparms, __u32 *oplock, FILE_ALL_INFO *buf) |
fb1214e48 CIFS: Move open c... |
713 |
{ |
226730b4d CIFS: Introduce c... |
714 715 716 717 718 719 720 721 |
if (!(oparms->tcon->ses->capabilities & CAP_NT_SMBS)) return SMBLegacyOpen(xid, oparms->tcon, oparms->path, oparms->disposition, oparms->desired_access, oparms->create_options, &oparms->fid->netfid, oplock, buf, oparms->cifs_sb->local_nls, oparms->cifs_sb->mnt_cifs_flags |
fb1214e48 CIFS: Move open c... |
722 |
& CIFS_MOUNT_MAP_SPECIAL_CHR); |
d81b8a40e CIFS: Cleanup cif... |
723 |
return CIFS_open(xid, oparms, oplock, buf); |
fb1214e48 CIFS: Move open c... |
724 725 726 727 728 729 730 731 |
} static void cifs_set_fid(struct cifsFileInfo *cfile, struct cifs_fid *fid, __u32 oplock) { struct cifsInodeInfo *cinode = CIFS_I(cfile->dentry->d_inode); cfile->fid.netfid = fid->netfid; cifs_set_oplock_level(cinode, oplock); |
18cceb6a7 CIFS: Replace cli... |
732 |
cinode->can_cache_brlcks = CIFS_CACHE_WRITE(cinode); |
fb1214e48 CIFS: Move open c... |
733 |
} |
760ad0cac CIFS: Make ops->c... |
734 |
static void |
0ff78a221 CIFS: Move close ... |
735 736 737 |
cifs_close_file(const unsigned int xid, struct cifs_tcon *tcon, struct cifs_fid *fid) { |
760ad0cac CIFS: Make ops->c... |
738 |
CIFSSMBClose(xid, tcon, fid->netfid); |
0ff78a221 CIFS: Move close ... |
739 |
} |
1d8c4c000 CIFS: Make flush ... |
740 741 742 743 744 745 |
static int cifs_flush_file(const unsigned int xid, struct cifs_tcon *tcon, struct cifs_fid *fid) { return CIFSSMBFlush(xid, tcon, fid->netfid); } |
f9c6e234c CIFS: Move readpa... |
746 747 748 749 750 751 752 753 |
static int cifs_sync_read(const unsigned int xid, struct cifsFileInfo *cfile, struct cifs_io_parms *parms, unsigned int *bytes_read, char **buf, int *buf_type) { parms->netfid = cfile->fid.netfid; return CIFSSMBRead(xid, parms, bytes_read, buf, buf_type); } |
ba9ad7257 CIFS: Move writep... |
754 755 756 757 758 759 760 761 762 |
static int cifs_sync_write(const unsigned int xid, struct cifsFileInfo *cfile, struct cifs_io_parms *parms, unsigned int *written, struct kvec *iov, unsigned long nr_segs) { parms->netfid = cfile->fid.netfid; return CIFSSMBWrite2(xid, parms, written, iov, nr_segs); } |
6bdf6dbd6 CIFS: Move set_fi... |
763 764 765 766 767 768 |
static int smb_set_file_info(struct inode *inode, const char *full_path, FILE_BASIC_INFO *buf, const unsigned int xid) { int oplock = 0; int rc; |
6bdf6dbd6 CIFS: Move set_fi... |
769 |
__u32 netpid; |
d81b8a40e CIFS: Cleanup cif... |
770 771 |
struct cifs_fid fid; struct cifs_open_parms oparms; |
6bdf6dbd6 CIFS: Move set_fi... |
772 773 774 775 776 |
struct cifsFileInfo *open_file; struct cifsInodeInfo *cinode = CIFS_I(inode); struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); struct tcon_link *tlink = NULL; struct cifs_tcon *tcon; |
6bdf6dbd6 CIFS: Move set_fi... |
777 778 779 780 |
/* if the file is already open for write, just use that fileid */ open_file = find_writable_file(cinode, true); if (open_file) { |
d81b8a40e CIFS: Cleanup cif... |
781 |
fid.netfid = open_file->fid.netfid; |
6bdf6dbd6 CIFS: Move set_fi... |
782 783 784 785 786 787 788 789 790 791 792 793 |
netpid = open_file->pid; tcon = tlink_tcon(open_file->tlink); goto set_via_filehandle; } tlink = cifs_sb_tlink(cifs_sb); if (IS_ERR(tlink)) { rc = PTR_ERR(tlink); tlink = NULL; goto out; } tcon = tlink_tcon(tlink); |
281e2e7d0 cifs: remove the ... |
794 |
rc = CIFSSMBSetPathInfo(xid, tcon, full_path, buf, cifs_sb->local_nls, |
6bdf6dbd6 CIFS: Move set_fi... |
795 796 |
cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); |
281e2e7d0 cifs: remove the ... |
797 798 799 800 801 |
if (rc == 0) { cinode->cifsAttrs = le32_to_cpu(buf->Attributes); goto out; } else if (rc != -EOPNOTSUPP && rc != -EINVAL) { goto out; |
6bdf6dbd6 CIFS: Move set_fi... |
802 |
} |
d81b8a40e CIFS: Cleanup cif... |
803 804 805 806 807 808 809 810 |
oparms.tcon = tcon; oparms.cifs_sb = cifs_sb; oparms.desired_access = SYNCHRONIZE | FILE_WRITE_ATTRIBUTES; oparms.create_options = CREATE_NOT_DIR; oparms.disposition = FILE_OPEN; oparms.path = full_path; oparms.fid = &fid; oparms.reconnect = false; |
6bdf6dbd6 CIFS: Move set_fi... |
811 |
|
d81b8a40e CIFS: Cleanup cif... |
812 813 814 |
cifs_dbg(FYI, "calling SetFileInfo since SetPathInfo for times not supported by this server "); rc = CIFS_open(xid, &oparms, &oplock, NULL); |
6bdf6dbd6 CIFS: Move set_fi... |
815 816 817 818 819 820 821 822 823 |
if (rc != 0) { if (rc == -EIO) rc = -EINVAL; goto out; } netpid = current->tgid; set_via_filehandle: |
d81b8a40e CIFS: Cleanup cif... |
824 |
rc = CIFSSMBSetFileInfo(xid, tcon, buf, fid.netfid, netpid); |
6bdf6dbd6 CIFS: Move set_fi... |
825 826 827 828 |
if (!rc) cinode->cifsAttrs = le32_to_cpu(buf->Attributes); if (open_file == NULL) |
d81b8a40e CIFS: Cleanup cif... |
829 |
CIFSSMBClose(xid, tcon, fid.netfid); |
6bdf6dbd6 CIFS: Move set_fi... |
830 831 832 833 834 835 836 |
else cifsFileInfo_put(open_file); out: if (tlink != NULL) cifs_put_tlink(tlink); return rc; } |
92fc65a74 CIFS: Move readdi... |
837 |
static int |
c7f508a99 Allow setting per... |
838 839 840 841 842 843 844 |
cifs_set_compression(const unsigned int xid, struct cifs_tcon *tcon, struct cifsFileInfo *cfile) { return CIFSSMB_set_compression(xid, tcon, cfile->fid.netfid); } static int |
92fc65a74 CIFS: Move readdi... |
845 846 847 848 849 |
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) { |
c052e2b42 cifs: obtain file... |
850 851 |
return CIFSFindFirst(xid, tcon, path, cifs_sb, &fid->netfid, search_flags, srch_inf, true); |
92fc65a74 CIFS: Move readdi... |
852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 |
} 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) { return CIFSFindNext(xid, tcon, fid->netfid, search_flags, srch_inf); } static int cifs_close_dir(const unsigned int xid, struct cifs_tcon *tcon, struct cifs_fid *fid) { return CIFSFindClose(xid, tcon, fid->netfid); } |
95a3f2f37 CIFS: Move oplock... |
868 869 870 871 872 873 |
static int cifs_oplock_response(struct cifs_tcon *tcon, struct cifs_fid *fid, struct cifsInodeInfo *cinode) { return CIFSSMBLock(0, tcon, fid->netfid, current->tgid, 0, 0, 0, 0, LOCKING_ANDX_OPLOCK_RELEASE, false, |
18cceb6a7 CIFS: Replace cli... |
874 |
CIFS_CACHE_READ(cinode) ? 1 : 0); |
95a3f2f37 CIFS: Move oplock... |
875 |
} |
76ec5e338 CIFS: Move statfs... |
876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 |
static int cifs_queryfs(const unsigned int xid, struct cifs_tcon *tcon, struct kstatfs *buf) { int rc = -EOPNOTSUPP; buf->f_type = CIFS_MAGIC_NUMBER; /* * We could add a second check for a QFS Unix capability bit */ if ((tcon->ses->capabilities & CAP_UNIX) && (CIFS_POSIX_EXTENSIONS & le64_to_cpu(tcon->fsUnixInfo.Capability))) rc = CIFSSMBQFSPosixInfo(xid, tcon, buf); /* * Only need to call the old QFSInfo if failed on newer one, * e.g. by OS/2. **/ if (rc && (tcon->ses->capabilities & CAP_NT_SMBS)) rc = CIFSSMBQFSInfo(xid, tcon, buf); /* * Some old Windows servers also do not support level 103, retry with * older level one if old server failed the previous call or we * bypassed it because we detected that this was an older LANMAN sess */ if (rc) rc = SMBOldQFSInfo(xid, tcon, buf); return rc; } |
d39a4f710 CIFS: Move brlock... |
907 908 909 910 911 912 913 914 |
static int cifs_mand_lock(const unsigned int xid, struct cifsFileInfo *cfile, __u64 offset, __u64 length, __u32 type, int lock, int unlock, bool wait) { return CIFSSMBLock(xid, tlink_tcon(cfile->tlink), cfile->fid.netfid, current->tgid, length, offset, unlock, lock, (__u8)type, wait, 0); } |
d244bf2df CIFS: Implement f... |
915 |
static int |
924e3fa48 cifs: Add support... |
916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 |
cifs_unix_dfs_readlink(const unsigned int xid, struct cifs_tcon *tcon, const unsigned char *searchName, char **symlinkinfo, const struct nls_table *nls_codepage) { #ifdef CONFIG_CIFS_DFS_UPCALL int rc; unsigned int num_referrals = 0; struct dfs_info3_param *referrals = NULL; rc = get_dfs_path(xid, tcon->ses, searchName, nls_codepage, &num_referrals, &referrals, 0); if (!rc && num_referrals > 0) { *symlinkinfo = kstrndup(referrals->node_name, strlen(referrals->node_name), GFP_KERNEL); if (!*symlinkinfo) rc = -ENOMEM; free_dfs_info_array(referrals, num_referrals); } return rc; #else /* No DFS support */ return -EREMOTE; #endif } static int |
d244bf2df CIFS: Implement f... |
943 944 945 946 947 948 |
cifs_query_symlink(const unsigned int xid, struct cifs_tcon *tcon, const char *full_path, char **target_path, struct cifs_sb_info *cifs_sb) { int rc; int oplock = 0; |
d81b8a40e CIFS: Cleanup cif... |
949 950 |
struct cifs_fid fid; struct cifs_open_parms oparms; |
d244bf2df CIFS: Implement f... |
951 952 953 |
cifs_dbg(FYI, "%s: path: %s ", __func__, full_path); |
0ecdb4f57 cifs: move unix e... |
954 955 956 957 |
/* Check for unix extensions */ if (cap_unix(tcon->ses)) { rc = CIFSSMBUnixQuerySymLink(xid, tcon, full_path, target_path, cifs_sb->local_nls); |
924e3fa48 cifs: Add support... |
958 959 960 961 |
if (rc == -EREMOTE) rc = cifs_unix_dfs_readlink(xid, tcon, full_path, target_path, cifs_sb->local_nls); |
0ecdb4f57 cifs: move unix e... |
962 963 |
goto out; } |
d81b8a40e CIFS: Cleanup cif... |
964 965 966 967 968 969 970 971 972 973 |
oparms.tcon = tcon; oparms.cifs_sb = cifs_sb; oparms.desired_access = FILE_READ_ATTRIBUTES; oparms.create_options = OPEN_REPARSE_POINT; oparms.disposition = FILE_OPEN; oparms.path = full_path; oparms.fid = &fid; oparms.reconnect = false; rc = CIFS_open(xid, &oparms, &oplock, NULL); |
d244bf2df CIFS: Implement f... |
974 |
if (rc) |
0ecdb4f57 cifs: move unix e... |
975 |
goto out; |
d244bf2df CIFS: Implement f... |
976 |
|
d81b8a40e CIFS: Cleanup cif... |
977 |
rc = CIFSSMBQuerySymLink(xid, tcon, fid.netfid, target_path, |
d244bf2df CIFS: Implement f... |
978 |
cifs_sb->local_nls); |
0ecdb4f57 cifs: move unix e... |
979 980 |
if (rc) goto out_close; |
d244bf2df CIFS: Implement f... |
981 982 |
convert_delimiter(*target_path, '/'); |
0ecdb4f57 cifs: move unix e... |
983 |
out_close: |
d81b8a40e CIFS: Cleanup cif... |
984 |
CIFSSMBClose(xid, tcon, fid.netfid); |
0ecdb4f57 cifs: move unix e... |
985 986 987 988 |
out: if (!rc) cifs_dbg(FYI, "%s: target path: %s ", __func__, *target_path); |
d244bf2df CIFS: Implement f... |
989 990 |
return rc; } |
53ef1016f CIFS: Store lease... |
991 992 993 994 995 |
static bool cifs_is_read_op(__u32 oplock) { return oplock == OPLOCK_READ; } |
7f6c50086 CIFS: Fix cifs_wr... |
996 997 998 999 1000 |
static unsigned int cifs_wp_retry_size(struct inode *inode) { return CIFS_SB(inode->i_sb)->wsize; } |
52755808d CIFS: Fix SMB2 re... |
1001 1002 1003 1004 1005 |
static bool cifs_dir_needs_close(struct cifsFileInfo *cfile) { return !cfile->srch_inf.endOfSearch && !cfile->invalidHandle; } |
23db65f51 cifs: add a smb_v... |
1006 |
struct smb_version_operations smb1_operations = { |
121b046af cifs: convert sen... |
1007 |
.send_cancel = send_nt_cancel, |
55157dfbb CIFS: Separate pr... |
1008 |
.compare_fids = cifs_compare_fids, |
082d0642c CIFS: Move protoc... |
1009 |
.setup_request = cifs_setup_request, |
45740847e CIFS: Setup async... |
1010 |
.setup_async_request = cifs_setup_async_request, |
082d0642c CIFS: Move protoc... |
1011 |
.check_receive = cifs_check_receive, |
452757897 CIFS: Move add/se... |
1012 1013 1014 |
.add_credits = cifs_add_credits, .set_credits = cifs_set_credits, .get_credits_field = cifs_get_credits_field, |
a891f0f89 CIFS: Extend cred... |
1015 |
.get_credits = cifs_get_credits, |
cb7e9eabb CIFS: Use multicr... |
1016 |
.wait_mtu_credits = cifs_wait_mtu_credits, |
882573606 CIFS: Move get_ne... |
1017 |
.get_next_mid = cifs_get_next_mid, |
eb3787111 CIFS: Move protoc... |
1018 1019 1020 |
.read_data_offset = cifs_read_data_offset, .read_data_length = cifs_read_data_length, .map_error = map_smb_to_linux_error, |
8aa26f3ed CIFS: Move protoc... |
1021 1022 1023 |
.find_mid = cifs_find_mid, .check_message = checkSMB, .dump_detail = cifs_dump_detail, |
44c581866 CIFS: Move clear/... |
1024 1025 |
.clear_stats = cifs_clear_stats, .print_stats = cifs_print_stats, |
8aa26f3ed CIFS: Move protoc... |
1026 |
.is_oplock_break = is_valid_oplock_break, |
c11f1df50 cifs: Wait for wr... |
1027 |
.downgrade_oplock = cifs_downgrade_oplock, |
316cf94a9 CIFS: Move trans2... |
1028 |
.check_trans2 = cifs_check_trans2, |
286170aa2 CIFS: Move protoc... |
1029 1030 |
.need_neg = cifs_need_neg, .negotiate = cifs_negotiate, |
24985c53d CIFS: Move r/wsiz... |
1031 1032 |
.negotiate_wsize = cifs_negotiate_wsize, .negotiate_rsize = cifs_negotiate_rsize, |
58c45c58a CIFS: Move protoc... |
1033 1034 |
.sess_setup = CIFS_SessSetup, .logoff = CIFSSMBLogoff, |
2e6e02ab6 CIFS: Move protoc... |
1035 1036 |
.tree_connect = CIFSTCon, .tree_disconnect = CIFSSMBTDis, |
b669f33ca CIFS: Move gettin... |
1037 |
.get_dfs_refer = CIFSGetDFSRefer, |
af4281dc2 CIFS: Move inform... |
1038 |
.qfs_tcon = cifs_qfs_tcon, |
68889f269 CIFS: Move is_pat... |
1039 |
.is_path_accessible = cifs_is_path_accessible, |
1208ef1f7 CIFS: Move query ... |
1040 |
.query_path_info = cifs_query_path_info, |
4ad650445 CIFS: Move guery ... |
1041 |
.query_file_info = cifs_query_file_info, |
1208ef1f7 CIFS: Move query ... |
1042 |
.get_srv_inum = cifs_get_srv_inum, |
d14334181 CIFS: Move set_fi... |
1043 1044 |
.set_path_size = CIFSSMBSetEOF, .set_file_size = CIFSSMBSetFileSize, |
6bdf6dbd6 CIFS: Move set_fi... |
1045 |
.set_file_info = smb_set_file_info, |
c7f508a99 Allow setting per... |
1046 |
.set_compression = cifs_set_compression, |
f6d761786 CIFS: Move echo c... |
1047 |
.echo = CIFSSMBEcho, |
f436720e9 CIFS: Separate pr... |
1048 1049 |
.mkdir = CIFSSMBMkDir, .mkdir_setinfo = cifs_mkdir_setinfo, |
f958ca5d8 CIFS: Move rmdir ... |
1050 |
.rmdir = CIFSSMBRmDir, |
ed6875e0d CIFS: Move unlink... |
1051 1052 |
.unlink = CIFSSMBDelFile, .rename_pending_delete = cifs_rename_pending_delete, |
8ceb98437 CIFS: Move rename... |
1053 |
.rename = CIFSSMBRename, |
d6e906f1b CIFS: Move hardli... |
1054 |
.create_hardlink = CIFSCreateHardLink, |
d244bf2df CIFS: Implement f... |
1055 |
.query_symlink = cifs_query_symlink, |
fb1214e48 CIFS: Move open c... |
1056 1057 |
.open = cifs_open_file, .set_fid = cifs_set_fid, |
0ff78a221 CIFS: Move close ... |
1058 |
.close = cifs_close_file, |
1d8c4c000 CIFS: Make flush ... |
1059 |
.flush = cifs_flush_file, |
fc9c59662 CIFS: Move async ... |
1060 |
.async_readv = cifs_async_readv, |
c9de5c80d CIFS: Move async ... |
1061 |
.async_writev = cifs_async_writev, |
f9c6e234c CIFS: Move readpa... |
1062 |
.sync_read = cifs_sync_read, |
ba9ad7257 CIFS: Move writep... |
1063 |
.sync_write = cifs_sync_write, |
92fc65a74 CIFS: Move readdi... |
1064 1065 1066 1067 |
.query_dir_first = cifs_query_dir_first, .query_dir_next = cifs_query_dir_next, .close_dir = cifs_close_dir, .calc_smb_size = smbCalcSize, |
95a3f2f37 CIFS: Move oplock... |
1068 |
.oplock_response = cifs_oplock_response, |
76ec5e338 CIFS: Move statfs... |
1069 |
.queryfs = cifs_queryfs, |
d39a4f710 CIFS: Move brlock... |
1070 1071 1072 |
.mand_lock = cifs_mand_lock, .mand_unlock_range = cifs_unlock_range, .push_mand_locks = cifs_push_mandatory_locks, |
b5be1a1c4 cifs: Rename and ... |
1073 |
.query_mf_symlink = cifs_query_mf_symlink, |
cbb0aba6f cifs: Add create ... |
1074 |
.create_mf_symlink = cifs_create_mf_symlink, |
53ef1016f CIFS: Store lease... |
1075 |
.is_read_op = cifs_is_read_op, |
7f6c50086 CIFS: Fix cifs_wr... |
1076 |
.wp_retry_size = cifs_wp_retry_size, |
52755808d CIFS: Fix SMB2 re... |
1077 |
.dir_needs_close = cifs_dir_needs_close, |
d979f3b0a Add protocol spec... |
1078 1079 1080 1081 |
#ifdef CONFIG_CIFS_XATTR .query_all_EAs = CIFSSMBQAllEAs, .set_EA = CIFSSMBSetEA, #endif /* CIFS_XATTR */ |
83e3bc23e retrieving CIFS A... |
1082 1083 |
#ifdef CONFIG_CIFS_ACL .get_acl = get_cifs_acl, |
42eacf9e5 [CIFS] Fix cifsac... |
1084 |
.get_acl_by_fid = get_cifs_acl_by_fid, |
83e3bc23e retrieving CIFS A... |
1085 1086 |
.set_acl = set_cifs_acl, #endif /* CIFS_ACL */ |
23db65f51 cifs: add a smb_v... |
1087 1088 1089 1090 |
}; struct smb_version_values smb1_values = { .version_string = SMB1_VERSION_STRING, |
106dc538a CIFS: Separate pr... |
1091 1092 1093 1094 |
.large_lock_type = LOCKING_ANDX_LARGE_FILES, .exclusive_lock_type = 0, .shared_lock_type = LOCKING_ANDX_SHARED_LOCK, .unlock_lock_type = 0, |
1887f6010 CIFS: Move header... |
1095 1096 |
.header_size = sizeof(struct smb_hdr), .max_header_size = MAX_CIFS_HDR_SIZE, |
eb3787111 CIFS: Move protoc... |
1097 |
.read_rsp_size = sizeof(READ_RSP), |
2dc7e1c03 CIFS: Make transp... |
1098 |
.lock_cmd = cpu_to_le16(SMB_COM_LOCKING_ANDX), |
29e20f9c6 CIFS: Make CAP_* ... |
1099 1100 1101 |
.cap_unix = CAP_UNIX, .cap_nt_find = CAP_NT_SMBS | CAP_NT_FIND, .cap_large_files = CAP_LARGE_FILES, |
50285882f cifs: fix SMB2 si... |
1102 1103 |
.signing_enabled = SECMODE_SIGN_ENABLED, .signing_required = SECMODE_SIGN_REQUIRED, |
23db65f51 cifs: add a smb_v... |
1104 |
}; |