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