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