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