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