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