1 // SPDX-License-Identifier: LGPL-2.1 2 /* 3 * 4 * vfs operations that deal with files 5 * 6 * Copyright (C) International Business Machines Corp., 2002,2010 7 * Author(s): Steve French (sfrench@us.ibm.com) 8 * Jeremy Allison (jra@samba.org) 9 * 10 */ 11 #include <linux/fs.h> 12 #include <linux/fs_struct.h> 13 #include <linux/filelock.h> 14 #include <linux/backing-dev.h> 15 #include <linux/stat.h> 16 #include <linux/fcntl.h> 17 #include <linux/pagemap.h> 18 #include <linux/writeback.h> 19 #include <linux/task_io_accounting_ops.h> 20 #include <linux/delay.h> 21 #include <linux/mount.h> 22 #include <linux/slab.h> 23 #include <linux/swap.h> 24 #include <linux/mm.h> 25 #include <asm/div64.h> 26 #include "cifsfs.h" 27 #include "cifsglob.h" 28 #include "cifsproto.h" 29 #include "smb2proto.h" 30 #include "cifs_unicode.h" 31 #include "cifs_debug.h" 32 #include "cifs_fs_sb.h" 33 #include "fscache.h" 34 #include "smbdirect.h" 35 #include "fs_context.h" 36 #include "cifs_ioctl.h" 37 #include "cached_dir.h" 38 #include <trace/events/netfs.h> 39 40 static int cifs_reopen_file(struct cifsFileInfo *cfile, bool can_flush); 41 42 /* 43 * Prepare a subrequest to upload to the server. We need to allocate credits 44 * so that we know the maximum amount of data that we can include in it. 45 */ 46 static void cifs_prepare_write(struct netfs_io_subrequest *subreq) 47 { 48 struct cifs_io_subrequest *wdata = 49 container_of(subreq, struct cifs_io_subrequest, subreq); 50 struct cifs_io_request *req = wdata->req; 51 struct netfs_io_stream *stream = &req->rreq.io_streams[subreq->stream_nr]; 52 struct TCP_Server_Info *server; 53 struct cifsFileInfo *open_file = req->cfile; 54 struct cifs_sb_info *cifs_sb = CIFS_SB(wdata->rreq->inode->i_sb); 55 size_t wsize = req->rreq.wsize; 56 int rc; 57 58 if (!wdata->have_xid) { 59 wdata->xid = get_xid(); 60 wdata->have_xid = true; 61 } 62 63 server = cifs_pick_channel(tlink_tcon(open_file->tlink)->ses); 64 wdata->server = server; 65 66 if (cifs_sb->ctx->wsize == 0) 67 cifs_negotiate_wsize(server, cifs_sb->ctx, 68 tlink_tcon(req->cfile->tlink)); 69 70 retry: 71 if (open_file->invalidHandle) { 72 rc = cifs_reopen_file(open_file, false); 73 if (rc < 0) { 74 if (rc == -EAGAIN) 75 goto retry; 76 subreq->error = rc; 77 return netfs_prepare_write_failed(subreq); 78 } 79 } 80 81 rc = server->ops->wait_mtu_credits(server, wsize, &stream->sreq_max_len, 82 &wdata->credits); 83 if (rc < 0) { 84 subreq->error = rc; 85 return netfs_prepare_write_failed(subreq); 86 } 87 88 wdata->credits.rreq_debug_id = subreq->rreq->debug_id; 89 wdata->credits.rreq_debug_index = subreq->debug_index; 90 wdata->credits.in_flight_check = 1; 91 trace_smb3_rw_credits(wdata->rreq->debug_id, 92 wdata->subreq.debug_index, 93 wdata->credits.value, 94 server->credits, server->in_flight, 95 wdata->credits.value, 96 cifs_trace_rw_credits_write_prepare); 97 98 #ifdef CONFIG_CIFS_SMB_DIRECT 99 if (server->smbd_conn) { 100 const struct smbdirect_socket_parameters *sp = 101 smbd_get_parameters(server->smbd_conn); 102 103 stream->sreq_max_segs = sp->max_frmr_depth; 104 } 105 #endif 106 } 107 108 /* 109 * Issue a subrequest to upload to the server. 110 */ 111 static void cifs_issue_write(struct netfs_io_subrequest *subreq) 112 { 113 struct cifs_io_subrequest *wdata = 114 container_of(subreq, struct cifs_io_subrequest, subreq); 115 struct cifs_sb_info *sbi = CIFS_SB(subreq->rreq->inode->i_sb); 116 int rc; 117 118 if (cifs_forced_shutdown(sbi)) { 119 rc = smb_EIO(smb_eio_trace_forced_shutdown); 120 goto fail; 121 } 122 123 rc = adjust_credits(wdata->server, wdata, cifs_trace_rw_credits_issue_write_adjust); 124 if (rc) 125 goto fail; 126 127 rc = -EAGAIN; 128 if (wdata->req->cfile->invalidHandle) 129 goto fail; 130 131 wdata->server->ops->async_writev(wdata); 132 out: 133 return; 134 135 fail: 136 if (rc == -EAGAIN) 137 trace_netfs_sreq(subreq, netfs_sreq_trace_retry); 138 else 139 trace_netfs_sreq(subreq, netfs_sreq_trace_fail); 140 add_credits_and_wake_if(wdata->server, &wdata->credits, 0); 141 cifs_write_subrequest_terminated(wdata, rc); 142 goto out; 143 } 144 145 static void cifs_netfs_invalidate_cache(struct netfs_io_request *wreq) 146 { 147 cifs_invalidate_cache(wreq->inode, 0); 148 } 149 150 /* 151 * Negotiate the size of a read operation on behalf of the netfs library. 152 */ 153 static int cifs_prepare_read(struct netfs_io_subrequest *subreq) 154 { 155 struct netfs_io_request *rreq = subreq->rreq; 156 struct cifs_io_subrequest *rdata = container_of(subreq, struct cifs_io_subrequest, subreq); 157 struct cifs_io_request *req = container_of(subreq->rreq, struct cifs_io_request, rreq); 158 struct TCP_Server_Info *server; 159 struct cifs_sb_info *cifs_sb = CIFS_SB(rreq->inode->i_sb); 160 size_t size; 161 int rc = 0; 162 163 if (!rdata->have_xid) { 164 rdata->xid = get_xid(); 165 rdata->have_xid = true; 166 } 167 168 server = cifs_pick_channel(tlink_tcon(req->cfile->tlink)->ses); 169 rdata->server = server; 170 171 if (cifs_sb->ctx->rsize == 0) 172 cifs_negotiate_rsize(server, cifs_sb->ctx, 173 tlink_tcon(req->cfile->tlink)); 174 175 rc = server->ops->wait_mtu_credits(server, cifs_sb->ctx->rsize, 176 &size, &rdata->credits); 177 if (rc) 178 return rc; 179 180 rreq->io_streams[0].sreq_max_len = size; 181 182 rdata->credits.in_flight_check = 1; 183 rdata->credits.rreq_debug_id = rreq->debug_id; 184 rdata->credits.rreq_debug_index = subreq->debug_index; 185 186 trace_smb3_rw_credits(rdata->rreq->debug_id, 187 rdata->subreq.debug_index, 188 rdata->credits.value, 189 server->credits, server->in_flight, 0, 190 cifs_trace_rw_credits_read_submit); 191 192 #ifdef CONFIG_CIFS_SMB_DIRECT 193 if (server->smbd_conn) { 194 const struct smbdirect_socket_parameters *sp = 195 smbd_get_parameters(server->smbd_conn); 196 197 rreq->io_streams[0].sreq_max_segs = sp->max_frmr_depth; 198 } 199 #endif 200 return 0; 201 } 202 203 /* 204 * Issue a read operation on behalf of the netfs helper functions. We're asked 205 * to make a read of a certain size at a point in the file. We are permitted 206 * to only read a portion of that, but as long as we read something, the netfs 207 * helper will call us again so that we can issue another read. 208 */ 209 static void cifs_issue_read(struct netfs_io_subrequest *subreq) 210 { 211 struct netfs_io_request *rreq = subreq->rreq; 212 struct cifs_io_subrequest *rdata = container_of(subreq, struct cifs_io_subrequest, subreq); 213 struct cifs_io_request *req = container_of(subreq->rreq, struct cifs_io_request, rreq); 214 struct TCP_Server_Info *server = rdata->server; 215 int rc = 0; 216 217 cifs_dbg(FYI, "%s: op=%08x[%x] mapping=%p len=%zu/%zu\n", 218 __func__, rreq->debug_id, subreq->debug_index, rreq->mapping, 219 subreq->transferred, subreq->len); 220 221 rc = adjust_credits(server, rdata, cifs_trace_rw_credits_issue_read_adjust); 222 if (rc) 223 goto failed; 224 225 if (req->cfile->invalidHandle) { 226 do { 227 rc = cifs_reopen_file(req->cfile, true); 228 } while (rc == -EAGAIN); 229 if (rc) 230 goto failed; 231 } 232 233 if (subreq->rreq->origin != NETFS_UNBUFFERED_READ && 234 subreq->rreq->origin != NETFS_DIO_READ) 235 __set_bit(NETFS_SREQ_CLEAR_TAIL, &subreq->flags); 236 237 trace_netfs_sreq(subreq, netfs_sreq_trace_submit); 238 rc = rdata->server->ops->async_readv(rdata); 239 if (rc) 240 goto failed; 241 return; 242 243 failed: 244 add_credits_and_wake_if(rdata->server, &rdata->credits, 0); 245 subreq->error = rc; 246 netfs_read_subreq_terminated(subreq); 247 } 248 249 /* 250 * Writeback calls this when it finds a folio that needs uploading. This isn't 251 * called if writeback only has copy-to-cache to deal with. 252 */ 253 static void cifs_begin_writeback(struct netfs_io_request *wreq) 254 { 255 struct cifs_io_request *req = container_of(wreq, struct cifs_io_request, rreq); 256 int ret; 257 258 ret = cifs_get_writable_file(CIFS_I(wreq->inode), FIND_ANY, &req->cfile); 259 if (ret) { 260 cifs_dbg(VFS, "No writable handle in writepages ret=%d\n", ret); 261 return; 262 } 263 264 wreq->io_streams[0].avail = true; 265 } 266 267 /* 268 * Initialise a request. 269 */ 270 static int cifs_init_request(struct netfs_io_request *rreq, struct file *file) 271 { 272 struct cifs_io_request *req = container_of(rreq, struct cifs_io_request, rreq); 273 struct cifs_sb_info *cifs_sb = CIFS_SB(rreq->inode); 274 struct cifsFileInfo *open_file = NULL; 275 276 rreq->rsize = cifs_sb->ctx->rsize; 277 rreq->wsize = cifs_sb->ctx->wsize; 278 req->pid = current->tgid; // Ummm... This may be a workqueue 279 280 if (file) { 281 open_file = file->private_data; 282 rreq->netfs_priv = file->private_data; 283 req->cfile = cifsFileInfo_get(open_file); 284 if (cifs_sb_flags(cifs_sb) & CIFS_MOUNT_RWPIDFORWARD) 285 req->pid = req->cfile->pid; 286 } else if (rreq->origin != NETFS_WRITEBACK) { 287 WARN_ON_ONCE(1); 288 return smb_EIO1(smb_eio_trace_not_netfs_writeback, rreq->origin); 289 } 290 291 atomic_inc(&cifs_sb->outstanding_rreq); 292 return 0; 293 } 294 295 /* 296 * Completion of a request operation. 297 */ 298 static void cifs_rreq_done(struct netfs_io_request *rreq) 299 { 300 struct timespec64 atime, mtime; 301 struct inode *inode = rreq->inode; 302 303 /* we do not want atime to be less than mtime, it broke some apps */ 304 atime = inode_set_atime_to_ts(inode, current_time(inode)); 305 mtime = inode_get_mtime(inode); 306 if (timespec64_compare(&atime, &mtime) < 0) 307 inode_set_atime_to_ts(inode, inode_get_mtime(inode)); 308 } 309 310 static void cifs_free_request(struct netfs_io_request *rreq) 311 { 312 struct cifs_io_request *req = container_of(rreq, struct cifs_io_request, rreq); 313 struct cifs_sb_info *cifs_sb = CIFS_SB(rreq->inode->i_sb); 314 315 if (req->cfile) 316 cifsFileInfo_put(req->cfile); 317 318 if (atomic_dec_and_test(&cifs_sb->outstanding_rreq)) 319 wake_up_var(&cifs_sb->outstanding_rreq); 320 } 321 322 static void cifs_free_subrequest(struct netfs_io_subrequest *subreq) 323 { 324 struct cifs_io_subrequest *rdata = 325 container_of(subreq, struct cifs_io_subrequest, subreq); 326 int rc = subreq->error; 327 328 if (rdata->subreq.source == NETFS_DOWNLOAD_FROM_SERVER) { 329 #ifdef CONFIG_CIFS_SMB_DIRECT 330 if (rdata->mr) { 331 smbd_deregister_mr(rdata->mr); 332 rdata->mr = NULL; 333 } 334 #endif 335 } 336 337 if (rdata->credits.value != 0) { 338 trace_smb3_rw_credits(rdata->rreq->debug_id, 339 rdata->subreq.debug_index, 340 rdata->credits.value, 341 rdata->server ? rdata->server->credits : 0, 342 rdata->server ? rdata->server->in_flight : 0, 343 -rdata->credits.value, 344 cifs_trace_rw_credits_free_subreq); 345 if (rdata->server) 346 add_credits_and_wake_if(rdata->server, &rdata->credits, 0); 347 else 348 rdata->credits.value = 0; 349 } 350 351 if (rdata->have_xid) 352 free_xid(rdata->xid); 353 } 354 355 const struct netfs_request_ops cifs_req_ops = { 356 .request_pool = &cifs_io_request_pool, 357 .subrequest_pool = &cifs_io_subrequest_pool, 358 .init_request = cifs_init_request, 359 .free_request = cifs_free_request, 360 .free_subrequest = cifs_free_subrequest, 361 .prepare_read = cifs_prepare_read, 362 .issue_read = cifs_issue_read, 363 .done = cifs_rreq_done, 364 .begin_writeback = cifs_begin_writeback, 365 .prepare_write = cifs_prepare_write, 366 .issue_write = cifs_issue_write, 367 .invalidate_cache = cifs_netfs_invalidate_cache, 368 }; 369 370 /* 371 * Mark as invalid, all open files on tree connections since they 372 * were closed when session to server was lost. 373 */ 374 void 375 cifs_mark_open_files_invalid(struct cifs_tcon *tcon) 376 { 377 struct cifsFileInfo *open_file = NULL; 378 struct list_head *tmp; 379 struct list_head *tmp1; 380 381 /* only send once per connect */ 382 spin_lock(&tcon->tc_lock); 383 if (tcon->need_reconnect) 384 tcon->status = TID_NEED_RECON; 385 386 if (tcon->status != TID_NEED_RECON) { 387 spin_unlock(&tcon->tc_lock); 388 return; 389 } 390 tcon->status = TID_IN_FILES_INVALIDATE; 391 spin_unlock(&tcon->tc_lock); 392 393 /* list all files open on tree connection and mark them invalid */ 394 spin_lock(&tcon->open_file_lock); 395 list_for_each_safe(tmp, tmp1, &tcon->openFileList) { 396 open_file = list_entry(tmp, struct cifsFileInfo, tlist); 397 open_file->invalidHandle = true; 398 open_file->oplock_break_cancelled = true; 399 } 400 spin_unlock(&tcon->open_file_lock); 401 402 invalidate_all_cached_dirs(tcon, true); 403 spin_lock(&tcon->tc_lock); 404 if (tcon->status == TID_IN_FILES_INVALIDATE) 405 tcon->status = TID_NEED_TCON; 406 spin_unlock(&tcon->tc_lock); 407 408 /* 409 * BB Add call to evict_inodes(sb) for all superblocks mounted 410 * to this tcon. 411 */ 412 } 413 414 static inline int cifs_convert_flags(unsigned int oflags, int rdwr_for_fscache) 415 { 416 int flags = 0; 417 418 if (oflags & O_TMPFILE) 419 flags |= DELETE; 420 421 if ((oflags & O_ACCMODE) == O_RDONLY) 422 return flags | GENERIC_READ; 423 if ((oflags & O_ACCMODE) == O_WRONLY) { 424 return flags | (rdwr_for_fscache == 1 ? 425 (GENERIC_READ | GENERIC_WRITE) : GENERIC_WRITE); 426 } 427 if ((oflags & O_ACCMODE) == O_RDWR) { 428 /* GENERIC_ALL is too much permission to request 429 can cause unnecessary access denied on create */ 430 /* return GENERIC_ALL; */ 431 return flags | GENERIC_READ | GENERIC_WRITE; 432 } 433 434 return flags | READ_CONTROL | FILE_WRITE_ATTRIBUTES | 435 FILE_READ_ATTRIBUTES | FILE_WRITE_EA | FILE_APPEND_DATA | 436 FILE_WRITE_DATA | FILE_READ_DATA; 437 } 438 439 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 440 static u32 cifs_posix_convert_flags(unsigned int flags) 441 { 442 u32 posix_flags = 0; 443 444 if ((flags & O_ACCMODE) == O_RDONLY) 445 posix_flags = SMB_O_RDONLY; 446 else if ((flags & O_ACCMODE) == O_WRONLY) 447 posix_flags = SMB_O_WRONLY; 448 else if ((flags & O_ACCMODE) == O_RDWR) 449 posix_flags = SMB_O_RDWR; 450 451 if (flags & O_CREAT) { 452 posix_flags |= SMB_O_CREAT; 453 if (flags & O_EXCL) 454 posix_flags |= SMB_O_EXCL; 455 } else if (flags & O_EXCL) 456 cifs_dbg(FYI, "Application %s pid %d has incorrectly set O_EXCL flag but not O_CREAT on file open. Ignoring O_EXCL\n", 457 current->comm, current->tgid); 458 459 if (flags & O_TRUNC) 460 posix_flags |= SMB_O_TRUNC; 461 /* be safe and imply O_SYNC for O_DSYNC */ 462 if (flags & O_DSYNC) 463 posix_flags |= SMB_O_SYNC; 464 if (flags & O_DIRECTORY) 465 posix_flags |= SMB_O_DIRECTORY; 466 if (flags & O_NOFOLLOW) 467 posix_flags |= SMB_O_NOFOLLOW; 468 if (flags & O_DIRECT) 469 posix_flags |= SMB_O_DIRECT; 470 471 return posix_flags; 472 } 473 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 474 475 static inline int cifs_get_disposition(unsigned int flags) 476 { 477 if ((flags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL)) 478 return FILE_CREATE; 479 else if ((flags & (O_CREAT | O_TRUNC)) == (O_CREAT | O_TRUNC)) 480 return FILE_OVERWRITE_IF; 481 else if ((flags & O_CREAT) == O_CREAT) 482 return FILE_OPEN_IF; 483 else if ((flags & O_TRUNC) == O_TRUNC) 484 return FILE_OVERWRITE; 485 else 486 return FILE_OPEN; 487 } 488 489 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 490 int cifs_posix_open(const char *full_path, struct inode **pinode, 491 struct super_block *sb, int mode, unsigned int f_flags, 492 __u32 *poplock, __u16 *pnetfid, unsigned int xid) 493 { 494 int rc; 495 FILE_UNIX_BASIC_INFO *presp_data; 496 __u32 posix_flags = 0; 497 struct cifs_sb_info *cifs_sb = CIFS_SB(sb); 498 struct cifs_fattr fattr; 499 struct tcon_link *tlink; 500 struct cifs_tcon *tcon; 501 502 cifs_dbg(FYI, "posix open %s\n", full_path); 503 504 presp_data = kzalloc_obj(FILE_UNIX_BASIC_INFO); 505 if (presp_data == NULL) 506 return -ENOMEM; 507 508 tlink = cifs_sb_tlink(cifs_sb); 509 if (IS_ERR(tlink)) { 510 rc = PTR_ERR(tlink); 511 goto posix_open_ret; 512 } 513 514 tcon = tlink_tcon(tlink); 515 mode &= ~current_umask(); 516 517 posix_flags = cifs_posix_convert_flags(f_flags); 518 rc = CIFSPOSIXCreate(xid, tcon, posix_flags, mode, pnetfid, presp_data, 519 poplock, full_path, cifs_sb->local_nls, 520 cifs_remap(cifs_sb)); 521 cifs_put_tlink(tlink); 522 523 if (rc) 524 goto posix_open_ret; 525 526 if (presp_data->Type == cpu_to_le32(-1)) 527 goto posix_open_ret; /* open ok, caller does qpathinfo */ 528 529 if (!pinode) 530 goto posix_open_ret; /* caller does not need info */ 531 532 cifs_unix_basic_to_fattr(&fattr, presp_data, cifs_sb); 533 534 /* get new inode and set it up */ 535 if (*pinode == NULL) { 536 cifs_fill_uniqueid(sb, &fattr); 537 *pinode = cifs_iget(sb, &fattr); 538 if (!*pinode) { 539 rc = -ENOMEM; 540 goto posix_open_ret; 541 } 542 } else { 543 cifs_revalidate_mapping(*pinode); 544 rc = cifs_fattr_to_inode(*pinode, &fattr, false); 545 } 546 547 posix_open_ret: 548 kfree(presp_data); 549 return rc; 550 } 551 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 552 553 static int cifs_nt_open(const char *full_path, struct inode *inode, struct cifs_sb_info *cifs_sb, 554 struct cifs_tcon *tcon, unsigned int f_flags, __u32 *oplock, 555 struct cifs_fid *fid, unsigned int xid, struct cifs_open_info_data *buf) 556 { 557 int rc; 558 int desired_access; 559 int disposition; 560 int create_options = CREATE_NOT_DIR; 561 struct TCP_Server_Info *server = tcon->ses->server; 562 struct cifs_open_parms oparms; 563 int rdwr_for_fscache = 0; 564 565 if (!server->ops->open) 566 return -ENOSYS; 567 568 /* If we're caching, we need to be able to fill in around partial writes. */ 569 if (cifs_fscache_enabled(inode) && (f_flags & O_ACCMODE) == O_WRONLY) 570 rdwr_for_fscache = 1; 571 572 desired_access = cifs_convert_flags(f_flags, rdwr_for_fscache); 573 574 /********************************************************************* 575 * open flag mapping table: 576 * 577 * POSIX Flag CIFS Disposition 578 * ---------- ---------------- 579 * O_CREAT FILE_OPEN_IF 580 * O_CREAT | O_EXCL FILE_CREATE 581 * O_CREAT | O_TRUNC FILE_OVERWRITE_IF 582 * O_TRUNC FILE_OVERWRITE 583 * none of the above FILE_OPEN 584 * 585 * Note that there is not a direct match between disposition 586 * FILE_SUPERSEDE (ie create whether or not file exists although 587 * O_CREAT | O_TRUNC is similar but truncates the existing 588 * file rather than creating a new file as FILE_SUPERSEDE does 589 * (which uses the attributes / metadata passed in on open call) 590 *? 591 *? O_SYNC is a reasonable match to CIFS writethrough flag 592 *? and the read write flags match reasonably. O_LARGEFILE 593 *? is irrelevant because largefile support is always used 594 *? by this client. Flags O_APPEND, O_DIRECT, O_DIRECTORY, 595 * O_FASYNC, O_NOFOLLOW, O_NONBLOCK need further investigation 596 *********************************************************************/ 597 598 disposition = cifs_get_disposition(f_flags); 599 /* BB pass O_SYNC flag through on file attributes .. BB */ 600 create_options |= cifs_open_create_options(f_flags, create_options); 601 602 retry_open: 603 oparms = (struct cifs_open_parms) { 604 .tcon = tcon, 605 .cifs_sb = cifs_sb, 606 .desired_access = desired_access, 607 .create_options = cifs_create_options(cifs_sb, create_options), 608 .disposition = disposition, 609 .path = full_path, 610 .fid = fid, 611 }; 612 613 rc = server->ops->open(xid, &oparms, oplock, buf); 614 if (rc) { 615 if (rc == -EACCES && rdwr_for_fscache == 1) { 616 desired_access = cifs_convert_flags(f_flags, 0); 617 rdwr_for_fscache = 2; 618 goto retry_open; 619 } 620 return rc; 621 } 622 if (rdwr_for_fscache == 2) 623 cifs_invalidate_cache(inode, FSCACHE_INVAL_DIO_WRITE); 624 625 /* TODO: Add support for calling posix query info but with passing in fid */ 626 if (tcon->unix_ext) 627 rc = cifs_get_inode_info_unix(&inode, full_path, inode->i_sb, 628 xid); 629 else 630 rc = cifs_get_inode_info(&inode, full_path, buf, inode->i_sb, 631 xid, fid); 632 633 if (rc) { 634 server->ops->close(xid, tcon, fid); 635 if (rc == -ESTALE) 636 rc = -EOPENSTALE; 637 } 638 639 return rc; 640 } 641 642 static bool 643 cifs_has_mand_locks(struct cifsInodeInfo *cinode) 644 { 645 struct cifs_fid_locks *cur; 646 bool has_locks = false; 647 648 down_read(&cinode->lock_sem); 649 list_for_each_entry(cur, &cinode->llist, llist) { 650 if (!list_empty(&cur->locks)) { 651 has_locks = true; 652 break; 653 } 654 } 655 up_read(&cinode->lock_sem); 656 return has_locks; 657 } 658 659 void 660 cifs_down_write(struct rw_semaphore *sem) 661 { 662 while (!down_write_trylock(sem)) 663 msleep(10); 664 } 665 666 static void cifsFileInfo_put_work(struct work_struct *work); 667 void serverclose_work(struct work_struct *work); 668 669 struct cifsFileInfo *cifs_new_fileinfo(struct cifs_fid *fid, struct file *file, 670 struct tcon_link *tlink, __u32 oplock, 671 const char *symlink_target) 672 { 673 struct dentry *dentry = file_dentry(file); 674 struct inode *inode = d_inode(dentry); 675 struct cifsInodeInfo *cinode = CIFS_I(inode); 676 struct cifsFileInfo *cfile; 677 struct cifs_fid_locks *fdlocks; 678 struct cifs_tcon *tcon = tlink_tcon(tlink); 679 struct TCP_Server_Info *server = tcon->ses->server; 680 681 cfile = kzalloc_obj(struct cifsFileInfo); 682 if (cfile == NULL) 683 return cfile; 684 685 fdlocks = kzalloc_obj(struct cifs_fid_locks); 686 if (!fdlocks) { 687 kfree(cfile); 688 return NULL; 689 } 690 691 if (symlink_target) { 692 cfile->symlink_target = kstrdup(symlink_target, GFP_KERNEL); 693 if (!cfile->symlink_target) { 694 kfree(fdlocks); 695 kfree(cfile); 696 return NULL; 697 } 698 } 699 700 INIT_LIST_HEAD(&fdlocks->locks); 701 fdlocks->cfile = cfile; 702 cfile->llist = fdlocks; 703 704 cfile->count = 1; 705 cfile->pid = current->tgid; 706 cfile->uid = current_fsuid(); 707 cfile->dentry = dget(dentry); 708 cfile->f_flags = file->f_flags; 709 cfile->invalidHandle = false; 710 cfile->deferred_close_scheduled = false; 711 cfile->status_file_deleted = file->f_flags & O_TMPFILE; 712 cfile->tlink = cifs_get_tlink(tlink); 713 INIT_WORK(&cfile->oplock_break, cifs_oplock_break); 714 INIT_WORK(&cfile->put, cifsFileInfo_put_work); 715 INIT_WORK(&cfile->serverclose, serverclose_work); 716 INIT_DELAYED_WORK(&cfile->deferred, smb2_deferred_work_close); 717 mutex_init(&cfile->fh_mutex); 718 spin_lock_init(&cfile->file_info_lock); 719 720 /* 721 * If the server returned a read oplock and we have mandatory brlocks, 722 * set oplock level to None. 723 */ 724 if (server->ops->is_read_op(oplock) && cifs_has_mand_locks(cinode)) { 725 cifs_dbg(FYI, "Reset oplock val from read to None due to mand locks\n"); 726 oplock = 0; 727 } 728 729 cifs_down_write(&cinode->lock_sem); 730 list_add(&fdlocks->llist, &cinode->llist); 731 up_write(&cinode->lock_sem); 732 733 spin_lock(&tcon->open_file_lock); 734 if (fid->pending_open->oplock != CIFS_OPLOCK_NO_CHANGE && oplock) 735 oplock = fid->pending_open->oplock; 736 list_del(&fid->pending_open->olist); 737 738 list_add(&cfile->tlist, &tcon->openFileList); 739 atomic_inc(&tcon->num_local_opens); 740 741 /* if readable file instance put first in list*/ 742 spin_lock(&cinode->open_file_lock); 743 if (file->f_flags & O_TMPFILE) 744 set_bit(CIFS_INO_TMPFILE, &cinode->flags); 745 fid->purge_cache = false; 746 server->ops->set_fid(cfile, fid, oplock); 747 748 if (file->f_mode & FMODE_READ) 749 list_add(&cfile->flist, &cinode->openFileList); 750 else 751 list_add_tail(&cfile->flist, &cinode->openFileList); 752 spin_unlock(&cinode->open_file_lock); 753 spin_unlock(&tcon->open_file_lock); 754 755 if (fid->purge_cache) 756 cifs_zap_mapping(inode); 757 758 file->private_data = cfile; 759 return cfile; 760 } 761 762 struct cifsFileInfo * 763 cifsFileInfo_get(struct cifsFileInfo *cifs_file) 764 { 765 spin_lock(&cifs_file->file_info_lock); 766 cifsFileInfo_get_locked(cifs_file); 767 spin_unlock(&cifs_file->file_info_lock); 768 return cifs_file; 769 } 770 771 static void cifsFileInfo_put_final(struct cifsFileInfo *cifs_file) 772 { 773 struct inode *inode = d_inode(cifs_file->dentry); 774 struct cifsInodeInfo *cifsi = CIFS_I(inode); 775 struct cifsLockInfo *li, *tmp; 776 777 /* 778 * Delete any outstanding lock records. We'll lose them when the file 779 * is closed anyway. 780 */ 781 cifs_down_write(&cifsi->lock_sem); 782 list_for_each_entry_safe(li, tmp, &cifs_file->llist->locks, llist) { 783 list_del(&li->llist); 784 cifs_del_lock_waiters(li); 785 kfree(li); 786 } 787 list_del(&cifs_file->llist->llist); 788 kfree(cifs_file->llist); 789 up_write(&cifsi->lock_sem); 790 791 cifs_put_tlink(cifs_file->tlink); 792 dput(cifs_file->dentry); 793 kfree(cifs_file->symlink_target); 794 kfree(cifs_file); 795 } 796 797 static void cifsFileInfo_put_work(struct work_struct *work) 798 { 799 struct cifsFileInfo *cifs_file = container_of(work, 800 struct cifsFileInfo, put); 801 802 cifsFileInfo_put_final(cifs_file); 803 } 804 805 void serverclose_work(struct work_struct *work) 806 { 807 struct cifsFileInfo *cifs_file = container_of(work, 808 struct cifsFileInfo, serverclose); 809 810 struct cifs_tcon *tcon = tlink_tcon(cifs_file->tlink); 811 812 struct TCP_Server_Info *server = tcon->ses->server; 813 int rc = 0; 814 int retries = 0; 815 int MAX_RETRIES = 4; 816 817 do { 818 if (server->ops->close_getattr) 819 rc = server->ops->close_getattr(0, tcon, cifs_file); 820 else if (server->ops->close) 821 rc = server->ops->close(0, tcon, &cifs_file->fid); 822 823 if (rc == -EBUSY || rc == -EAGAIN) { 824 retries++; 825 msleep(250); 826 } 827 } while ((rc == -EBUSY || rc == -EAGAIN) && (retries < MAX_RETRIES) 828 ); 829 830 if (retries == MAX_RETRIES) 831 pr_warn("Serverclose failed %d times, giving up\n", MAX_RETRIES); 832 833 if (cifs_file->offload) 834 queue_work(fileinfo_put_wq, &cifs_file->put); 835 else 836 cifsFileInfo_put_final(cifs_file); 837 } 838 839 /** 840 * cifsFileInfo_put - release a reference of file priv data 841 * 842 * Always potentially wait for oplock handler. See _cifsFileInfo_put(). 843 * 844 * @cifs_file: cifs/smb3 specific info (eg refcounts) for an open file 845 */ 846 void cifsFileInfo_put(struct cifsFileInfo *cifs_file) 847 { 848 _cifsFileInfo_put(cifs_file, true, true); 849 } 850 851 /** 852 * _cifsFileInfo_put - release a reference of file priv data 853 * 854 * This may involve closing the filehandle @cifs_file out on the 855 * server. Must be called without holding tcon->open_file_lock, 856 * cinode->open_file_lock and cifs_file->file_info_lock. 857 * 858 * If @wait_for_oplock_handler is true and we are releasing the last 859 * reference, wait for any running oplock break handler of the file 860 * and cancel any pending one. 861 * 862 * @cifs_file: cifs/smb3 specific info (eg refcounts) for an open file 863 * @wait_oplock_handler: must be false if called from oplock_break_handler 864 * @offload: not offloaded on close and oplock breaks 865 * 866 */ 867 void _cifsFileInfo_put(struct cifsFileInfo *cifs_file, 868 bool wait_oplock_handler, bool offload) 869 { 870 struct inode *inode = d_inode(cifs_file->dentry); 871 struct cifs_tcon *tcon = tlink_tcon(cifs_file->tlink); 872 struct TCP_Server_Info *server = tcon->ses->server; 873 struct cifsInodeInfo *cifsi = CIFS_I(inode); 874 struct super_block *sb = inode->i_sb; 875 struct cifs_sb_info *cifs_sb = CIFS_SB(sb); 876 struct cifs_fid fid = {}; 877 struct cifs_pending_open open; 878 bool oplock_break_cancelled; 879 bool serverclose_offloaded = false; 880 881 spin_lock(&tcon->open_file_lock); 882 spin_lock(&cifsi->open_file_lock); 883 spin_lock(&cifs_file->file_info_lock); 884 885 cifs_file->offload = offload; 886 if (--cifs_file->count > 0) { 887 spin_unlock(&cifs_file->file_info_lock); 888 spin_unlock(&cifsi->open_file_lock); 889 spin_unlock(&tcon->open_file_lock); 890 return; 891 } 892 spin_unlock(&cifs_file->file_info_lock); 893 894 if (server->ops->get_lease_key) 895 server->ops->get_lease_key(inode, &fid); 896 897 /* store open in pending opens to make sure we don't miss lease break */ 898 cifs_add_pending_open_locked(&fid, cifs_file->tlink, &open); 899 900 /* remove it from the lists */ 901 list_del(&cifs_file->flist); 902 list_del(&cifs_file->tlist); 903 atomic_dec(&tcon->num_local_opens); 904 905 if (list_empty(&cifsi->openFileList)) { 906 cifs_dbg(FYI, "closing last open instance for inode %p\n", 907 d_inode(cifs_file->dentry)); 908 /* 909 * In strict cache mode we need invalidate mapping on the last 910 * close because it may cause a error when we open this file 911 * again and get at least level II oplock. 912 */ 913 if (cifs_sb_flags(cifs_sb) & CIFS_MOUNT_STRICT_IO) 914 set_bit(CIFS_INO_INVALID_MAPPING, &cifsi->flags); 915 cifs_set_oplock_level(cifsi, 0); 916 } 917 918 spin_unlock(&cifsi->open_file_lock); 919 spin_unlock(&tcon->open_file_lock); 920 921 oplock_break_cancelled = wait_oplock_handler ? 922 cancel_work_sync(&cifs_file->oplock_break) : false; 923 924 if (!tcon->need_reconnect && !cifs_file->invalidHandle) { 925 struct TCP_Server_Info *server = tcon->ses->server; 926 unsigned int xid; 927 int rc = 0; 928 929 xid = get_xid(); 930 if (server->ops->close_getattr) 931 rc = server->ops->close_getattr(xid, tcon, cifs_file); 932 else if (server->ops->close) 933 rc = server->ops->close(xid, tcon, &cifs_file->fid); 934 _free_xid(xid); 935 936 if (rc == -EBUSY || rc == -EAGAIN) { 937 // Server close failed, hence offloading it as an async op 938 queue_work(serverclose_wq, &cifs_file->serverclose); 939 serverclose_offloaded = true; 940 } 941 } 942 943 if (oplock_break_cancelled) 944 cifs_done_oplock_break(cifsi); 945 946 cifs_del_pending_open(&open); 947 948 // if serverclose has been offloaded to wq (on failure), it will 949 // handle offloading put as well. If serverclose not offloaded, 950 // we need to handle offloading put here. 951 if (!serverclose_offloaded) { 952 if (offload) 953 queue_work(fileinfo_put_wq, &cifs_file->put); 954 else 955 cifsFileInfo_put_final(cifs_file); 956 } 957 } 958 959 int cifs_file_flush(const unsigned int xid, struct inode *inode, 960 struct cifsFileInfo *cfile) 961 { 962 struct cifs_sb_info *cifs_sb = CIFS_SB(inode); 963 struct cifs_tcon *tcon; 964 int rc; 965 966 if (cifs_sb_flags(cifs_sb) & CIFS_MOUNT_NOSSYNC) 967 return 0; 968 969 if (cfile && (OPEN_FMODE(cfile->f_flags) & FMODE_WRITE)) { 970 tcon = tlink_tcon(cfile->tlink); 971 return tcon->ses->server->ops->flush(xid, tcon, 972 &cfile->fid); 973 } 974 rc = cifs_get_writable_file(CIFS_I(inode), FIND_ANY, &cfile); 975 if (!rc) { 976 tcon = tlink_tcon(cfile->tlink); 977 rc = tcon->ses->server->ops->flush(xid, tcon, &cfile->fid); 978 cifsFileInfo_put(cfile); 979 } else if (rc == -EBADF) { 980 rc = 0; 981 } 982 return rc; 983 } 984 985 static int cifs_do_truncate(const unsigned int xid, struct dentry *dentry) 986 { 987 struct cifsInodeInfo *cinode = CIFS_I(d_inode(dentry)); 988 struct inode *inode = d_inode(dentry); 989 struct cifsFileInfo *cfile = NULL; 990 struct TCP_Server_Info *server; 991 struct cifs_tcon *tcon; 992 int rc; 993 994 rc = filemap_write_and_wait(inode->i_mapping); 995 if (is_interrupt_error(rc)) 996 return -ERESTARTSYS; 997 mapping_set_error(inode->i_mapping, rc); 998 999 cfile = find_writable_file(cinode, FIND_FSUID_ONLY); 1000 rc = cifs_file_flush(xid, inode, cfile); 1001 if (!rc) { 1002 if (cfile) { 1003 tcon = tlink_tcon(cfile->tlink); 1004 server = tcon->ses->server; 1005 rc = server->ops->set_file_size(xid, tcon, 1006 cfile, 0, false); 1007 } 1008 if (!rc) { 1009 netfs_resize_file(&cinode->netfs, 0, true); 1010 cifs_setsize(inode, 0); 1011 } 1012 } 1013 if (cfile) 1014 cifsFileInfo_put(cfile); 1015 return rc; 1016 } 1017 1018 int cifs_open(struct inode *inode, struct file *file) 1019 1020 { 1021 struct cifs_sb_info *cifs_sb = CIFS_SB(inode); 1022 struct cifs_open_info_data data = {}; 1023 struct cifsFileInfo *cfile = NULL; 1024 struct TCP_Server_Info *server; 1025 struct cifs_pending_open open; 1026 bool posix_open_ok = false; 1027 struct cifs_fid fid = {}; 1028 struct tcon_link *tlink; 1029 struct cifs_tcon *tcon; 1030 const char *full_path; 1031 unsigned int sbflags; 1032 int rc = -EACCES; 1033 unsigned int xid; 1034 __u32 oplock; 1035 void *page; 1036 1037 xid = get_xid(); 1038 1039 if (unlikely(cifs_forced_shutdown(cifs_sb))) { 1040 free_xid(xid); 1041 return smb_EIO(smb_eio_trace_forced_shutdown); 1042 } 1043 1044 tlink = cifs_sb_tlink(cifs_sb); 1045 if (IS_ERR(tlink)) { 1046 free_xid(xid); 1047 return PTR_ERR(tlink); 1048 } 1049 tcon = tlink_tcon(tlink); 1050 server = tcon->ses->server; 1051 1052 page = alloc_dentry_path(); 1053 full_path = build_path_from_dentry(file_dentry(file), page); 1054 if (IS_ERR(full_path)) { 1055 rc = PTR_ERR(full_path); 1056 goto out; 1057 } 1058 1059 cifs_dbg(FYI, "inode = 0x%p file flags are 0x%x for %s\n", 1060 inode, file->f_flags, full_path); 1061 1062 sbflags = cifs_sb_flags(cifs_sb); 1063 if ((file->f_flags & O_DIRECT) && (sbflags & CIFS_MOUNT_STRICT_IO)) { 1064 if (sbflags & CIFS_MOUNT_NO_BRL) 1065 file->f_op = &cifs_file_direct_nobrl_ops; 1066 else 1067 file->f_op = &cifs_file_direct_ops; 1068 } 1069 1070 if (file->f_flags & O_TRUNC) { 1071 rc = cifs_do_truncate(xid, file_dentry(file)); 1072 if (rc) 1073 goto out; 1074 } 1075 1076 /* Get the cached handle as SMB2 close is deferred */ 1077 if (OPEN_FMODE(file->f_flags) & FMODE_WRITE) { 1078 rc = __cifs_get_writable_file(CIFS_I(inode), 1079 FIND_FSUID_ONLY | 1080 FIND_NO_PENDING_DELETE | 1081 FIND_OPEN_FLAGS, 1082 file->f_flags, &cfile); 1083 } else { 1084 cfile = __find_readable_file(CIFS_I(inode), 1085 FIND_NO_PENDING_DELETE | 1086 FIND_OPEN_FLAGS, 1087 file->f_flags); 1088 rc = cfile ? 0 : -ENOENT; 1089 } 1090 if (rc == 0) { 1091 trace_smb3_open_cached(xid, tcon->tid, tcon->ses->Suid, 1092 cfile->fid.persistent_fid, 1093 file->f_flags, cfile->f_flags); 1094 file->private_data = cfile; 1095 spin_lock(&CIFS_I(inode)->deferred_lock); 1096 cifs_del_deferred_close(cfile); 1097 spin_unlock(&CIFS_I(inode)->deferred_lock); 1098 goto use_cache; 1099 } 1100 /* hard link on the deferred close file */ 1101 rc = cifs_get_hardlink_path(tcon, inode, file); 1102 if (rc) 1103 cifs_close_deferred_file(CIFS_I(inode)); 1104 1105 if (server->oplocks) 1106 oplock = REQ_OPLOCK; 1107 else 1108 oplock = 0; 1109 1110 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 1111 if (!tcon->broken_posix_open && tcon->unix_ext && 1112 cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP & 1113 le64_to_cpu(tcon->fsUnixInfo.Capability))) { 1114 /* can not refresh inode info since size could be stale */ 1115 rc = cifs_posix_open(full_path, &inode, inode->i_sb, 1116 cifs_sb->ctx->file_mode /* ignored */, 1117 file->f_flags, &oplock, &fid.netfid, xid); 1118 if (rc == 0) { 1119 cifs_dbg(FYI, "posix open succeeded\n"); 1120 posix_open_ok = true; 1121 } else if ((rc == -EINVAL) || (rc == -EOPNOTSUPP)) { 1122 if (tcon->ses->serverNOS) 1123 cifs_dbg(VFS, "server %s of type %s returned unexpected error on SMB posix open, disabling posix open support. Check if server update available.\n", 1124 tcon->ses->ip_addr, 1125 tcon->ses->serverNOS); 1126 tcon->broken_posix_open = true; 1127 } else if ((rc != -EIO) && (rc != -EREMOTE) && 1128 (rc != -EOPNOTSUPP)) /* path not found or net err */ 1129 goto out; 1130 /* 1131 * Else fallthrough to retry open the old way on network i/o 1132 * or DFS errors. 1133 */ 1134 } 1135 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 1136 1137 if (server->ops->get_lease_key) 1138 server->ops->get_lease_key(inode, &fid); 1139 1140 cifs_add_pending_open(&fid, tlink, &open); 1141 1142 if (!posix_open_ok) { 1143 if (server->ops->get_lease_key) 1144 server->ops->get_lease_key(inode, &fid); 1145 1146 rc = cifs_nt_open(full_path, inode, cifs_sb, tcon, file->f_flags, &oplock, &fid, 1147 xid, &data); 1148 if (rc) { 1149 cifs_del_pending_open(&open); 1150 goto out; 1151 } 1152 } 1153 1154 cfile = cifs_new_fileinfo(&fid, file, tlink, oplock, data.symlink_target); 1155 if (cfile == NULL) { 1156 if (server->ops->close) 1157 server->ops->close(xid, tcon, &fid); 1158 cifs_del_pending_open(&open); 1159 rc = -ENOMEM; 1160 goto out; 1161 } 1162 1163 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 1164 if ((oplock & CIFS_CREATE_ACTION) && !posix_open_ok && tcon->unix_ext) { 1165 /* 1166 * Time to set mode which we can not set earlier due to 1167 * problems creating new read-only files. 1168 */ 1169 struct cifs_unix_set_info_args args = { 1170 .mode = inode->i_mode, 1171 .uid = INVALID_UID, /* no change */ 1172 .gid = INVALID_GID, /* no change */ 1173 .ctime = NO_CHANGE_64, 1174 .atime = NO_CHANGE_64, 1175 .mtime = NO_CHANGE_64, 1176 .device = 0, 1177 }; 1178 CIFSSMBUnixSetFileInfo(xid, tcon, &args, fid.netfid, 1179 cfile->pid); 1180 } 1181 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 1182 1183 use_cache: 1184 fscache_use_cookie(cifs_inode_cookie(file_inode(file)), 1185 file->f_mode & FMODE_WRITE); 1186 if (!(file->f_flags & O_DIRECT)) 1187 goto out; 1188 if ((file->f_flags & (O_ACCMODE | O_APPEND)) == O_RDONLY) 1189 goto out; 1190 cifs_invalidate_cache(file_inode(file), FSCACHE_INVAL_DIO_WRITE); 1191 1192 out: 1193 free_dentry_path(page); 1194 free_xid(xid); 1195 cifs_put_tlink(tlink); 1196 cifs_free_open_info(&data); 1197 return rc; 1198 } 1199 1200 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 1201 static int cifs_push_posix_locks(struct cifsFileInfo *cfile); 1202 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 1203 1204 /* 1205 * Try to reacquire byte range locks that were released when session 1206 * to server was lost. 1207 */ 1208 static int 1209 cifs_relock_file(struct cifsFileInfo *cfile) 1210 { 1211 struct cifsInodeInfo *cinode = CIFS_I(d_inode(cfile->dentry)); 1212 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink); 1213 int rc = 0; 1214 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 1215 struct cifs_sb_info *cifs_sb = CIFS_SB(cinode); 1216 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 1217 1218 down_read_nested(&cinode->lock_sem, SINGLE_DEPTH_NESTING); 1219 if (cinode->can_cache_brlcks) { 1220 /* can cache locks - no need to relock */ 1221 up_read(&cinode->lock_sem); 1222 return rc; 1223 } 1224 1225 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 1226 if (cap_unix(tcon->ses) && 1227 (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) && 1228 ((cifs_sb_flags(cifs_sb) & CIFS_MOUNT_NOPOSIXBRL) == 0)) 1229 rc = cifs_push_posix_locks(cfile); 1230 else 1231 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 1232 rc = tcon->ses->server->ops->push_mand_locks(cfile); 1233 1234 up_read(&cinode->lock_sem); 1235 return rc; 1236 } 1237 1238 static int 1239 cifs_reopen_file(struct cifsFileInfo *cfile, bool can_flush) 1240 { 1241 int rc = -EACCES; 1242 unsigned int xid; 1243 __u32 oplock; 1244 struct cifs_sb_info *cifs_sb; 1245 struct cifs_tcon *tcon; 1246 struct TCP_Server_Info *server; 1247 struct cifsInodeInfo *cinode; 1248 struct inode *inode; 1249 void *page; 1250 const char *full_path; 1251 int desired_access; 1252 int disposition = FILE_OPEN; 1253 int create_options = CREATE_NOT_DIR; 1254 struct cifs_open_parms oparms; 1255 int rdwr_for_fscache = 0; 1256 1257 xid = get_xid(); 1258 mutex_lock(&cfile->fh_mutex); 1259 if (!cfile->invalidHandle) { 1260 mutex_unlock(&cfile->fh_mutex); 1261 free_xid(xid); 1262 return 0; 1263 } 1264 1265 inode = d_inode(cfile->dentry); 1266 cifs_sb = CIFS_SB(inode->i_sb); 1267 tcon = tlink_tcon(cfile->tlink); 1268 server = tcon->ses->server; 1269 1270 /* 1271 * Can not grab rename sem here because various ops, including those 1272 * that already have the rename sem can end up causing writepage to get 1273 * called and if the server was down that means we end up here, and we 1274 * can never tell if the caller already has the rename_sem. 1275 */ 1276 page = alloc_dentry_path(); 1277 full_path = build_path_from_dentry(cfile->dentry, page); 1278 if (IS_ERR(full_path)) { 1279 mutex_unlock(&cfile->fh_mutex); 1280 free_dentry_path(page); 1281 free_xid(xid); 1282 return PTR_ERR(full_path); 1283 } 1284 1285 cifs_dbg(FYI, "inode = 0x%p file flags 0x%x for %s\n", 1286 inode, cfile->f_flags, full_path); 1287 1288 if (tcon->ses->server->oplocks) 1289 oplock = REQ_OPLOCK; 1290 else 1291 oplock = 0; 1292 1293 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 1294 if (tcon->unix_ext && cap_unix(tcon->ses) && 1295 (CIFS_UNIX_POSIX_PATH_OPS_CAP & 1296 le64_to_cpu(tcon->fsUnixInfo.Capability))) { 1297 /* 1298 * O_CREAT, O_EXCL and O_TRUNC already had their effect on the 1299 * original open. Must mask them off for a reopen. 1300 */ 1301 unsigned int oflags = cfile->f_flags & 1302 ~(O_CREAT | O_EXCL | O_TRUNC); 1303 1304 rc = cifs_posix_open(full_path, NULL, inode->i_sb, 1305 cifs_sb->ctx->file_mode /* ignored */, 1306 oflags, &oplock, &cfile->fid.netfid, xid); 1307 if (rc == 0) { 1308 cifs_dbg(FYI, "posix reopen succeeded\n"); 1309 oparms.reconnect = true; 1310 goto reopen_success; 1311 } 1312 /* 1313 * fallthrough to retry open the old way on errors, especially 1314 * in the reconnect path it is important to retry hard 1315 */ 1316 } 1317 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 1318 1319 /* If we're caching, we need to be able to fill in around partial writes. */ 1320 if (cifs_fscache_enabled(inode) && (cfile->f_flags & O_ACCMODE) == O_WRONLY) 1321 rdwr_for_fscache = 1; 1322 1323 desired_access = cifs_convert_flags(cfile->f_flags, rdwr_for_fscache); 1324 create_options |= cifs_open_create_options(cfile->f_flags, 1325 create_options); 1326 1327 if (server->ops->get_lease_key) 1328 server->ops->get_lease_key(inode, &cfile->fid); 1329 1330 retry_open: 1331 oparms = (struct cifs_open_parms) { 1332 .tcon = tcon, 1333 .cifs_sb = cifs_sb, 1334 .desired_access = desired_access, 1335 .create_options = cifs_create_options(cifs_sb, create_options), 1336 .disposition = disposition, 1337 .path = full_path, 1338 .fid = &cfile->fid, 1339 .reconnect = true, 1340 }; 1341 1342 /* 1343 * Can not refresh inode by passing in file_info buf to be returned by 1344 * ops->open and then calling get_inode_info with returned buf since 1345 * file might have write behind data that needs to be flushed and server 1346 * version of file size can be stale. If we knew for sure that inode was 1347 * not dirty locally we could do this. 1348 */ 1349 rc = server->ops->open(xid, &oparms, &oplock, NULL); 1350 if (rc == -ENOENT && oparms.reconnect == false) { 1351 /* durable handle timeout is expired - open the file again */ 1352 rc = server->ops->open(xid, &oparms, &oplock, NULL); 1353 /* indicate that we need to relock the file */ 1354 oparms.reconnect = true; 1355 } 1356 if (rc == -EACCES && rdwr_for_fscache == 1) { 1357 desired_access = cifs_convert_flags(cfile->f_flags, 0); 1358 rdwr_for_fscache = 2; 1359 goto retry_open; 1360 } 1361 1362 if (rc) { 1363 mutex_unlock(&cfile->fh_mutex); 1364 cifs_dbg(FYI, "cifs_reopen returned 0x%x\n", rc); 1365 cifs_dbg(FYI, "oplock: %d\n", oplock); 1366 goto reopen_error_exit; 1367 } 1368 1369 if (rdwr_for_fscache == 2) 1370 cifs_invalidate_cache(inode, FSCACHE_INVAL_DIO_WRITE); 1371 1372 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 1373 reopen_success: 1374 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 1375 cfile->invalidHandle = false; 1376 mutex_unlock(&cfile->fh_mutex); 1377 cinode = CIFS_I(inode); 1378 1379 if (can_flush) { 1380 rc = filemap_write_and_wait(inode->i_mapping); 1381 if (!is_interrupt_error(rc)) 1382 mapping_set_error(inode->i_mapping, rc); 1383 1384 if (tcon->posix_extensions) { 1385 rc = smb311_posix_get_inode_info(&inode, full_path, 1386 NULL, inode->i_sb, xid); 1387 } else if (tcon->unix_ext) { 1388 rc = cifs_get_inode_info_unix(&inode, full_path, 1389 inode->i_sb, xid); 1390 } else { 1391 rc = cifs_get_inode_info(&inode, full_path, NULL, 1392 inode->i_sb, xid, NULL); 1393 } 1394 } 1395 /* 1396 * Else we are writing out data to server already and could deadlock if 1397 * we tried to flush data, and since we do not know if we have data that 1398 * would invalidate the current end of file on the server we can not go 1399 * to the server to get the new inode info. 1400 */ 1401 1402 /* 1403 * If the server returned a read oplock and we have mandatory brlocks, 1404 * set oplock level to None. 1405 */ 1406 if (server->ops->is_read_op(oplock) && cifs_has_mand_locks(cinode)) { 1407 cifs_dbg(FYI, "Reset oplock val from read to None due to mand locks\n"); 1408 oplock = 0; 1409 } 1410 1411 scoped_guard(spinlock, &cinode->open_file_lock) 1412 server->ops->set_fid(cfile, &cfile->fid, oplock); 1413 if (oparms.reconnect) 1414 cifs_relock_file(cfile); 1415 1416 reopen_error_exit: 1417 free_dentry_path(page); 1418 free_xid(xid); 1419 return rc; 1420 } 1421 1422 void smb2_deferred_work_close(struct work_struct *work) 1423 { 1424 struct cifsFileInfo *cfile = container_of(work, 1425 struct cifsFileInfo, deferred.work); 1426 struct cifsInodeInfo *cinode = CIFS_I(d_inode(cfile->dentry)); 1427 1428 spin_lock(&cinode->deferred_lock); 1429 cifs_del_deferred_close(cfile); 1430 cfile->deferred_close_scheduled = false; 1431 spin_unlock(&cinode->deferred_lock); 1432 /* 1433 * Refresh time_last_write immediately before the actual server close 1434 * so the protection window is anchored to the real close time, not 1435 * the earlier userspace close time stored by cifs_close(). 1436 */ 1437 if (OPEN_FMODE(cfile->f_flags) & FMODE_WRITE) { 1438 /* Pairs with smp_load_acquire() in is_size_safe_to_change(). */ 1439 smp_store_release(&cinode->time_last_write, jiffies); 1440 } 1441 _cifsFileInfo_put(cfile, true, false); 1442 } 1443 1444 static bool 1445 smb2_can_defer_close(struct inode *inode, struct cifs_deferred_close *dclose) 1446 { 1447 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); 1448 struct cifsInodeInfo *cinode = CIFS_I(inode); 1449 unsigned int oplock = READ_ONCE(cinode->oplock); 1450 1451 return cifs_sb->ctx->closetimeo && cinode->lease_granted && dclose && 1452 (oplock == CIFS_CACHE_RHW_FLG || oplock == CIFS_CACHE_RH_FLG) && 1453 !test_bit(CIFS_INO_CLOSE_ON_LOCK, &cinode->flags); 1454 1455 } 1456 1457 int cifs_close(struct inode *inode, struct file *file) 1458 { 1459 struct cifsFileInfo *cfile; 1460 struct cifsInodeInfo *cinode = CIFS_I(inode); 1461 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); 1462 struct cifs_deferred_close *dclose; 1463 struct cifs_tcon *tcon; 1464 1465 cifs_fscache_unuse_inode_cookie(inode, file->f_mode & FMODE_WRITE); 1466 1467 if (file->private_data != NULL) { 1468 cfile = file->private_data; 1469 file->private_data = NULL; 1470 if (file->f_mode & FMODE_WRITE) { 1471 /* Pairs with smp_load_acquire() in is_size_safe_to_change(). */ 1472 smp_store_release(&cinode->time_last_write, jiffies); 1473 } 1474 dclose = kmalloc_obj(struct cifs_deferred_close); 1475 if ((cfile->status_file_deleted == false) && 1476 (smb2_can_defer_close(inode, dclose))) { 1477 if (test_and_clear_bit(NETFS_ICTX_MODIFIED_ATTR, &cinode->netfs.flags)) { 1478 inode_set_mtime_to_ts(inode, 1479 inode_set_ctime_current(inode)); 1480 } 1481 spin_lock(&cinode->deferred_lock); 1482 cifs_add_deferred_close(cfile, dclose); 1483 if (cfile->deferred_close_scheduled && 1484 delayed_work_pending(&cfile->deferred)) { 1485 /* 1486 * If there is no pending work, mod_delayed_work queues new work. 1487 * So, Increase the ref count to avoid use-after-free. 1488 */ 1489 if (!mod_delayed_work(deferredclose_wq, 1490 &cfile->deferred, cifs_sb->ctx->closetimeo)) 1491 cifsFileInfo_get(cfile); 1492 } else { 1493 /* Deferred close for files */ 1494 tcon = tlink_tcon(cfile->tlink); 1495 trace_smb3_close_cached(tcon->tid, tcon->ses->Suid, 1496 cfile->fid.persistent_fid, 1497 cifs_sb->ctx->closetimeo); 1498 queue_delayed_work(deferredclose_wq, 1499 &cfile->deferred, cifs_sb->ctx->closetimeo); 1500 cfile->deferred_close_scheduled = true; 1501 spin_unlock(&cinode->deferred_lock); 1502 return 0; 1503 } 1504 spin_unlock(&cinode->deferred_lock); 1505 _cifsFileInfo_put(cfile, true, false); 1506 } else { 1507 _cifsFileInfo_put(cfile, true, false); 1508 kfree(dclose); 1509 } 1510 } 1511 1512 /* return code from the ->release op is always ignored */ 1513 return 0; 1514 } 1515 1516 void 1517 cifs_reopen_persistent_handles(struct cifs_tcon *tcon) 1518 { 1519 struct cifsFileInfo *open_file, *tmp; 1520 LIST_HEAD(tmp_list); 1521 1522 if (!tcon->use_persistent || !tcon->need_reopen_files) 1523 return; 1524 1525 tcon->need_reopen_files = false; 1526 1527 cifs_dbg(FYI, "Reopen persistent handles\n"); 1528 1529 /* list all files open on tree connection, reopen resilient handles */ 1530 spin_lock(&tcon->open_file_lock); 1531 list_for_each_entry(open_file, &tcon->openFileList, tlist) { 1532 if (!open_file->invalidHandle) 1533 continue; 1534 cifsFileInfo_get(open_file); 1535 list_add_tail(&open_file->rlist, &tmp_list); 1536 } 1537 spin_unlock(&tcon->open_file_lock); 1538 1539 list_for_each_entry_safe(open_file, tmp, &tmp_list, rlist) { 1540 if (cifs_reopen_file(open_file, false /* do not flush */)) 1541 tcon->need_reopen_files = true; 1542 list_del_init(&open_file->rlist); 1543 cifsFileInfo_put(open_file); 1544 } 1545 } 1546 1547 int cifs_closedir(struct inode *inode, struct file *file) 1548 { 1549 int rc = 0; 1550 unsigned int xid; 1551 struct cifsFileInfo *cfile = file->private_data; 1552 struct cifs_tcon *tcon; 1553 struct TCP_Server_Info *server; 1554 char *buf; 1555 1556 cifs_dbg(FYI, "Closedir inode = 0x%p\n", inode); 1557 1558 if (cfile == NULL) 1559 return rc; 1560 1561 xid = get_xid(); 1562 tcon = tlink_tcon(cfile->tlink); 1563 server = tcon->ses->server; 1564 1565 cifs_dbg(FYI, "Freeing private data in close dir\n"); 1566 spin_lock(&cfile->file_info_lock); 1567 if (server->ops->dir_needs_close(cfile)) { 1568 cfile->invalidHandle = true; 1569 spin_unlock(&cfile->file_info_lock); 1570 if (server->ops->close_dir) 1571 rc = server->ops->close_dir(xid, tcon, &cfile->fid); 1572 else 1573 rc = -ENOSYS; 1574 cifs_dbg(FYI, "Closing uncompleted readdir with rc %d\n", rc); 1575 /* not much we can do if it fails anyway, ignore rc */ 1576 rc = 0; 1577 } else 1578 spin_unlock(&cfile->file_info_lock); 1579 1580 buf = cfile->srch_inf.ntwrk_buf_start; 1581 if (buf) { 1582 cifs_dbg(FYI, "closedir free smb buf in srch struct\n"); 1583 cfile->srch_inf.ntwrk_buf_start = NULL; 1584 if (cfile->srch_inf.smallBuf) 1585 cifs_small_buf_release(buf); 1586 else if (cfile->srch_inf.is_dynamic_buf) 1587 kfree(buf); 1588 else 1589 cifs_buf_release(buf); 1590 } 1591 1592 cifs_put_tlink(cfile->tlink); 1593 kfree(file->private_data); 1594 file->private_data = NULL; 1595 /* BB can we lock the filestruct while this is going on? */ 1596 free_xid(xid); 1597 return rc; 1598 } 1599 1600 static struct cifsLockInfo * 1601 cifs_lock_init(__u64 offset, __u64 length, __u8 type, __u16 flags) 1602 { 1603 struct cifsLockInfo *lock = 1604 kmalloc_obj(struct cifsLockInfo); 1605 if (!lock) 1606 return lock; 1607 lock->offset = offset; 1608 lock->length = length; 1609 lock->type = type; 1610 lock->pid = current->tgid; 1611 lock->flags = flags; 1612 INIT_LIST_HEAD(&lock->blist); 1613 init_waitqueue_head(&lock->block_q); 1614 return lock; 1615 } 1616 1617 void 1618 cifs_del_lock_waiters(struct cifsLockInfo *lock) 1619 { 1620 struct cifsLockInfo *li, *tmp; 1621 list_for_each_entry_safe(li, tmp, &lock->blist, blist) { 1622 list_del_init(&li->blist); 1623 wake_up(&li->block_q); 1624 } 1625 } 1626 1627 #define CIFS_LOCK_OP 0 1628 #define CIFS_READ_OP 1 1629 #define CIFS_WRITE_OP 2 1630 1631 /* @rw_check : 0 - no op, 1 - read, 2 - write */ 1632 static bool 1633 cifs_find_fid_lock_conflict(struct cifs_fid_locks *fdlocks, __u64 offset, 1634 __u64 length, __u8 type, __u16 flags, 1635 struct cifsFileInfo *cfile, 1636 struct cifsLockInfo **conf_lock, int rw_check) 1637 { 1638 struct cifsLockInfo *li; 1639 struct cifsFileInfo *cur_cfile = fdlocks->cfile; 1640 struct TCP_Server_Info *server = tlink_tcon(cfile->tlink)->ses->server; 1641 1642 list_for_each_entry(li, &fdlocks->locks, llist) { 1643 if (offset + length <= li->offset || 1644 offset >= li->offset + li->length) 1645 continue; 1646 if (rw_check != CIFS_LOCK_OP && current->tgid == li->pid && 1647 server->ops->compare_fids(cfile, cur_cfile)) { 1648 /* shared lock prevents write op through the same fid */ 1649 if (!(li->type & server->vals->shared_lock_type) || 1650 rw_check != CIFS_WRITE_OP) 1651 continue; 1652 } 1653 if ((type & server->vals->shared_lock_type) && 1654 ((server->ops->compare_fids(cfile, cur_cfile) && 1655 current->tgid == li->pid) || type == li->type)) 1656 continue; 1657 if (rw_check == CIFS_LOCK_OP && 1658 (flags & FL_OFDLCK) && (li->flags & FL_OFDLCK) && 1659 server->ops->compare_fids(cfile, cur_cfile)) 1660 continue; 1661 if (conf_lock) 1662 *conf_lock = li; 1663 trace_smb3_lock_conflict(cfile->fid.persistent_fid, 1664 offset, length, type, 1665 li->offset, li->length, li->type, li->pid); 1666 return true; 1667 } 1668 return false; 1669 } 1670 1671 bool 1672 cifs_find_lock_conflict(struct cifsFileInfo *cfile, __u64 offset, __u64 length, 1673 __u8 type, __u16 flags, 1674 struct cifsLockInfo **conf_lock, int rw_check) 1675 { 1676 bool rc = false; 1677 struct cifs_fid_locks *cur; 1678 struct cifsInodeInfo *cinode = CIFS_I(d_inode(cfile->dentry)); 1679 1680 list_for_each_entry(cur, &cinode->llist, llist) { 1681 rc = cifs_find_fid_lock_conflict(cur, offset, length, type, 1682 flags, cfile, conf_lock, 1683 rw_check); 1684 if (rc) 1685 break; 1686 } 1687 1688 return rc; 1689 } 1690 1691 /* 1692 * Check if there is another lock that prevents us to set the lock (mandatory 1693 * style). If such a lock exists, update the flock structure with its 1694 * properties. Otherwise, set the flock type to F_UNLCK if we can cache brlocks 1695 * or leave it the same if we can't. Returns 0 if we don't need to request to 1696 * the server or 1 otherwise. 1697 */ 1698 static int 1699 cifs_lock_test(struct cifsFileInfo *cfile, __u64 offset, __u64 length, 1700 __u8 type, struct file_lock *flock) 1701 { 1702 int rc = 0; 1703 struct cifsLockInfo *conf_lock; 1704 struct cifsInodeInfo *cinode = CIFS_I(d_inode(cfile->dentry)); 1705 struct TCP_Server_Info *server = tlink_tcon(cfile->tlink)->ses->server; 1706 bool exist; 1707 1708 down_read(&cinode->lock_sem); 1709 1710 exist = cifs_find_lock_conflict(cfile, offset, length, type, 1711 flock->c.flc_flags, &conf_lock, 1712 CIFS_LOCK_OP); 1713 if (exist) { 1714 flock->fl_start = conf_lock->offset; 1715 flock->fl_end = conf_lock->offset + conf_lock->length - 1; 1716 flock->c.flc_pid = conf_lock->pid; 1717 if (conf_lock->type & server->vals->shared_lock_type) 1718 flock->c.flc_type = F_RDLCK; 1719 else 1720 flock->c.flc_type = F_WRLCK; 1721 } else if (!cinode->can_cache_brlcks) 1722 rc = 1; 1723 else 1724 flock->c.flc_type = F_UNLCK; 1725 1726 up_read(&cinode->lock_sem); 1727 return rc; 1728 } 1729 1730 static void 1731 cifs_lock_add(struct cifsFileInfo *cfile, struct cifsLockInfo *lock) 1732 { 1733 struct cifsInodeInfo *cinode = CIFS_I(d_inode(cfile->dentry)); 1734 cifs_down_write(&cinode->lock_sem); 1735 list_add_tail(&lock->llist, &cfile->llist->locks); 1736 up_write(&cinode->lock_sem); 1737 } 1738 1739 /* 1740 * Set the byte-range lock (mandatory style). Returns: 1741 * 1) 0, if we set the lock and don't need to request to the server; 1742 * 2) 1, if no locks prevent us but we need to request to the server; 1743 * 3) -EACCES, if there is a lock that prevents us and wait is false. 1744 */ 1745 static int 1746 cifs_lock_add_if(struct cifsFileInfo *cfile, struct cifsLockInfo *lock, 1747 bool wait, unsigned int xid) 1748 { 1749 struct cifsLockInfo *conf_lock; 1750 struct cifsInodeInfo *cinode = CIFS_I(d_inode(cfile->dentry)); 1751 bool exist; 1752 int rc = 0; 1753 1754 try_again: 1755 exist = false; 1756 cifs_down_write(&cinode->lock_sem); 1757 1758 exist = cifs_find_lock_conflict(cfile, lock->offset, lock->length, 1759 lock->type, lock->flags, &conf_lock, 1760 CIFS_LOCK_OP); 1761 if (!exist && cinode->can_cache_brlcks) { 1762 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink); 1763 1764 list_add_tail(&lock->llist, &cfile->llist->locks); 1765 trace_smb3_lock_cached(xid, cfile->fid.persistent_fid, 1766 tcon->tid, tcon->ses->Suid, 1767 lock->offset, lock->length, 1768 lock->type, 1, 0); 1769 up_write(&cinode->lock_sem); 1770 return rc; 1771 } 1772 1773 if (!exist) 1774 rc = 1; 1775 else if (!wait) 1776 rc = -EACCES; 1777 else { 1778 list_add_tail(&lock->blist, &conf_lock->blist); 1779 up_write(&cinode->lock_sem); 1780 rc = wait_event_interruptible(lock->block_q, 1781 (lock->blist.prev == &lock->blist) && 1782 (lock->blist.next == &lock->blist)); 1783 if (!rc) 1784 goto try_again; 1785 cifs_down_write(&cinode->lock_sem); 1786 list_del_init(&lock->blist); 1787 } 1788 1789 up_write(&cinode->lock_sem); 1790 return rc; 1791 } 1792 1793 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 1794 /* 1795 * Check if there is another lock that prevents us to set the lock (posix 1796 * style). If such a lock exists, update the flock structure with its 1797 * properties. Otherwise, set the flock type to F_UNLCK if we can cache brlocks 1798 * or leave it the same if we can't. Returns 0 if we don't need to request to 1799 * the server or 1 otherwise. 1800 */ 1801 static int 1802 cifs_posix_lock_test(struct file *file, struct file_lock *flock) 1803 { 1804 int rc = 0; 1805 struct cifsInodeInfo *cinode = CIFS_I(file_inode(file)); 1806 unsigned char saved_type = flock->c.flc_type; 1807 1808 if ((flock->c.flc_flags & FL_POSIX) == 0) 1809 return 1; 1810 1811 down_read(&cinode->lock_sem); 1812 posix_test_lock(file, flock); 1813 1814 if (lock_is_unlock(flock) && !cinode->can_cache_brlcks) { 1815 flock->c.flc_type = saved_type; 1816 rc = 1; 1817 } 1818 1819 up_read(&cinode->lock_sem); 1820 return rc; 1821 } 1822 1823 /* 1824 * Set the byte-range lock (posix style). Returns: 1825 * 1) <0, if the error occurs while setting the lock; 1826 * 2) 0, if we set the lock and don't need to request to the server; 1827 * 3) FILE_LOCK_DEFERRED, if we will wait for some other file_lock; 1828 * 4) FILE_LOCK_DEFERRED + 1, if we need to request to the server. 1829 */ 1830 static int 1831 cifs_posix_lock_set(struct file *file, struct file_lock *flock) 1832 { 1833 struct cifsInodeInfo *cinode = CIFS_I(file_inode(file)); 1834 int rc = FILE_LOCK_DEFERRED + 1; 1835 1836 if ((flock->c.flc_flags & FL_POSIX) == 0) 1837 return rc; 1838 1839 cifs_down_write(&cinode->lock_sem); 1840 if (!cinode->can_cache_brlcks) { 1841 up_write(&cinode->lock_sem); 1842 return rc; 1843 } 1844 1845 rc = posix_lock_file(file, flock, NULL); 1846 up_write(&cinode->lock_sem); 1847 return rc; 1848 } 1849 1850 int 1851 cifs_push_mandatory_locks(struct cifsFileInfo *cfile) 1852 { 1853 unsigned int xid; 1854 int rc = 0, stored_rc; 1855 struct cifsLockInfo *li, *tmp; 1856 struct cifs_tcon *tcon; 1857 unsigned int num, max_num, max_buf; 1858 LOCKING_ANDX_RANGE *buf, *cur; 1859 static const int types[] = { 1860 LOCKING_ANDX_LARGE_FILES, 1861 LOCKING_ANDX_SHARED_LOCK | LOCKING_ANDX_LARGE_FILES 1862 }; 1863 int i; 1864 1865 xid = get_xid(); 1866 tcon = tlink_tcon(cfile->tlink); 1867 1868 /* 1869 * Accessing maxBuf is racy with cifs_reconnect - need to store value 1870 * and check it before using. 1871 */ 1872 max_buf = tcon->ses->server->maxBuf; 1873 if (max_buf < (sizeof(struct smb_hdr) + sizeof(LOCKING_ANDX_RANGE))) { 1874 free_xid(xid); 1875 return -EINVAL; 1876 } 1877 1878 BUILD_BUG_ON(sizeof(struct smb_hdr) + sizeof(LOCKING_ANDX_RANGE) > 1879 PAGE_SIZE); 1880 max_buf = min_t(unsigned int, max_buf - sizeof(struct smb_hdr), 1881 PAGE_SIZE); 1882 max_num = (max_buf - sizeof(struct smb_hdr)) / 1883 sizeof(LOCKING_ANDX_RANGE); 1884 buf = kzalloc_objs(LOCKING_ANDX_RANGE, max_num); 1885 if (!buf) { 1886 free_xid(xid); 1887 return -ENOMEM; 1888 } 1889 1890 for (i = 0; i < 2; i++) { 1891 cur = buf; 1892 num = 0; 1893 list_for_each_entry_safe(li, tmp, &cfile->llist->locks, llist) { 1894 if (li->type != types[i]) 1895 continue; 1896 cur->Pid = cpu_to_le16(li->pid); 1897 cur->LengthLow = cpu_to_le32((u32)li->length); 1898 cur->LengthHigh = cpu_to_le32((u32)(li->length>>32)); 1899 cur->OffsetLow = cpu_to_le32((u32)li->offset); 1900 cur->OffsetHigh = cpu_to_le32((u32)(li->offset>>32)); 1901 if (++num == max_num) { 1902 stored_rc = cifs_lockv(xid, tcon, 1903 cfile->fid.netfid, 1904 (__u8)li->type, 0, num, 1905 buf); 1906 if (stored_rc) 1907 rc = stored_rc; 1908 cur = buf; 1909 num = 0; 1910 } else 1911 cur++; 1912 } 1913 1914 if (num) { 1915 stored_rc = cifs_lockv(xid, tcon, cfile->fid.netfid, 1916 (__u8)types[i], 0, num, buf); 1917 if (stored_rc) 1918 rc = stored_rc; 1919 } 1920 } 1921 1922 kfree(buf); 1923 free_xid(xid); 1924 return rc; 1925 } 1926 1927 static __u32 1928 hash_lockowner(fl_owner_t owner) 1929 { 1930 return cifs_lock_secret ^ hash32_ptr((const void *)owner); 1931 } 1932 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 1933 1934 struct lock_to_push { 1935 struct list_head llist; 1936 __u64 offset; 1937 __u64 length; 1938 __u32 pid; 1939 __u16 netfid; 1940 __u8 type; 1941 }; 1942 1943 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 1944 static int 1945 cifs_push_posix_locks(struct cifsFileInfo *cfile) 1946 { 1947 struct inode *inode = d_inode(cfile->dentry); 1948 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink); 1949 struct file_lock *flock; 1950 struct file_lock_context *flctx = locks_inode_context(inode); 1951 unsigned int count = 0, i; 1952 int rc = 0, xid, type; 1953 struct list_head locks_to_send, *el; 1954 struct lock_to_push *lck, *tmp; 1955 __u64 length; 1956 1957 xid = get_xid(); 1958 1959 if (!flctx) 1960 goto out; 1961 1962 spin_lock(&flctx->flc_lock); 1963 list_for_each(el, &flctx->flc_posix) { 1964 count++; 1965 } 1966 spin_unlock(&flctx->flc_lock); 1967 1968 INIT_LIST_HEAD(&locks_to_send); 1969 1970 /* 1971 * Allocating count locks is enough because no FL_POSIX locks can be 1972 * added to the list while we are holding cinode->lock_sem that 1973 * protects locking operations of this inode. 1974 */ 1975 for (i = 0; i < count; i++) { 1976 lck = kmalloc_obj(struct lock_to_push); 1977 if (!lck) { 1978 rc = -ENOMEM; 1979 goto err_out; 1980 } 1981 list_add_tail(&lck->llist, &locks_to_send); 1982 } 1983 1984 el = locks_to_send.next; 1985 spin_lock(&flctx->flc_lock); 1986 for_each_file_lock(flock, &flctx->flc_posix) { 1987 unsigned char ftype = flock->c.flc_type; 1988 1989 if (el == &locks_to_send) { 1990 /* 1991 * The list ended. We don't have enough allocated 1992 * structures - something is really wrong. 1993 */ 1994 cifs_dbg(VFS, "Can't push all brlocks!\n"); 1995 break; 1996 } 1997 length = cifs_flock_len(flock); 1998 if (ftype == F_RDLCK || ftype == F_SHLCK) 1999 type = CIFS_RDLCK; 2000 else 2001 type = CIFS_WRLCK; 2002 lck = list_entry(el, struct lock_to_push, llist); 2003 lck->pid = hash_lockowner(flock->c.flc_owner); 2004 lck->netfid = cfile->fid.netfid; 2005 lck->length = length; 2006 lck->type = type; 2007 lck->offset = flock->fl_start; 2008 } 2009 spin_unlock(&flctx->flc_lock); 2010 2011 list_for_each_entry_safe(lck, tmp, &locks_to_send, llist) { 2012 int stored_rc; 2013 2014 stored_rc = CIFSSMBPosixLock(xid, tcon, lck->netfid, lck->pid, 2015 lck->offset, lck->length, NULL, 2016 lck->type, 0); 2017 if (stored_rc) 2018 rc = stored_rc; 2019 list_del(&lck->llist); 2020 kfree(lck); 2021 } 2022 2023 out: 2024 free_xid(xid); 2025 return rc; 2026 err_out: 2027 list_for_each_entry_safe(lck, tmp, &locks_to_send, llist) { 2028 list_del(&lck->llist); 2029 kfree(lck); 2030 } 2031 goto out; 2032 } 2033 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 2034 2035 static int 2036 cifs_push_locks(struct cifsFileInfo *cfile) 2037 { 2038 struct cifsInodeInfo *cinode = CIFS_I(d_inode(cfile->dentry)); 2039 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink); 2040 int rc = 0; 2041 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 2042 struct cifs_sb_info *cifs_sb = CIFS_SB(cinode); 2043 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 2044 2045 /* we are going to update can_cache_brlcks here - need a write access */ 2046 cifs_down_write(&cinode->lock_sem); 2047 if (!cinode->can_cache_brlcks) { 2048 up_write(&cinode->lock_sem); 2049 return rc; 2050 } 2051 2052 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 2053 if (cap_unix(tcon->ses) && 2054 (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) && 2055 ((cifs_sb_flags(cifs_sb) & CIFS_MOUNT_NOPOSIXBRL) == 0)) 2056 rc = cifs_push_posix_locks(cfile); 2057 else 2058 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 2059 rc = tcon->ses->server->ops->push_mand_locks(cfile); 2060 2061 cinode->can_cache_brlcks = false; 2062 up_write(&cinode->lock_sem); 2063 return rc; 2064 } 2065 2066 static void 2067 cifs_read_flock(struct file_lock *flock, __u32 *type, int *lock, int *unlock, 2068 bool *wait_flag, struct TCP_Server_Info *server) 2069 { 2070 if (flock->c.flc_flags & FL_POSIX) 2071 cifs_dbg(FYI, "Posix\n"); 2072 if (flock->c.flc_flags & FL_FLOCK) 2073 cifs_dbg(FYI, "Flock\n"); 2074 if (flock->c.flc_flags & FL_SLEEP) { 2075 cifs_dbg(FYI, "Blocking lock\n"); 2076 *wait_flag = true; 2077 } 2078 if (flock->c.flc_flags & FL_ACCESS) 2079 cifs_dbg(FYI, "Process suspended by mandatory locking - not implemented yet\n"); 2080 if (flock->c.flc_flags & FL_LEASE) 2081 cifs_dbg(FYI, "Lease on file - not implemented yet\n"); 2082 if (flock->c.flc_flags & 2083 (~(FL_POSIX | FL_FLOCK | FL_SLEEP | 2084 FL_ACCESS | FL_LEASE | FL_CLOSE | FL_OFDLCK))) 2085 cifs_dbg(FYI, "Unknown lock flags 0x%x\n", 2086 flock->c.flc_flags); 2087 2088 *type = server->vals->large_lock_type; 2089 if (lock_is_write(flock)) { 2090 cifs_dbg(FYI, "F_WRLCK\n"); 2091 *type |= server->vals->exclusive_lock_type; 2092 *lock = 1; 2093 } else if (lock_is_unlock(flock)) { 2094 cifs_dbg(FYI, "F_UNLCK\n"); 2095 *type |= server->vals->unlock_lock_type; 2096 *unlock = 1; 2097 /* Check if unlock includes more than one lock range */ 2098 } else if (lock_is_read(flock)) { 2099 cifs_dbg(FYI, "F_RDLCK\n"); 2100 *type |= server->vals->shared_lock_type; 2101 *lock = 1; 2102 } else if (flock->c.flc_type == F_EXLCK) { 2103 cifs_dbg(FYI, "F_EXLCK\n"); 2104 *type |= server->vals->exclusive_lock_type; 2105 *lock = 1; 2106 } else if (flock->c.flc_type == F_SHLCK) { 2107 cifs_dbg(FYI, "F_SHLCK\n"); 2108 *type |= server->vals->shared_lock_type; 2109 *lock = 1; 2110 } else 2111 cifs_dbg(FYI, "Unknown type of lock\n"); 2112 } 2113 2114 static int 2115 cifs_getlk(struct file *file, struct file_lock *flock, __u32 type, 2116 bool wait_flag, bool posix_lck, unsigned int xid) 2117 { 2118 int rc = 0; 2119 __u64 length = cifs_flock_len(flock); 2120 struct cifsFileInfo *cfile = (struct cifsFileInfo *)file->private_data; 2121 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink); 2122 struct TCP_Server_Info *server = tcon->ses->server; 2123 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 2124 __u16 netfid = cfile->fid.netfid; 2125 2126 if (posix_lck) { 2127 int posix_lock_type; 2128 2129 rc = cifs_posix_lock_test(file, flock); 2130 if (!rc) 2131 return rc; 2132 2133 if (type & server->vals->shared_lock_type) 2134 posix_lock_type = CIFS_RDLCK; 2135 else 2136 posix_lock_type = CIFS_WRLCK; 2137 rc = CIFSSMBPosixLock(xid, tcon, netfid, 2138 hash_lockowner(flock->c.flc_owner), 2139 flock->fl_start, length, flock, 2140 posix_lock_type, wait_flag); 2141 return rc; 2142 } 2143 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 2144 2145 rc = cifs_lock_test(cfile, flock->fl_start, length, type, flock); 2146 if (!rc) 2147 return rc; 2148 2149 /* BB we could chain these into one lock request BB */ 2150 rc = server->ops->mand_lock(xid, cfile, flock->fl_start, length, type, 2151 1, 0, false); 2152 if (rc == 0) { 2153 rc = server->ops->mand_lock(xid, cfile, flock->fl_start, length, 2154 type, 0, 1, false); 2155 flock->c.flc_type = F_UNLCK; 2156 if (rc != 0) 2157 cifs_dbg(VFS, "Error unlocking previously locked range %d during test of lock\n", 2158 rc); 2159 return 0; 2160 } 2161 2162 if (type & server->vals->shared_lock_type) { 2163 flock->c.flc_type = F_WRLCK; 2164 return 0; 2165 } 2166 2167 type &= ~server->vals->exclusive_lock_type; 2168 2169 rc = server->ops->mand_lock(xid, cfile, flock->fl_start, length, 2170 type | server->vals->shared_lock_type, 2171 1, 0, false); 2172 if (rc == 0) { 2173 rc = server->ops->mand_lock(xid, cfile, flock->fl_start, length, 2174 type | server->vals->shared_lock_type, 0, 1, false); 2175 flock->c.flc_type = F_RDLCK; 2176 if (rc != 0) 2177 cifs_dbg(VFS, "Error unlocking previously locked range %d during test of lock\n", 2178 rc); 2179 } else 2180 flock->c.flc_type = F_WRLCK; 2181 2182 return 0; 2183 } 2184 2185 void 2186 cifs_move_llist(struct list_head *source, struct list_head *dest) 2187 { 2188 struct list_head *li, *tmp; 2189 list_for_each_safe(li, tmp, source) 2190 list_move(li, dest); 2191 } 2192 2193 int 2194 cifs_get_hardlink_path(struct cifs_tcon *tcon, struct inode *inode, 2195 struct file *file) 2196 { 2197 struct cifsFileInfo *open_file = NULL; 2198 struct cifsInodeInfo *cinode = CIFS_I(inode); 2199 int rc = 0; 2200 2201 spin_lock(&tcon->open_file_lock); 2202 spin_lock(&cinode->open_file_lock); 2203 2204 list_for_each_entry(open_file, &cinode->openFileList, flist) { 2205 if (file->f_flags == open_file->f_flags) { 2206 rc = -EINVAL; 2207 break; 2208 } 2209 } 2210 2211 spin_unlock(&cinode->open_file_lock); 2212 spin_unlock(&tcon->open_file_lock); 2213 return rc; 2214 } 2215 2216 void 2217 cifs_free_llist(struct list_head *llist) 2218 { 2219 struct cifsLockInfo *li, *tmp; 2220 list_for_each_entry_safe(li, tmp, llist, llist) { 2221 cifs_del_lock_waiters(li); 2222 list_del(&li->llist); 2223 kfree(li); 2224 } 2225 } 2226 2227 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 2228 int 2229 cifs_unlock_range(struct cifsFileInfo *cfile, struct file_lock *flock, 2230 unsigned int xid) 2231 { 2232 int rc = 0, stored_rc; 2233 static const int types[] = { 2234 LOCKING_ANDX_LARGE_FILES, 2235 LOCKING_ANDX_SHARED_LOCK | LOCKING_ANDX_LARGE_FILES 2236 }; 2237 unsigned int i; 2238 unsigned int max_num, num, max_buf; 2239 LOCKING_ANDX_RANGE *buf, *cur; 2240 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink); 2241 struct cifsInodeInfo *cinode = CIFS_I(d_inode(cfile->dentry)); 2242 struct cifsLockInfo *li, *tmp; 2243 __u64 length = cifs_flock_len(flock); 2244 LIST_HEAD(tmp_llist); 2245 2246 /* 2247 * Accessing maxBuf is racy with cifs_reconnect - need to store value 2248 * and check it before using. 2249 */ 2250 max_buf = tcon->ses->server->maxBuf; 2251 if (max_buf < (sizeof(struct smb_hdr) + sizeof(LOCKING_ANDX_RANGE))) 2252 return -EINVAL; 2253 2254 BUILD_BUG_ON(sizeof(struct smb_hdr) + sizeof(LOCKING_ANDX_RANGE) > 2255 PAGE_SIZE); 2256 max_buf = min_t(unsigned int, max_buf - sizeof(struct smb_hdr), 2257 PAGE_SIZE); 2258 max_num = (max_buf - sizeof(struct smb_hdr)) / 2259 sizeof(LOCKING_ANDX_RANGE); 2260 buf = kzalloc_objs(LOCKING_ANDX_RANGE, max_num); 2261 if (!buf) 2262 return -ENOMEM; 2263 2264 cifs_down_write(&cinode->lock_sem); 2265 for (i = 0; i < 2; i++) { 2266 cur = buf; 2267 num = 0; 2268 list_for_each_entry_safe(li, tmp, &cfile->llist->locks, llist) { 2269 if (flock->fl_start > li->offset || 2270 (flock->fl_start + length) < 2271 (li->offset + li->length)) 2272 continue; 2273 if (current->tgid != li->pid) 2274 continue; 2275 if (types[i] != li->type) 2276 continue; 2277 if (cinode->can_cache_brlcks) { 2278 /* 2279 * We can cache brlock requests - simply remove 2280 * a lock from the file's list. 2281 */ 2282 list_del(&li->llist); 2283 cifs_del_lock_waiters(li); 2284 kfree(li); 2285 continue; 2286 } 2287 cur->Pid = cpu_to_le16(li->pid); 2288 cur->LengthLow = cpu_to_le32((u32)li->length); 2289 cur->LengthHigh = cpu_to_le32((u32)(li->length>>32)); 2290 cur->OffsetLow = cpu_to_le32((u32)li->offset); 2291 cur->OffsetHigh = cpu_to_le32((u32)(li->offset>>32)); 2292 /* 2293 * We need to save a lock here to let us add it again to 2294 * the file's list if the unlock range request fails on 2295 * the server. 2296 */ 2297 list_move(&li->llist, &tmp_llist); 2298 if (++num == max_num) { 2299 stored_rc = cifs_lockv(xid, tcon, 2300 cfile->fid.netfid, 2301 li->type, num, 0, buf); 2302 if (stored_rc) { 2303 /* 2304 * We failed on the unlock range 2305 * request - add all locks from the tmp 2306 * list to the head of the file's list. 2307 */ 2308 cifs_move_llist(&tmp_llist, 2309 &cfile->llist->locks); 2310 rc = stored_rc; 2311 } else 2312 /* 2313 * The unlock range request succeed - 2314 * free the tmp list. 2315 */ 2316 cifs_free_llist(&tmp_llist); 2317 cur = buf; 2318 num = 0; 2319 } else 2320 cur++; 2321 } 2322 if (num) { 2323 stored_rc = cifs_lockv(xid, tcon, cfile->fid.netfid, 2324 types[i], num, 0, buf); 2325 if (stored_rc) { 2326 cifs_move_llist(&tmp_llist, 2327 &cfile->llist->locks); 2328 rc = stored_rc; 2329 } else 2330 cifs_free_llist(&tmp_llist); 2331 } 2332 } 2333 2334 up_write(&cinode->lock_sem); 2335 kfree(buf); 2336 return rc; 2337 } 2338 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 2339 2340 static int 2341 cifs_setlk(struct file *file, struct file_lock *flock, __u32 type, 2342 bool wait_flag, bool posix_lck, int lock, int unlock, 2343 unsigned int xid) 2344 { 2345 int rc = 0; 2346 __u64 length = cifs_flock_len(flock); 2347 struct cifsFileInfo *cfile = (struct cifsFileInfo *)file->private_data; 2348 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink); 2349 struct TCP_Server_Info *server = tcon->ses->server; 2350 struct inode *inode = d_inode(cfile->dentry); 2351 2352 #ifdef CONFIG_CIFS_ALLOW_INSECURE_LEGACY 2353 if (posix_lck) { 2354 int posix_lock_type; 2355 2356 rc = cifs_posix_lock_set(file, flock); 2357 if (rc <= FILE_LOCK_DEFERRED) 2358 return rc; 2359 2360 if (type & server->vals->shared_lock_type) 2361 posix_lock_type = CIFS_RDLCK; 2362 else 2363 posix_lock_type = CIFS_WRLCK; 2364 2365 if (unlock == 1) 2366 posix_lock_type = CIFS_UNLCK; 2367 2368 rc = CIFSSMBPosixLock(xid, tcon, cfile->fid.netfid, 2369 hash_lockowner(flock->c.flc_owner), 2370 flock->fl_start, length, 2371 NULL, posix_lock_type, wait_flag); 2372 goto out; 2373 } 2374 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */ 2375 if (lock) { 2376 struct cifsLockInfo *lock; 2377 2378 lock = cifs_lock_init(flock->fl_start, length, type, 2379 flock->c.flc_flags); 2380 if (!lock) 2381 return -ENOMEM; 2382 2383 rc = cifs_lock_add_if(cfile, lock, wait_flag, xid); 2384 if (rc < 0) { 2385 kfree(lock); 2386 return rc; 2387 } 2388 if (!rc) 2389 goto out; 2390 2391 /* 2392 * Windows 7 server can delay breaking lease from read to None 2393 * if we set a byte-range lock on a file - break it explicitly 2394 * before sending the lock to the server to be sure the next 2395 * read won't conflict with non-overlapted locks due to 2396 * pagereading. 2397 */ 2398 if (!CIFS_CACHE_WRITE(CIFS_I(inode)) && 2399 CIFS_CACHE_READ(CIFS_I(inode))) { 2400 cifs_zap_mapping(inode); 2401 cifs_dbg(FYI, "Set no oplock for inode=%p due to mand locks\n", 2402 inode); 2403 cifs_reset_oplock(CIFS_I(inode)); 2404 } 2405 2406 rc = server->ops->mand_lock(xid, cfile, flock->fl_start, length, 2407 type, 1, 0, wait_flag); 2408 if (rc) { 2409 kfree(lock); 2410 return rc; 2411 } 2412 2413 cifs_lock_add(cfile, lock); 2414 } else if (unlock) 2415 rc = server->ops->mand_unlock_range(cfile, flock, xid); 2416 2417 out: 2418 if ((flock->c.flc_flags & FL_POSIX) || (flock->c.flc_flags & FL_FLOCK)) { 2419 /* 2420 * If this is a request to remove all locks because we 2421 * are closing the file, it doesn't matter if the 2422 * unlocking failed as both cifs.ko and the SMB server 2423 * remove the lock on file close 2424 */ 2425 if (rc) { 2426 cifs_dbg(VFS, "%s failed rc=%d\n", __func__, rc); 2427 if (!(flock->c.flc_flags & FL_CLOSE)) 2428 return rc; 2429 } 2430 rc = locks_lock_file_wait(file, flock); 2431 } 2432 return rc; 2433 } 2434 2435 int cifs_flock(struct file *file, int cmd, struct file_lock *fl) 2436 { 2437 int rc, xid; 2438 int lock = 0, unlock = 0; 2439 bool wait_flag = false; 2440 bool posix_lck = false; 2441 struct cifs_sb_info *cifs_sb; 2442 struct cifs_tcon *tcon; 2443 struct cifsFileInfo *cfile; 2444 __u32 type; 2445 2446 xid = get_xid(); 2447 2448 if (!(fl->c.flc_flags & FL_FLOCK)) { 2449 rc = -ENOLCK; 2450 free_xid(xid); 2451 return rc; 2452 } 2453 2454 cfile = (struct cifsFileInfo *)file->private_data; 2455 tcon = tlink_tcon(cfile->tlink); 2456 2457 cifs_read_flock(fl, &type, &lock, &unlock, &wait_flag, 2458 tcon->ses->server); 2459 cifs_sb = CIFS_SB(file); 2460 2461 if (cap_unix(tcon->ses) && 2462 (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) && 2463 ((cifs_sb_flags(cifs_sb) & CIFS_MOUNT_NOPOSIXBRL) == 0)) 2464 posix_lck = true; 2465 2466 if (!lock && !unlock) { 2467 /* 2468 * if no lock or unlock then nothing to do since we do not 2469 * know what it is 2470 */ 2471 rc = -EOPNOTSUPP; 2472 free_xid(xid); 2473 return rc; 2474 } 2475 2476 rc = cifs_setlk(file, fl, type, wait_flag, posix_lck, lock, unlock, 2477 xid); 2478 free_xid(xid); 2479 return rc; 2480 2481 2482 } 2483 2484 int cifs_lock(struct file *file, int cmd, struct file_lock *flock) 2485 { 2486 struct cifs_sb_info *cifs_sb = CIFS_SB(file); 2487 struct cifsFileInfo *cfile; 2488 int lock = 0, unlock = 0; 2489 bool wait_flag = false; 2490 bool posix_lck = false; 2491 struct cifs_tcon *tcon; 2492 __u32 type; 2493 int rc, xid; 2494 2495 rc = -EACCES; 2496 xid = get_xid(); 2497 2498 cifs_dbg(FYI, "%s: %pD2 cmd=0x%x type=0x%x flags=0x%x r=%lld:%lld\n", __func__, file, cmd, 2499 flock->c.flc_flags, flock->c.flc_type, 2500 (long long)flock->fl_start, 2501 (long long)flock->fl_end); 2502 2503 cfile = (struct cifsFileInfo *)file->private_data; 2504 tcon = tlink_tcon(cfile->tlink); 2505 2506 cifs_read_flock(flock, &type, &lock, &unlock, &wait_flag, 2507 tcon->ses->server); 2508 set_bit(CIFS_INO_CLOSE_ON_LOCK, &CIFS_I(d_inode(cfile->dentry))->flags); 2509 2510 if (cap_unix(tcon->ses) && 2511 (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) && 2512 ((cifs_sb_flags(cifs_sb) & CIFS_MOUNT_NOPOSIXBRL) == 0)) 2513 posix_lck = true; 2514 /* 2515 * BB add code here to normalize offset and length to account for 2516 * negative length which we can not accept over the wire. 2517 */ 2518 if (IS_GETLK(cmd)) { 2519 rc = cifs_getlk(file, flock, type, wait_flag, posix_lck, xid); 2520 free_xid(xid); 2521 return rc; 2522 } 2523 2524 if (!lock && !unlock) { 2525 /* 2526 * if no lock or unlock then nothing to do since we do not 2527 * know what it is 2528 */ 2529 free_xid(xid); 2530 return -EOPNOTSUPP; 2531 } 2532 2533 rc = cifs_setlk(file, flock, type, wait_flag, posix_lck, lock, unlock, 2534 xid); 2535 free_xid(xid); 2536 return rc; 2537 } 2538 2539 static void cifs_update_i_blocks_for_write(struct inode *inode, loff_t start, 2540 loff_t end) 2541 { 2542 struct cifsInodeInfo *cinode = CIFS_I(inode); 2543 u64 allocated_end = CIFS_INO_BYTES(inode->i_blocks); 2544 u64 blocks; 2545 2546 if (cinode->cifsAttrs & FILE_ATTRIBUTE_SPARSE_FILE) 2547 return; 2548 2549 /* 2550 * Grow the local estimate only across the currently known allocated 2551 * prefix. A write beyond that may leave a hole. 2552 */ 2553 if ((u64)start > allocated_end) 2554 return; 2555 2556 blocks = CIFS_INO_BLOCKS(end); 2557 if ((u64)inode->i_blocks < blocks) 2558 inode->i_blocks = blocks; 2559 } 2560 2561 static void cifs_update_i_blocks_after_write(struct kiocb *iocb, 2562 ssize_t written) 2563 { 2564 struct inode *inode = file_inode(iocb->ki_filp); 2565 loff_t end = iocb->ki_pos; 2566 2567 if (written <= 0) 2568 return; 2569 2570 spin_lock(&inode->i_lock); 2571 cifs_update_i_blocks_for_write(inode, end - written, end); 2572 spin_unlock(&inode->i_lock); 2573 } 2574 2575 void cifs_write_subrequest_terminated(struct cifs_io_subrequest *wdata, ssize_t result) 2576 { 2577 struct netfs_io_request *wreq = wdata->rreq; 2578 struct inode *inode = wreq->inode; 2579 struct netfs_inode *ictx = netfs_inode(inode); 2580 loff_t wrend; 2581 2582 if (result > 0) { 2583 spin_lock(&inode->i_lock); 2584 2585 wrend = wdata->subreq.start + wdata->subreq.transferred + result; 2586 2587 if (wrend > ictx->_zero_point && 2588 (wdata->rreq->origin == NETFS_UNBUFFERED_WRITE || 2589 wdata->rreq->origin == NETFS_DIO_WRITE)) 2590 netfs_write_zero_point(inode, wrend); 2591 if (wrend > ictx->_remote_i_size) 2592 netfs_resize_file(ictx, wrend, true); 2593 cifs_update_i_blocks_for_write(inode, wdata->subreq.start, 2594 wrend); 2595 2596 spin_unlock(&inode->i_lock); 2597 } 2598 2599 netfs_write_subrequest_terminated(&wdata->subreq, result); 2600 } 2601 2602 static bool open_flags_match(struct cifsInodeInfo *cinode, 2603 unsigned int oflags, unsigned int cflags) 2604 { 2605 struct inode *inode = &cinode->netfs.inode; 2606 int crw = 0, orw = 0; 2607 2608 oflags &= ~(O_CREAT | O_EXCL | O_TRUNC); 2609 cflags &= ~(O_CREAT | O_EXCL | O_TRUNC); 2610 2611 if (cifs_fscache_enabled(inode)) { 2612 if (OPEN_FMODE(cflags) & FMODE_WRITE) 2613 crw = 1; 2614 if (OPEN_FMODE(oflags) & FMODE_WRITE) 2615 orw = 1; 2616 } 2617 if (cifs_convert_flags(oflags, orw) != cifs_convert_flags(cflags, crw)) 2618 return false; 2619 2620 return (oflags & (O_SYNC | O_DIRECT)) == (cflags & (O_SYNC | O_DIRECT)); 2621 } 2622 2623 struct cifsFileInfo *__find_readable_file(struct cifsInodeInfo *cifs_inode, 2624 unsigned int find_flags, 2625 unsigned int open_flags) 2626 { 2627 struct cifs_sb_info *cifs_sb = CIFS_SB(cifs_inode); 2628 bool fsuid_only = find_flags & FIND_FSUID_ONLY; 2629 struct cifsFileInfo *open_file = NULL; 2630 2631 /* only filter by fsuid on multiuser mounts */ 2632 if (!(cifs_sb_flags(cifs_sb) & CIFS_MOUNT_MULTIUSER)) 2633 fsuid_only = false; 2634 2635 spin_lock(&cifs_inode->open_file_lock); 2636 /* we could simply get the first_list_entry since write-only entries 2637 are always at the end of the list but since the first entry might 2638 have a close pending, we go through the whole list */ 2639 list_for_each_entry(open_file, &cifs_inode->openFileList, flist) { 2640 if (fsuid_only && !uid_eq(open_file->uid, current_fsuid())) 2641 continue; 2642 if ((find_flags & FIND_NO_PENDING_DELETE) && 2643 open_file->status_file_deleted) 2644 continue; 2645 if ((find_flags & FIND_OPEN_FLAGS) && 2646 !open_flags_match(cifs_inode, open_flags, 2647 open_file->f_flags)) 2648 continue; 2649 if (OPEN_FMODE(open_file->f_flags) & FMODE_READ) { 2650 if ((!open_file->invalidHandle)) { 2651 /* found a good file */ 2652 /* lock it so it will not be closed on us */ 2653 cifsFileInfo_get(open_file); 2654 spin_unlock(&cifs_inode->open_file_lock); 2655 return open_file; 2656 } /* else might as well continue, and look for 2657 another, or simply have the caller reopen it 2658 again rather than trying to fix this handle */ 2659 } else /* write only file */ 2660 break; /* write only files are last so must be done */ 2661 } 2662 spin_unlock(&cifs_inode->open_file_lock); 2663 return NULL; 2664 } 2665 2666 /* Return -EBADF if no handle is found and general rc otherwise */ 2667 int __cifs_get_writable_file(struct cifsInodeInfo *cifs_inode, 2668 unsigned int find_flags, unsigned int open_flags, 2669 struct cifsFileInfo **ret_file) 2670 { 2671 struct cifsFileInfo *open_file, *inv_file = NULL; 2672 bool fsuid_only, with_delete; 2673 struct cifs_sb_info *cifs_sb; 2674 bool any_available = false; 2675 unsigned int refind = 0; 2676 *ret_file = NULL; 2677 int rc = -EBADF; 2678 2679 /* 2680 * Having a null inode here (because mapping->host was set to zero by 2681 * the VFS or MM) should not happen but we had reports of on oops (due 2682 * to it being zero) during stress testcases so we need to check for it 2683 */ 2684 2685 if (cifs_inode == NULL) { 2686 cifs_dbg(VFS, "Null inode passed to cifs_writeable_file\n"); 2687 dump_stack(); 2688 return rc; 2689 } 2690 2691 if (test_bit(CIFS_INO_TMPFILE, &cifs_inode->flags)) 2692 find_flags = FIND_ANY; 2693 2694 cifs_sb = CIFS_SB(cifs_inode); 2695 2696 with_delete = find_flags & FIND_WITH_DELETE; 2697 fsuid_only = find_flags & FIND_FSUID_ONLY; 2698 /* only filter by fsuid on multiuser mounts */ 2699 if (!(cifs_sb_flags(cifs_sb) & CIFS_MOUNT_MULTIUSER)) 2700 fsuid_only = false; 2701 2702 spin_lock(&cifs_inode->open_file_lock); 2703 refind_writable: 2704 if (refind > MAX_REOPEN_ATT) { 2705 spin_unlock(&cifs_inode->open_file_lock); 2706 return rc; 2707 } 2708 list_for_each_entry(open_file, &cifs_inode->openFileList, flist) { 2709 if (!any_available && open_file->pid != current->tgid) 2710 continue; 2711 if (fsuid_only && !uid_eq(open_file->uid, current_fsuid())) 2712 continue; 2713 if (with_delete && !(open_file->fid.access & DELETE)) 2714 continue; 2715 if ((find_flags & FIND_NO_PENDING_DELETE) && 2716 open_file->status_file_deleted) 2717 continue; 2718 if ((find_flags & FIND_OPEN_FLAGS) && 2719 !open_flags_match(cifs_inode, open_flags, 2720 open_file->f_flags)) 2721 continue; 2722 if (OPEN_FMODE(open_file->f_flags) & FMODE_WRITE) { 2723 if (!open_file->invalidHandle) { 2724 /* found a good writable file */ 2725 cifsFileInfo_get(open_file); 2726 spin_unlock(&cifs_inode->open_file_lock); 2727 *ret_file = open_file; 2728 return 0; 2729 } else { 2730 if (!inv_file) 2731 inv_file = open_file; 2732 } 2733 } 2734 } 2735 /* couldn't find usable FH with same pid, try any available */ 2736 if (!any_available) { 2737 any_available = true; 2738 goto refind_writable; 2739 } 2740 2741 if (inv_file) { 2742 any_available = false; 2743 cifsFileInfo_get(inv_file); 2744 } 2745 2746 spin_unlock(&cifs_inode->open_file_lock); 2747 2748 if (inv_file) { 2749 rc = cifs_reopen_file(inv_file, false); 2750 if (!rc) { 2751 *ret_file = inv_file; 2752 return 0; 2753 } 2754 2755 spin_lock(&cifs_inode->open_file_lock); 2756 list_move_tail(&inv_file->flist, &cifs_inode->openFileList); 2757 spin_unlock(&cifs_inode->open_file_lock); 2758 cifsFileInfo_put(inv_file); 2759 ++refind; 2760 inv_file = NULL; 2761 spin_lock(&cifs_inode->open_file_lock); 2762 goto refind_writable; 2763 } 2764 2765 return rc; 2766 } 2767 2768 struct cifsFileInfo * 2769 find_writable_file(struct cifsInodeInfo *cifs_inode, int flags) 2770 { 2771 struct cifsFileInfo *cfile; 2772 int rc; 2773 2774 rc = cifs_get_writable_file(cifs_inode, flags, &cfile); 2775 if (rc) 2776 cifs_dbg(FYI, "Couldn't find writable handle rc=%d\n", rc); 2777 2778 return cfile; 2779 } 2780 2781 int cifs_get_writable_path(struct cifs_tcon *tcon, const char *name, 2782 struct inode *inode, int flags, 2783 struct cifsFileInfo **ret_file) 2784 { 2785 struct cifsFileInfo *cfile; 2786 void *page; 2787 2788 *ret_file = NULL; 2789 2790 if (inode) 2791 return cifs_get_writable_file(CIFS_I(inode), flags, ret_file); 2792 2793 page = alloc_dentry_path(); 2794 spin_lock(&tcon->open_file_lock); 2795 list_for_each_entry(cfile, &tcon->openFileList, tlist) { 2796 struct cifsInodeInfo *cinode; 2797 const char *full_path = build_path_from_dentry(cfile->dentry, page); 2798 if (IS_ERR(full_path)) { 2799 spin_unlock(&tcon->open_file_lock); 2800 free_dentry_path(page); 2801 return PTR_ERR(full_path); 2802 } 2803 if (strcmp(full_path, name)) 2804 continue; 2805 2806 cinode = CIFS_I(d_inode(cfile->dentry)); 2807 spin_unlock(&tcon->open_file_lock); 2808 free_dentry_path(page); 2809 return cifs_get_writable_file(cinode, flags, ret_file); 2810 } 2811 2812 spin_unlock(&tcon->open_file_lock); 2813 free_dentry_path(page); 2814 return -ENOENT; 2815 } 2816 2817 int 2818 cifs_get_readable_path(struct cifs_tcon *tcon, const char *name, 2819 struct cifsFileInfo **ret_file) 2820 { 2821 struct cifsFileInfo *cfile; 2822 void *page = alloc_dentry_path(); 2823 2824 *ret_file = NULL; 2825 2826 spin_lock(&tcon->open_file_lock); 2827 list_for_each_entry(cfile, &tcon->openFileList, tlist) { 2828 struct cifsInodeInfo *cinode; 2829 const char *full_path = build_path_from_dentry(cfile->dentry, page); 2830 if (IS_ERR(full_path)) { 2831 spin_unlock(&tcon->open_file_lock); 2832 free_dentry_path(page); 2833 return PTR_ERR(full_path); 2834 } 2835 if (strcmp(full_path, name)) 2836 continue; 2837 2838 cinode = CIFS_I(d_inode(cfile->dentry)); 2839 spin_unlock(&tcon->open_file_lock); 2840 free_dentry_path(page); 2841 *ret_file = find_readable_file(cinode, FIND_ANY); 2842 return *ret_file ? 0 : -ENOENT; 2843 } 2844 2845 spin_unlock(&tcon->open_file_lock); 2846 free_dentry_path(page); 2847 return -ENOENT; 2848 } 2849 2850 /* 2851 * Flush data on a strict file. 2852 */ 2853 int cifs_strict_fsync(struct file *file, loff_t start, loff_t end, 2854 int datasync) 2855 { 2856 struct cifsFileInfo *smbfile = file->private_data; 2857 struct inode *inode = file_inode(file); 2858 unsigned int xid; 2859 int rc; 2860 2861 rc = file_write_and_wait_range(file, start, end); 2862 if (rc) { 2863 trace_cifs_fsync_err(inode->i_ino, rc); 2864 return rc; 2865 } 2866 2867 cifs_dbg(FYI, "%s: name=%pD datasync=0x%x\n", __func__, file, datasync); 2868 2869 if (!CIFS_CACHE_READ(CIFS_I(inode))) { 2870 rc = cifs_zap_mapping(inode); 2871 cifs_dbg(FYI, "%s: invalidate mapping: rc = %d\n", __func__, rc); 2872 } 2873 2874 xid = get_xid(); 2875 rc = cifs_file_flush(xid, inode, smbfile); 2876 free_xid(xid); 2877 return rc; 2878 } 2879 2880 /* 2881 * Flush data on a non-strict data. 2882 */ 2883 int cifs_fsync(struct file *file, loff_t start, loff_t end, int datasync) 2884 { 2885 unsigned int xid; 2886 int rc = 0; 2887 struct cifs_tcon *tcon; 2888 struct TCP_Server_Info *server; 2889 struct cifsFileInfo *smbfile = file->private_data; 2890 struct inode *inode = file_inode(file); 2891 struct cifs_sb_info *cifs_sb = CIFS_SB(file); 2892 2893 rc = file_write_and_wait_range(file, start, end); 2894 if (rc) { 2895 trace_cifs_fsync_err(file_inode(file)->i_ino, rc); 2896 return rc; 2897 } 2898 2899 xid = get_xid(); 2900 2901 cifs_dbg(FYI, "Sync file - name: %pD datasync: 0x%x\n", 2902 file, datasync); 2903 2904 tcon = tlink_tcon(smbfile->tlink); 2905 if (!(cifs_sb_flags(cifs_sb) & CIFS_MOUNT_NOSSYNC)) { 2906 server = tcon->ses->server; 2907 if (server->ops->flush == NULL) { 2908 rc = -ENOSYS; 2909 goto fsync_exit; 2910 } 2911 2912 if ((OPEN_FMODE(smbfile->f_flags) & FMODE_WRITE) == 0) { 2913 smbfile = find_writable_file(CIFS_I(inode), FIND_ANY); 2914 if (smbfile) { 2915 rc = server->ops->flush(xid, tcon, &smbfile->fid); 2916 cifsFileInfo_put(smbfile); 2917 } else 2918 cifs_dbg(FYI, "ignore fsync for file not open for write\n"); 2919 } else 2920 rc = server->ops->flush(xid, tcon, &smbfile->fid); 2921 } 2922 2923 fsync_exit: 2924 free_xid(xid); 2925 return rc; 2926 } 2927 2928 /* 2929 * As file closes, flush all cached write data for this inode checking 2930 * for write behind errors. 2931 */ 2932 int cifs_flush(struct file *file, fl_owner_t id) 2933 { 2934 struct inode *inode = file_inode(file); 2935 int rc = 0; 2936 2937 if (file->f_mode & FMODE_WRITE) 2938 rc = filemap_write_and_wait(inode->i_mapping); 2939 2940 cifs_dbg(FYI, "Flush inode %p file %p rc %d\n", inode, file, rc); 2941 if (rc) { 2942 /* get more nuanced writeback errors */ 2943 rc = filemap_check_wb_err(file->f_mapping, 0); 2944 trace_cifs_flush_err(inode->i_ino, rc); 2945 } 2946 return rc; 2947 } 2948 2949 static ssize_t 2950 cifs_writev(struct kiocb *iocb, struct iov_iter *from) 2951 { 2952 struct file *file = iocb->ki_filp; 2953 struct cifsFileInfo *cfile = (struct cifsFileInfo *)file->private_data; 2954 struct inode *inode = file->f_mapping->host; 2955 struct cifsInodeInfo *cinode = CIFS_I(inode); 2956 struct TCP_Server_Info *server = tlink_tcon(cfile->tlink)->ses->server; 2957 struct cifs_sb_info *cifs_sb = CIFS_SB(inode); 2958 ssize_t rc; 2959 2960 rc = netfs_start_io_write(inode); 2961 if (rc < 0) 2962 return rc; 2963 2964 /* 2965 * We need to hold the sem to be sure nobody modifies lock list 2966 * with a brlock that prevents writing. 2967 */ 2968 down_read(&cinode->lock_sem); 2969 2970 rc = generic_write_checks(iocb, from); 2971 if (rc <= 0) 2972 goto out; 2973 2974 if ((cifs_sb_flags(cifs_sb) & CIFS_MOUNT_NOPOSIXBRL) && 2975 (cifs_find_lock_conflict(cfile, iocb->ki_pos, iov_iter_count(from), 2976 server->vals->exclusive_lock_type, 0, 2977 NULL, CIFS_WRITE_OP))) { 2978 rc = -EACCES; 2979 goto out; 2980 } 2981 2982 rc = netfs_buffered_write_iter_locked(iocb, from, NULL); 2983 cifs_update_i_blocks_after_write(iocb, rc); 2984 2985 out: 2986 up_read(&cinode->lock_sem); 2987 netfs_end_io_write(inode); 2988 if (rc > 0) 2989 rc = generic_write_sync(iocb, rc); 2990 return rc; 2991 } 2992 2993 ssize_t 2994 cifs_strict_writev(struct kiocb *iocb, struct iov_iter *from) 2995 { 2996 struct inode *inode = file_inode(iocb->ki_filp); 2997 struct cifsInodeInfo *cinode = CIFS_I(inode); 2998 struct cifs_sb_info *cifs_sb = CIFS_SB(inode); 2999 struct cifsFileInfo *cfile = (struct cifsFileInfo *) 3000 iocb->ki_filp->private_data; 3001 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink); 3002 ssize_t written; 3003 3004 written = cifs_get_writer(cinode); 3005 if (written) 3006 return written; 3007 3008 if (CIFS_CACHE_WRITE(cinode)) { 3009 if (cap_unix(tcon->ses) && 3010 (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) && 3011 ((cifs_sb_flags(cifs_sb) & CIFS_MOUNT_NOPOSIXBRL) == 0)) { 3012 written = netfs_file_write_iter(iocb, from); 3013 cifs_update_i_blocks_after_write(iocb, written); 3014 goto out; 3015 } 3016 written = cifs_writev(iocb, from); 3017 goto out; 3018 } 3019 /* 3020 * For non-oplocked files in strict cache mode we need to write the data 3021 * to the server exactly from the pos to pos+len-1 rather than flush all 3022 * affected pages because it may cause a error with mandatory locks on 3023 * these pages but not on the region from pos to ppos+len-1. 3024 */ 3025 written = netfs_file_write_iter(iocb, from); 3026 cifs_update_i_blocks_after_write(iocb, written); 3027 if (CIFS_CACHE_READ(cinode)) { 3028 /* 3029 * We have read level caching and we have just sent a write 3030 * request to the server thus making data in the cache stale. 3031 * Zap the cache and set oplock/lease level to NONE to avoid 3032 * reading stale data from the cache. All subsequent read 3033 * operations will read new data from the server. 3034 */ 3035 cifs_zap_mapping(inode); 3036 cifs_dbg(FYI, "Set Oplock/Lease to NONE for inode=%p after write\n", 3037 inode); 3038 cifs_reset_oplock(cinode); 3039 } 3040 out: 3041 cifs_put_writer(cinode); 3042 return written; 3043 } 3044 3045 ssize_t cifs_direct_write_iter(struct kiocb *iocb, struct iov_iter *from) 3046 { 3047 ssize_t written; 3048 3049 written = netfs_file_write_iter(iocb, from); 3050 cifs_update_i_blocks_after_write(iocb, written); 3051 return written; 3052 } 3053 3054 ssize_t cifs_loose_read_iter(struct kiocb *iocb, struct iov_iter *iter) 3055 { 3056 ssize_t rc; 3057 struct inode *inode = file_inode(iocb->ki_filp); 3058 3059 if (iocb->ki_flags & IOCB_DIRECT) 3060 return netfs_unbuffered_read_iter(iocb, iter); 3061 3062 rc = cifs_revalidate_mapping(inode); 3063 if (rc) 3064 return rc; 3065 3066 return netfs_file_read_iter(iocb, iter); 3067 } 3068 3069 ssize_t cifs_file_write_iter(struct kiocb *iocb, struct iov_iter *from) 3070 { 3071 struct inode *inode = file_inode(iocb->ki_filp); 3072 struct cifsInodeInfo *cinode = CIFS_I(inode); 3073 ssize_t written; 3074 int rc; 3075 3076 if (iocb->ki_filp->f_flags & O_DIRECT) { 3077 written = netfs_unbuffered_write_iter(iocb, from); 3078 cifs_update_i_blocks_after_write(iocb, written); 3079 if (written > 0 && CIFS_CACHE_READ(cinode)) { 3080 cifs_zap_mapping(inode); 3081 cifs_dbg(FYI, 3082 "Set no oplock for inode=%p after a write operation\n", 3083 inode); 3084 cifs_reset_oplock(cinode); 3085 } 3086 return written; 3087 } 3088 3089 written = cifs_get_writer(cinode); 3090 if (written) 3091 return written; 3092 3093 written = netfs_file_write_iter(iocb, from); 3094 cifs_update_i_blocks_after_write(iocb, written); 3095 3096 if (!CIFS_CACHE_WRITE(CIFS_I(inode))) { 3097 rc = filemap_fdatawrite(inode->i_mapping); 3098 if (rc) 3099 cifs_dbg(FYI, "cifs_file_write_iter: %d rc on %p inode\n", 3100 rc, inode); 3101 } 3102 3103 cifs_put_writer(cinode); 3104 return written; 3105 } 3106 3107 ssize_t 3108 cifs_strict_readv(struct kiocb *iocb, struct iov_iter *to) 3109 { 3110 struct inode *inode = file_inode(iocb->ki_filp); 3111 struct cifsInodeInfo *cinode = CIFS_I(inode); 3112 struct cifs_sb_info *cifs_sb = CIFS_SB(inode); 3113 struct cifsFileInfo *cfile = (struct cifsFileInfo *) 3114 iocb->ki_filp->private_data; 3115 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink); 3116 int rc = -EACCES; 3117 3118 /* 3119 * In strict cache mode we need to read from the server all the time 3120 * if we don't have level II oplock because the server can delay mtime 3121 * change - so we can't make a decision about inode invalidating. 3122 * And we can also fail with pagereading if there are mandatory locks 3123 * on pages affected by this read but not on the region from pos to 3124 * pos+len-1. 3125 */ 3126 if (!CIFS_CACHE_READ(cinode)) 3127 return netfs_unbuffered_read_iter(iocb, to); 3128 3129 if ((cifs_sb_flags(cifs_sb) & CIFS_MOUNT_NOPOSIXBRL) == 0) { 3130 if (iocb->ki_flags & IOCB_DIRECT) 3131 return netfs_unbuffered_read_iter(iocb, to); 3132 return netfs_buffered_read_iter(iocb, to); 3133 } 3134 3135 /* 3136 * We need to hold the sem to be sure nobody modifies lock list 3137 * with a brlock that prevents reading. 3138 */ 3139 if (iocb->ki_flags & IOCB_DIRECT) { 3140 rc = netfs_start_io_direct(inode); 3141 if (rc < 0) 3142 goto out; 3143 rc = -EACCES; 3144 down_read(&cinode->lock_sem); 3145 if (!cifs_find_lock_conflict( 3146 cfile, iocb->ki_pos, iov_iter_count(to), 3147 tcon->ses->server->vals->shared_lock_type, 3148 0, NULL, CIFS_READ_OP)) 3149 rc = netfs_unbuffered_read_iter_locked(iocb, to); 3150 up_read(&cinode->lock_sem); 3151 netfs_end_io_direct(inode); 3152 } else { 3153 rc = netfs_start_io_read(inode); 3154 if (rc < 0) 3155 goto out; 3156 rc = -EACCES; 3157 down_read(&cinode->lock_sem); 3158 if (!cifs_find_lock_conflict( 3159 cfile, iocb->ki_pos, iov_iter_count(to), 3160 tcon->ses->server->vals->shared_lock_type, 3161 0, NULL, CIFS_READ_OP)) 3162 rc = filemap_read(iocb, to, 0); 3163 up_read(&cinode->lock_sem); 3164 netfs_end_io_read(inode); 3165 } 3166 out: 3167 return rc; 3168 } 3169 3170 static vm_fault_t cifs_page_mkwrite(struct vm_fault *vmf) 3171 { 3172 return netfs_page_mkwrite(vmf, NULL); 3173 } 3174 3175 static const struct vm_operations_struct cifs_file_vm_ops = { 3176 .fault = filemap_fault, 3177 .map_pages = filemap_map_pages, 3178 .page_mkwrite = cifs_page_mkwrite, 3179 }; 3180 3181 int cifs_file_strict_mmap_prepare(struct vm_area_desc *desc) 3182 { 3183 int xid, rc = 0; 3184 struct inode *inode = file_inode(desc->file); 3185 3186 xid = get_xid(); 3187 3188 if (!CIFS_CACHE_READ(CIFS_I(inode))) 3189 rc = cifs_zap_mapping(inode); 3190 if (!rc) 3191 rc = generic_file_mmap_prepare(desc); 3192 if (!rc) 3193 desc->vm_ops = &cifs_file_vm_ops; 3194 3195 free_xid(xid); 3196 return rc; 3197 } 3198 3199 int cifs_file_mmap_prepare(struct vm_area_desc *desc) 3200 { 3201 int rc, xid; 3202 3203 xid = get_xid(); 3204 3205 rc = cifs_revalidate_file(desc->file); 3206 if (rc) 3207 cifs_dbg(FYI, "Validation prior to mmap failed, error=%d\n", 3208 rc); 3209 if (!rc) 3210 rc = generic_file_mmap_prepare(desc); 3211 if (!rc) 3212 desc->vm_ops = &cifs_file_vm_ops; 3213 3214 free_xid(xid); 3215 return rc; 3216 } 3217 3218 static int is_inode_writable(struct cifsInodeInfo *cifs_inode) 3219 { 3220 struct cifsFileInfo *open_file; 3221 3222 spin_lock(&cifs_inode->open_file_lock); 3223 list_for_each_entry(open_file, &cifs_inode->openFileList, flist) { 3224 if (OPEN_FMODE(open_file->f_flags) & FMODE_WRITE) { 3225 spin_unlock(&cifs_inode->open_file_lock); 3226 return 1; 3227 } 3228 } 3229 spin_unlock(&cifs_inode->open_file_lock); 3230 return 0; 3231 } 3232 3233 /* We do not want to update the file size from server for inodes 3234 open for write - to avoid races with writepage extending 3235 the file - in the future we could consider allowing 3236 refreshing the inode only on increases in the file size 3237 but this is tricky to do without racing with writebehind 3238 page caching in the current Linux kernel design */ 3239 bool is_size_safe_to_change(struct cifsInodeInfo *cifsInode, __u64 end_of_file, 3240 bool from_readdir) 3241 { 3242 struct cifs_sb_info *cifs_sb; 3243 unsigned long tlw; 3244 3245 if (!cifsInode) 3246 return true; 3247 3248 cifs_sb = CIFS_SB(cifsInode); 3249 3250 if (is_inode_writable(cifsInode) || 3251 ((cifsInode->oplock & CIFS_CACHE_RW_FLG) != 0 && from_readdir)) { 3252 /* This inode is open for write at least once */ 3253 3254 /* 3255 * Readdir data is unreliable when we have writable handles or 3256 * an exclusive lease -- never allow it to change i_size, even 3257 * on direct-IO mounts where the server's directory metadata 3258 * can still lag behind the actual file state. 3259 */ 3260 if (from_readdir) 3261 return false; 3262 3263 if (cifs_sb_flags(cifs_sb) & CIFS_MOUNT_DIRECT_IO) { 3264 /* since no page cache to corrupt on directio 3265 we can change size safely */ 3266 return true; 3267 } 3268 3269 if (i_size_read(&cifsInode->netfs.inode) < end_of_file) 3270 return true; 3271 3272 return false; 3273 } 3274 3275 /* 3276 * No writable handles open. Check whether we are within the attribute 3277 * cache validity window of a recent local modification. 3278 * 3279 * For the close() path: cifs_close() calls smp_store_release() on 3280 * time_last_write before _cifsFileInfo_put() removes the handle under 3281 * open_file_lock. That spin_unlock() is a store-release that pairs 3282 * with the spin_lock() (load-acquire) in is_inode_writable() above, 3283 * so if is_inode_writable() returned false the smp_load_acquire() 3284 * below is guaranteed to observe any time_last_write update from a 3285 * concurrent close(). 3286 * 3287 * For the setattr/truncate paths: those callers use smp_store_release() 3288 * directly; the smp_load_acquire() below pairs with that store. There 3289 * is no shared lock between setattr and readdir, so this relies on 3290 * acquire-release semantics alone. The store propagation latency on 3291 * weakly-ordered architectures (nanoseconds) is negligible relative to 3292 * the acregmax window (seconds) and the readdir RPC round-trip 3293 * (milliseconds), making this a sound design choice in practice. 3294 * 3295 * time_last_write == 0 means the inode has never been written locally; 3296 * skip the window check to avoid false positives near boot time when 3297 * jiffies is still close to INITIAL_JIFFIES on 32-bit systems. 3298 */ 3299 if (from_readdir) { 3300 /* Pairs with smp_store_release() at close and truncate sites. */ 3301 tlw = smp_load_acquire(&cifsInode->time_last_write); 3302 if (tlw && time_before(jiffies, tlw + cifs_sb->ctx->acregmax)) 3303 return false; 3304 } 3305 3306 return true; 3307 } 3308 3309 void cifs_oplock_break(struct work_struct *work) 3310 { 3311 struct cifsFileInfo *cfile = container_of(work, struct cifsFileInfo, 3312 oplock_break); 3313 struct inode *inode = d_inode(cfile->dentry); 3314 struct super_block *sb = inode->i_sb; 3315 struct cifs_sb_info *cifs_sb = CIFS_SB(sb); 3316 struct cifsInodeInfo *cinode = CIFS_I(inode); 3317 bool cache_read, cache_write, cache_handle; 3318 struct cifs_tcon *tcon; 3319 struct TCP_Server_Info *server; 3320 struct tcon_link *tlink; 3321 unsigned int oplock; 3322 int rc = 0; 3323 bool purge_cache = false, oplock_break_cancelled; 3324 __u64 persistent_fid, volatile_fid; 3325 __u16 net_fid; 3326 3327 wait_on_bit(&cinode->flags, CIFS_INODE_PENDING_WRITERS, 3328 TASK_UNINTERRUPTIBLE); 3329 3330 tlink = cifs_sb_tlink(cifs_sb); 3331 if (IS_ERR(tlink)) 3332 goto out; 3333 tcon = tlink_tcon(tlink); 3334 server = tcon->ses->server; 3335 3336 scoped_guard(spinlock, &cinode->open_file_lock) { 3337 unsigned int sbflags = cifs_sb_flags(cifs_sb); 3338 3339 server->ops->downgrade_oplock(server, cinode, cfile->oplock_level, 3340 cfile->oplock_epoch, &purge_cache); 3341 oplock = READ_ONCE(cinode->oplock); 3342 cache_read = (oplock & CIFS_CACHE_READ_FLG) || 3343 (sbflags & CIFS_MOUNT_RO_CACHE); 3344 cache_write = (oplock & CIFS_CACHE_WRITE_FLG) || 3345 (sbflags & CIFS_MOUNT_RW_CACHE); 3346 cache_handle = oplock & CIFS_CACHE_HANDLE_FLG; 3347 } 3348 3349 if (!cache_write && cache_read && cifs_has_mand_locks(cinode)) { 3350 cifs_dbg(FYI, "Reset oplock to None for inode=%p due to mand locks\n", 3351 inode); 3352 cifs_reset_oplock(cinode); 3353 oplock = 0; 3354 cache_read = cache_write = cache_handle = false; 3355 } 3356 3357 if (S_ISREG(inode->i_mode)) { 3358 if (cache_read) 3359 break_lease(inode, O_RDONLY); 3360 else 3361 break_lease(inode, O_WRONLY); 3362 rc = filemap_fdatawrite(inode->i_mapping); 3363 if (!cache_read || purge_cache) { 3364 rc = filemap_fdatawait(inode->i_mapping); 3365 mapping_set_error(inode->i_mapping, rc); 3366 cifs_zap_mapping(inode); 3367 } 3368 cifs_dbg(FYI, "Oplock flush inode %p rc %d\n", inode, rc); 3369 if (cache_write) 3370 goto oplock_break_ack; 3371 } 3372 3373 rc = cifs_push_locks(cfile); 3374 if (rc) 3375 cifs_dbg(VFS, "Push locks rc = %d\n", rc); 3376 3377 oplock_break_ack: 3378 /* 3379 * When oplock break is received and there are no active 3380 * file handles but cached, then schedule deferred close immediately. 3381 * So, new open will not use cached handle. 3382 */ 3383 3384 if (!cache_handle && !list_empty(&cinode->deferred_closes)) 3385 cifs_close_deferred_file(cinode); 3386 3387 persistent_fid = cfile->fid.persistent_fid; 3388 volatile_fid = cfile->fid.volatile_fid; 3389 net_fid = cfile->fid.netfid; 3390 oplock_break_cancelled = cfile->oplock_break_cancelled; 3391 3392 _cifsFileInfo_put(cfile, false /* do not wait for ourself */, false); 3393 /* 3394 * MS-SMB2 3.2.5.19.1 and 3.2.5.19.2 (and MS-CIFS 3.2.5.42) do not require 3395 * an acknowledgment to be sent when the file has already been closed. 3396 */ 3397 spin_lock(&cinode->open_file_lock); 3398 /* check list empty since can race with kill_sb calling tree disconnect */ 3399 if (!oplock_break_cancelled && !list_empty(&cinode->openFileList)) { 3400 spin_unlock(&cinode->open_file_lock); 3401 rc = server->ops->oplock_response(tcon, persistent_fid, 3402 volatile_fid, net_fid, 3403 cinode, oplock); 3404 cifs_dbg(FYI, "Oplock release rc = %d\n", rc); 3405 } else 3406 spin_unlock(&cinode->open_file_lock); 3407 3408 cifs_put_tlink(tlink); 3409 out: 3410 cifs_done_oplock_break(cinode); 3411 } 3412 3413 static int cifs_swap_activate(struct swap_info_struct *sis, 3414 struct file *swap_file, sector_t *span) 3415 { 3416 struct cifsFileInfo *cfile = swap_file->private_data; 3417 struct inode *inode = swap_file->f_mapping->host; 3418 unsigned long blocks; 3419 long long isize; 3420 3421 cifs_dbg(FYI, "swap activate\n"); 3422 3423 if (!swap_file->f_mapping->a_ops->swap_rw) 3424 /* Cannot support swap */ 3425 return -EINVAL; 3426 3427 spin_lock(&inode->i_lock); 3428 blocks = inode->i_blocks; 3429 isize = inode->i_size; 3430 spin_unlock(&inode->i_lock); 3431 if (blocks*512 < isize) { 3432 pr_warn("swap activate: swapfile has holes\n"); 3433 return -EINVAL; 3434 } 3435 *span = sis->pages; 3436 3437 pr_warn_once("Swap support over SMB3 is experimental\n"); 3438 3439 /* 3440 * TODO: consider adding ACL (or documenting how) to prevent other 3441 * users (on this or other systems) from reading it 3442 */ 3443 3444 3445 /* TODO: add sk_set_memalloc(inet) or similar */ 3446 3447 if (cfile) 3448 cfile->swapfile = true; 3449 /* 3450 * TODO: Since file already open, we can't open with DENY_ALL here 3451 * but we could add call to grab a byte range lock to prevent others 3452 * from reading or writing the file 3453 */ 3454 3455 sis->flags |= SWP_FS_OPS; 3456 return add_swap_extent(sis, 0, sis->max, 0); 3457 } 3458 3459 static void cifs_swap_deactivate(struct file *file) 3460 { 3461 struct cifsFileInfo *cfile = file->private_data; 3462 3463 cifs_dbg(FYI, "swap deactivate\n"); 3464 3465 /* TODO: undo sk_set_memalloc(inet) will eventually be needed */ 3466 3467 if (cfile) 3468 cfile->swapfile = false; 3469 3470 /* do we need to unpin (or unlock) the file */ 3471 } 3472 3473 /** 3474 * cifs_swap_rw - SMB3 address space operation for swap I/O 3475 * @iocb: target I/O control block 3476 * @iter: I/O buffer 3477 * 3478 * Perform IO to the swap-file. This is much like direct IO. 3479 */ 3480 static int cifs_swap_rw(struct kiocb *iocb, struct iov_iter *iter) 3481 { 3482 ssize_t ret; 3483 3484 if (iov_iter_rw(iter) == READ) 3485 ret = netfs_unbuffered_read_iter_locked(iocb, iter); 3486 else 3487 ret = netfs_unbuffered_write_iter_locked(iocb, iter, NULL); 3488 if (ret < 0) 3489 return ret; 3490 return 0; 3491 } 3492 3493 const struct address_space_operations cifs_addr_ops = { 3494 .read_folio = netfs_read_folio, 3495 .readahead = netfs_readahead, 3496 .writepages = netfs_writepages, 3497 .dirty_folio = netfs_dirty_folio, 3498 .release_folio = netfs_release_folio, 3499 .direct_IO = noop_direct_IO, 3500 .invalidate_folio = netfs_invalidate_folio, 3501 .migrate_folio = filemap_migrate_folio, 3502 /* 3503 * TODO: investigate and if useful we could add an is_dirty_writeback 3504 * helper if needed 3505 */ 3506 .swap_activate = cifs_swap_activate, 3507 .swap_deactivate = cifs_swap_deactivate, 3508 .swap_rw = cifs_swap_rw, 3509 }; 3510 3511 /* 3512 * cifs_readahead requires the server to support a buffer large enough to 3513 * contain the header plus one complete page of data. Otherwise, we need 3514 * to leave cifs_readahead out of the address space operations. 3515 */ 3516 const struct address_space_operations cifs_addr_ops_smallbuf = { 3517 .read_folio = netfs_read_folio, 3518 .writepages = netfs_writepages, 3519 .dirty_folio = netfs_dirty_folio, 3520 .release_folio = netfs_release_folio, 3521 .invalidate_folio = netfs_invalidate_folio, 3522 .migrate_folio = filemap_migrate_folio, 3523 }; 3524