• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *   fs/cifs/file.c
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  *   This library is free software; you can redistribute it and/or modify
11  *   it under the terms of the GNU Lesser General Public License as published
12  *   by the Free Software Foundation; either version 2.1 of the License, or
13  *   (at your option) any later version.
14  *
15  *   This library is distributed in the hope that it will be useful,
16  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
18  *   the GNU Lesser General Public License for more details.
19  *
20  *   You should have received a copy of the GNU Lesser General Public License
21  *   along with this library; if not, write to the Free Software
22  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23  */
24 #include <linux/fs.h>
25 #include <linux/backing-dev.h>
26 #include <linux/stat.h>
27 #include <linux/fcntl.h>
28 #include <linux/pagemap.h>
29 #include <linux/pagevec.h>
30 #include <linux/writeback.h>
31 #include <linux/task_io_accounting_ops.h>
32 #include <linux/delay.h>
33 #include <linux/mount.h>
34 #include <linux/slab.h>
35 #include <linux/swap.h>
36 #include <asm/div64.h>
37 #include "cifsfs.h"
38 #include "cifspdu.h"
39 #include "cifsglob.h"
40 #include "cifsproto.h"
41 #include "cifs_unicode.h"
42 #include "cifs_debug.h"
43 #include "cifs_fs_sb.h"
44 #include "fscache.h"
45 
46 
cifs_convert_flags(unsigned int flags)47 static inline int cifs_convert_flags(unsigned int flags)
48 {
49 	if ((flags & O_ACCMODE) == O_RDONLY)
50 		return GENERIC_READ;
51 	else if ((flags & O_ACCMODE) == O_WRONLY)
52 		return GENERIC_WRITE;
53 	else if ((flags & O_ACCMODE) == O_RDWR) {
54 		/* GENERIC_ALL is too much permission to request
55 		   can cause unnecessary access denied on create */
56 		/* return GENERIC_ALL; */
57 		return (GENERIC_READ | GENERIC_WRITE);
58 	}
59 
60 	return (READ_CONTROL | FILE_WRITE_ATTRIBUTES | FILE_READ_ATTRIBUTES |
61 		FILE_WRITE_EA | FILE_APPEND_DATA | FILE_WRITE_DATA |
62 		FILE_READ_DATA);
63 }
64 
cifs_posix_convert_flags(unsigned int flags)65 static u32 cifs_posix_convert_flags(unsigned int flags)
66 {
67 	u32 posix_flags = 0;
68 
69 	if ((flags & O_ACCMODE) == O_RDONLY)
70 		posix_flags = SMB_O_RDONLY;
71 	else if ((flags & O_ACCMODE) == O_WRONLY)
72 		posix_flags = SMB_O_WRONLY;
73 	else if ((flags & O_ACCMODE) == O_RDWR)
74 		posix_flags = SMB_O_RDWR;
75 
76 	if (flags & O_CREAT) {
77 		posix_flags |= SMB_O_CREAT;
78 		if (flags & O_EXCL)
79 			posix_flags |= SMB_O_EXCL;
80 	} else if (flags & O_EXCL)
81 		cifs_dbg(FYI, "Application %s pid %d has incorrectly set O_EXCL flag but not O_CREAT on file open. Ignoring O_EXCL\n",
82 			 current->comm, current->tgid);
83 
84 	if (flags & O_TRUNC)
85 		posix_flags |= SMB_O_TRUNC;
86 	/* be safe and imply O_SYNC for O_DSYNC */
87 	if (flags & O_DSYNC)
88 		posix_flags |= SMB_O_SYNC;
89 	if (flags & O_DIRECTORY)
90 		posix_flags |= SMB_O_DIRECTORY;
91 	if (flags & O_NOFOLLOW)
92 		posix_flags |= SMB_O_NOFOLLOW;
93 	if (flags & O_DIRECT)
94 		posix_flags |= SMB_O_DIRECT;
95 
96 	return posix_flags;
97 }
98 
cifs_get_disposition(unsigned int flags)99 static inline int cifs_get_disposition(unsigned int flags)
100 {
101 	if ((flags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL))
102 		return FILE_CREATE;
103 	else if ((flags & (O_CREAT | O_TRUNC)) == (O_CREAT | O_TRUNC))
104 		return FILE_OVERWRITE_IF;
105 	else if ((flags & O_CREAT) == O_CREAT)
106 		return FILE_OPEN_IF;
107 	else if ((flags & O_TRUNC) == O_TRUNC)
108 		return FILE_OVERWRITE;
109 	else
110 		return FILE_OPEN;
111 }
112 
cifs_posix_open(char * full_path,struct inode ** pinode,struct super_block * sb,int mode,unsigned int f_flags,__u32 * poplock,__u16 * pnetfid,unsigned int xid)113 int cifs_posix_open(char *full_path, struct inode **pinode,
114 			struct super_block *sb, int mode, unsigned int f_flags,
115 			__u32 *poplock, __u16 *pnetfid, unsigned int xid)
116 {
117 	int rc;
118 	FILE_UNIX_BASIC_INFO *presp_data;
119 	__u32 posix_flags = 0;
120 	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
121 	struct cifs_fattr fattr;
122 	struct tcon_link *tlink;
123 	struct cifs_tcon *tcon;
124 
125 	cifs_dbg(FYI, "posix open %s\n", full_path);
126 
127 	presp_data = kzalloc(sizeof(FILE_UNIX_BASIC_INFO), GFP_KERNEL);
128 	if (presp_data == NULL)
129 		return -ENOMEM;
130 
131 	tlink = cifs_sb_tlink(cifs_sb);
132 	if (IS_ERR(tlink)) {
133 		rc = PTR_ERR(tlink);
134 		goto posix_open_ret;
135 	}
136 
137 	tcon = tlink_tcon(tlink);
138 	mode &= ~current_umask();
139 
140 	posix_flags = cifs_posix_convert_flags(f_flags);
141 	rc = CIFSPOSIXCreate(xid, tcon, posix_flags, mode, pnetfid, presp_data,
142 			     poplock, full_path, cifs_sb->local_nls,
143 			     cifs_remap(cifs_sb));
144 	cifs_put_tlink(tlink);
145 
146 	if (rc)
147 		goto posix_open_ret;
148 
149 	if (presp_data->Type == cpu_to_le32(-1))
150 		goto posix_open_ret; /* open ok, caller does qpathinfo */
151 
152 	if (!pinode)
153 		goto posix_open_ret; /* caller does not need info */
154 
155 	cifs_unix_basic_to_fattr(&fattr, presp_data, cifs_sb);
156 
157 	/* get new inode and set it up */
158 	if (*pinode == NULL) {
159 		cifs_fill_uniqueid(sb, &fattr);
160 		*pinode = cifs_iget(sb, &fattr);
161 		if (!*pinode) {
162 			rc = -ENOMEM;
163 			goto posix_open_ret;
164 		}
165 	} else {
166 		cifs_fattr_to_inode(*pinode, &fattr);
167 	}
168 
169 posix_open_ret:
170 	kfree(presp_data);
171 	return rc;
172 }
173 
174 static int
cifs_nt_open(char * full_path,struct inode * inode,struct cifs_sb_info * cifs_sb,struct cifs_tcon * tcon,unsigned int f_flags,__u32 * oplock,struct cifs_fid * fid,unsigned int xid)175 cifs_nt_open(char *full_path, struct inode *inode, struct cifs_sb_info *cifs_sb,
176 	     struct cifs_tcon *tcon, unsigned int f_flags, __u32 *oplock,
177 	     struct cifs_fid *fid, unsigned int xid)
178 {
179 	int rc;
180 	int desired_access;
181 	int disposition;
182 	int create_options = CREATE_NOT_DIR;
183 	FILE_ALL_INFO *buf;
184 	struct TCP_Server_Info *server = tcon->ses->server;
185 	struct cifs_open_parms oparms;
186 
187 	if (!server->ops->open)
188 		return -ENOSYS;
189 
190 	desired_access = cifs_convert_flags(f_flags);
191 
192 /*********************************************************************
193  *  open flag mapping table:
194  *
195  *	POSIX Flag            CIFS Disposition
196  *	----------            ----------------
197  *	O_CREAT               FILE_OPEN_IF
198  *	O_CREAT | O_EXCL      FILE_CREATE
199  *	O_CREAT | O_TRUNC     FILE_OVERWRITE_IF
200  *	O_TRUNC               FILE_OVERWRITE
201  *	none of the above     FILE_OPEN
202  *
203  *	Note that there is not a direct match between disposition
204  *	FILE_SUPERSEDE (ie create whether or not file exists although
205  *	O_CREAT | O_TRUNC is similar but truncates the existing
206  *	file rather than creating a new file as FILE_SUPERSEDE does
207  *	(which uses the attributes / metadata passed in on open call)
208  *?
209  *?  O_SYNC is a reasonable match to CIFS writethrough flag
210  *?  and the read write flags match reasonably.  O_LARGEFILE
211  *?  is irrelevant because largefile support is always used
212  *?  by this client. Flags O_APPEND, O_DIRECT, O_DIRECTORY,
213  *	 O_FASYNC, O_NOFOLLOW, O_NONBLOCK need further investigation
214  *********************************************************************/
215 
216 	disposition = cifs_get_disposition(f_flags);
217 
218 	/* BB pass O_SYNC flag through on file attributes .. BB */
219 
220 	buf = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
221 	if (!buf)
222 		return -ENOMEM;
223 
224 	if (backup_cred(cifs_sb))
225 		create_options |= CREATE_OPEN_BACKUP_INTENT;
226 
227 	/* O_SYNC also has bit for O_DSYNC so following check picks up either */
228 	if (f_flags & O_SYNC)
229 		create_options |= CREATE_WRITE_THROUGH;
230 
231 	if (f_flags & O_DIRECT)
232 		create_options |= CREATE_NO_BUFFER;
233 
234 	oparms.tcon = tcon;
235 	oparms.cifs_sb = cifs_sb;
236 	oparms.desired_access = desired_access;
237 	oparms.create_options = create_options;
238 	oparms.disposition = disposition;
239 	oparms.path = full_path;
240 	oparms.fid = fid;
241 	oparms.reconnect = false;
242 
243 	rc = server->ops->open(xid, &oparms, oplock, buf);
244 
245 	if (rc)
246 		goto out;
247 
248 	if (tcon->unix_ext)
249 		rc = cifs_get_inode_info_unix(&inode, full_path, inode->i_sb,
250 					      xid);
251 	else
252 		rc = cifs_get_inode_info(&inode, full_path, buf, inode->i_sb,
253 					 xid, fid);
254 
255 out:
256 	kfree(buf);
257 	return rc;
258 }
259 
260 static bool
cifs_has_mand_locks(struct cifsInodeInfo * cinode)261 cifs_has_mand_locks(struct cifsInodeInfo *cinode)
262 {
263 	struct cifs_fid_locks *cur;
264 	bool has_locks = false;
265 
266 	down_read(&cinode->lock_sem);
267 	list_for_each_entry(cur, &cinode->llist, llist) {
268 		if (!list_empty(&cur->locks)) {
269 			has_locks = true;
270 			break;
271 		}
272 	}
273 	up_read(&cinode->lock_sem);
274 	return has_locks;
275 }
276 
277 struct cifsFileInfo *
cifs_new_fileinfo(struct cifs_fid * fid,struct file * file,struct tcon_link * tlink,__u32 oplock)278 cifs_new_fileinfo(struct cifs_fid *fid, struct file *file,
279 		  struct tcon_link *tlink, __u32 oplock)
280 {
281 	struct dentry *dentry = file_dentry(file);
282 	struct inode *inode = d_inode(dentry);
283 	struct cifsInodeInfo *cinode = CIFS_I(inode);
284 	struct cifsFileInfo *cfile;
285 	struct cifs_fid_locks *fdlocks;
286 	struct cifs_tcon *tcon = tlink_tcon(tlink);
287 	struct TCP_Server_Info *server = tcon->ses->server;
288 
289 	cfile = kzalloc(sizeof(struct cifsFileInfo), GFP_KERNEL);
290 	if (cfile == NULL)
291 		return cfile;
292 
293 	fdlocks = kzalloc(sizeof(struct cifs_fid_locks), GFP_KERNEL);
294 	if (!fdlocks) {
295 		kfree(cfile);
296 		return NULL;
297 	}
298 
299 	INIT_LIST_HEAD(&fdlocks->locks);
300 	fdlocks->cfile = cfile;
301 	cfile->llist = fdlocks;
302 	down_write(&cinode->lock_sem);
303 	list_add(&fdlocks->llist, &cinode->llist);
304 	up_write(&cinode->lock_sem);
305 
306 	cfile->count = 1;
307 	cfile->pid = current->tgid;
308 	cfile->uid = current_fsuid();
309 	cfile->dentry = dget(dentry);
310 	cfile->f_flags = file->f_flags;
311 	cfile->invalidHandle = false;
312 	cfile->tlink = cifs_get_tlink(tlink);
313 	INIT_WORK(&cfile->oplock_break, cifs_oplock_break);
314 	mutex_init(&cfile->fh_mutex);
315 	spin_lock_init(&cfile->file_info_lock);
316 
317 	cifs_sb_active(inode->i_sb);
318 
319 	/*
320 	 * If the server returned a read oplock and we have mandatory brlocks,
321 	 * set oplock level to None.
322 	 */
323 	if (server->ops->is_read_op(oplock) && cifs_has_mand_locks(cinode)) {
324 		cifs_dbg(FYI, "Reset oplock val from read to None due to mand locks\n");
325 		oplock = 0;
326 	}
327 
328 	spin_lock(&tcon->open_file_lock);
329 	if (fid->pending_open->oplock != CIFS_OPLOCK_NO_CHANGE && oplock)
330 		oplock = fid->pending_open->oplock;
331 	list_del(&fid->pending_open->olist);
332 
333 	fid->purge_cache = false;
334 	server->ops->set_fid(cfile, fid, oplock);
335 
336 	list_add(&cfile->tlist, &tcon->openFileList);
337 
338 	/* if readable file instance put first in list*/
339 	if (file->f_mode & FMODE_READ)
340 		list_add(&cfile->flist, &cinode->openFileList);
341 	else
342 		list_add_tail(&cfile->flist, &cinode->openFileList);
343 	spin_unlock(&tcon->open_file_lock);
344 
345 	if (fid->purge_cache)
346 		cifs_zap_mapping(inode);
347 
348 	file->private_data = cfile;
349 	return cfile;
350 }
351 
352 struct cifsFileInfo *
cifsFileInfo_get(struct cifsFileInfo * cifs_file)353 cifsFileInfo_get(struct cifsFileInfo *cifs_file)
354 {
355 	spin_lock(&cifs_file->file_info_lock);
356 	cifsFileInfo_get_locked(cifs_file);
357 	spin_unlock(&cifs_file->file_info_lock);
358 	return cifs_file;
359 }
360 
361 /*
362  * Release a reference on the file private data. This may involve closing
363  * the filehandle out on the server. Must be called without holding
364  * tcon->open_file_lock and cifs_file->file_info_lock.
365  */
cifsFileInfo_put(struct cifsFileInfo * cifs_file)366 void cifsFileInfo_put(struct cifsFileInfo *cifs_file)
367 {
368 	struct inode *inode = d_inode(cifs_file->dentry);
369 	struct cifs_tcon *tcon = tlink_tcon(cifs_file->tlink);
370 	struct TCP_Server_Info *server = tcon->ses->server;
371 	struct cifsInodeInfo *cifsi = CIFS_I(inode);
372 	struct super_block *sb = inode->i_sb;
373 	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
374 	struct cifsLockInfo *li, *tmp;
375 	struct cifs_fid fid;
376 	struct cifs_pending_open open;
377 	bool oplock_break_cancelled;
378 
379 	spin_lock(&tcon->open_file_lock);
380 
381 	spin_lock(&cifs_file->file_info_lock);
382 	if (--cifs_file->count > 0) {
383 		spin_unlock(&cifs_file->file_info_lock);
384 		spin_unlock(&tcon->open_file_lock);
385 		return;
386 	}
387 	spin_unlock(&cifs_file->file_info_lock);
388 
389 	if (server->ops->get_lease_key)
390 		server->ops->get_lease_key(inode, &fid);
391 
392 	/* store open in pending opens to make sure we don't miss lease break */
393 	cifs_add_pending_open_locked(&fid, cifs_file->tlink, &open);
394 
395 	/* remove it from the lists */
396 	list_del(&cifs_file->flist);
397 	list_del(&cifs_file->tlist);
398 
399 	if (list_empty(&cifsi->openFileList)) {
400 		cifs_dbg(FYI, "closing last open instance for inode %p\n",
401 			 d_inode(cifs_file->dentry));
402 		/*
403 		 * In strict cache mode we need invalidate mapping on the last
404 		 * close  because it may cause a error when we open this file
405 		 * again and get at least level II oplock.
406 		 */
407 		if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO)
408 			set_bit(CIFS_INO_INVALID_MAPPING, &cifsi->flags);
409 		cifs_set_oplock_level(cifsi, 0);
410 	}
411 
412 	spin_unlock(&tcon->open_file_lock);
413 
414 	oplock_break_cancelled = cancel_work_sync(&cifs_file->oplock_break);
415 
416 	if (!tcon->need_reconnect && !cifs_file->invalidHandle) {
417 		struct TCP_Server_Info *server = tcon->ses->server;
418 		unsigned int xid;
419 
420 		xid = get_xid();
421 		if (server->ops->close)
422 			server->ops->close(xid, tcon, &cifs_file->fid);
423 		_free_xid(xid);
424 	}
425 
426 	if (oplock_break_cancelled)
427 		cifs_done_oplock_break(cifsi);
428 
429 	cifs_del_pending_open(&open);
430 
431 	/*
432 	 * Delete any outstanding lock records. We'll lose them when the file
433 	 * is closed anyway.
434 	 */
435 	down_write(&cifsi->lock_sem);
436 	list_for_each_entry_safe(li, tmp, &cifs_file->llist->locks, llist) {
437 		list_del(&li->llist);
438 		cifs_del_lock_waiters(li);
439 		kfree(li);
440 	}
441 	list_del(&cifs_file->llist->llist);
442 	kfree(cifs_file->llist);
443 	up_write(&cifsi->lock_sem);
444 
445 	cifs_put_tlink(cifs_file->tlink);
446 	dput(cifs_file->dentry);
447 	cifs_sb_deactive(sb);
448 	kfree(cifs_file);
449 }
450 
cifs_open(struct inode * inode,struct file * file)451 int cifs_open(struct inode *inode, struct file *file)
452 
453 {
454 	int rc = -EACCES;
455 	unsigned int xid;
456 	__u32 oplock;
457 	struct cifs_sb_info *cifs_sb;
458 	struct TCP_Server_Info *server;
459 	struct cifs_tcon *tcon;
460 	struct tcon_link *tlink;
461 	struct cifsFileInfo *cfile = NULL;
462 	char *full_path = NULL;
463 	bool posix_open_ok = false;
464 	struct cifs_fid fid;
465 	struct cifs_pending_open open;
466 
467 	xid = get_xid();
468 
469 	cifs_sb = CIFS_SB(inode->i_sb);
470 	tlink = cifs_sb_tlink(cifs_sb);
471 	if (IS_ERR(tlink)) {
472 		free_xid(xid);
473 		return PTR_ERR(tlink);
474 	}
475 	tcon = tlink_tcon(tlink);
476 	server = tcon->ses->server;
477 
478 	full_path = build_path_from_dentry(file_dentry(file));
479 	if (full_path == NULL) {
480 		rc = -ENOMEM;
481 		goto out;
482 	}
483 
484 	cifs_dbg(FYI, "inode = 0x%p file flags are 0x%x for %s\n",
485 		 inode, file->f_flags, full_path);
486 
487 	if (file->f_flags & O_DIRECT &&
488 	    cifs_sb->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO) {
489 		if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL)
490 			file->f_op = &cifs_file_direct_nobrl_ops;
491 		else
492 			file->f_op = &cifs_file_direct_ops;
493 	}
494 
495 	if (server->oplocks)
496 		oplock = REQ_OPLOCK;
497 	else
498 		oplock = 0;
499 
500 	if (!tcon->broken_posix_open && tcon->unix_ext &&
501 	    cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &
502 				le64_to_cpu(tcon->fsUnixInfo.Capability))) {
503 		/* can not refresh inode info since size could be stale */
504 		rc = cifs_posix_open(full_path, &inode, inode->i_sb,
505 				cifs_sb->mnt_file_mode /* ignored */,
506 				file->f_flags, &oplock, &fid.netfid, xid);
507 		if (rc == 0) {
508 			cifs_dbg(FYI, "posix open succeeded\n");
509 			posix_open_ok = true;
510 		} else if ((rc == -EINVAL) || (rc == -EOPNOTSUPP)) {
511 			if (tcon->ses->serverNOS)
512 				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",
513 					 tcon->ses->serverName,
514 					 tcon->ses->serverNOS);
515 			tcon->broken_posix_open = true;
516 		} else if ((rc != -EIO) && (rc != -EREMOTE) &&
517 			 (rc != -EOPNOTSUPP)) /* path not found or net err */
518 			goto out;
519 		/*
520 		 * Else fallthrough to retry open the old way on network i/o
521 		 * or DFS errors.
522 		 */
523 	}
524 
525 	if (server->ops->get_lease_key)
526 		server->ops->get_lease_key(inode, &fid);
527 
528 	cifs_add_pending_open(&fid, tlink, &open);
529 
530 	if (!posix_open_ok) {
531 		if (server->ops->get_lease_key)
532 			server->ops->get_lease_key(inode, &fid);
533 
534 		rc = cifs_nt_open(full_path, inode, cifs_sb, tcon,
535 				  file->f_flags, &oplock, &fid, xid);
536 		if (rc) {
537 			cifs_del_pending_open(&open);
538 			goto out;
539 		}
540 	}
541 
542 	cfile = cifs_new_fileinfo(&fid, file, tlink, oplock);
543 	if (cfile == NULL) {
544 		if (server->ops->close)
545 			server->ops->close(xid, tcon, &fid);
546 		cifs_del_pending_open(&open);
547 		rc = -ENOMEM;
548 		goto out;
549 	}
550 
551 	cifs_fscache_set_inode_cookie(inode, file);
552 
553 	if ((oplock & CIFS_CREATE_ACTION) && !posix_open_ok && tcon->unix_ext) {
554 		/*
555 		 * Time to set mode which we can not set earlier due to
556 		 * problems creating new read-only files.
557 		 */
558 		struct cifs_unix_set_info_args args = {
559 			.mode	= inode->i_mode,
560 			.uid	= INVALID_UID, /* no change */
561 			.gid	= INVALID_GID, /* no change */
562 			.ctime	= NO_CHANGE_64,
563 			.atime	= NO_CHANGE_64,
564 			.mtime	= NO_CHANGE_64,
565 			.device	= 0,
566 		};
567 		CIFSSMBUnixSetFileInfo(xid, tcon, &args, fid.netfid,
568 				       cfile->pid);
569 	}
570 
571 out:
572 	kfree(full_path);
573 	free_xid(xid);
574 	cifs_put_tlink(tlink);
575 	return rc;
576 }
577 
578 static int cifs_push_posix_locks(struct cifsFileInfo *cfile);
579 
580 /*
581  * Try to reacquire byte range locks that were released when session
582  * to server was lost.
583  */
584 static int
cifs_relock_file(struct cifsFileInfo * cfile)585 cifs_relock_file(struct cifsFileInfo *cfile)
586 {
587 	struct cifs_sb_info *cifs_sb = CIFS_SB(cfile->dentry->d_sb);
588 	struct cifsInodeInfo *cinode = CIFS_I(d_inode(cfile->dentry));
589 	struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
590 	int rc = 0;
591 
592 	down_read_nested(&cinode->lock_sem, SINGLE_DEPTH_NESTING);
593 	if (cinode->can_cache_brlcks) {
594 		/* can cache locks - no need to relock */
595 		up_read(&cinode->lock_sem);
596 		return rc;
597 	}
598 
599 	if (cap_unix(tcon->ses) &&
600 	    (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) &&
601 	    ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0))
602 		rc = cifs_push_posix_locks(cfile);
603 	else
604 		rc = tcon->ses->server->ops->push_mand_locks(cfile);
605 
606 	up_read(&cinode->lock_sem);
607 	return rc;
608 }
609 
610 static int
cifs_reopen_file(struct cifsFileInfo * cfile,bool can_flush)611 cifs_reopen_file(struct cifsFileInfo *cfile, bool can_flush)
612 {
613 	int rc = -EACCES;
614 	unsigned int xid;
615 	__u32 oplock;
616 	struct cifs_sb_info *cifs_sb;
617 	struct cifs_tcon *tcon;
618 	struct TCP_Server_Info *server;
619 	struct cifsInodeInfo *cinode;
620 	struct inode *inode;
621 	char *full_path = NULL;
622 	int desired_access;
623 	int disposition = FILE_OPEN;
624 	int create_options = CREATE_NOT_DIR;
625 	struct cifs_open_parms oparms;
626 
627 	xid = get_xid();
628 	mutex_lock(&cfile->fh_mutex);
629 	if (!cfile->invalidHandle) {
630 		mutex_unlock(&cfile->fh_mutex);
631 		rc = 0;
632 		free_xid(xid);
633 		return rc;
634 	}
635 
636 	inode = d_inode(cfile->dentry);
637 	cifs_sb = CIFS_SB(inode->i_sb);
638 	tcon = tlink_tcon(cfile->tlink);
639 	server = tcon->ses->server;
640 
641 	/*
642 	 * Can not grab rename sem here because various ops, including those
643 	 * that already have the rename sem can end up causing writepage to get
644 	 * called and if the server was down that means we end up here, and we
645 	 * can never tell if the caller already has the rename_sem.
646 	 */
647 	full_path = build_path_from_dentry(cfile->dentry);
648 	if (full_path == NULL) {
649 		rc = -ENOMEM;
650 		mutex_unlock(&cfile->fh_mutex);
651 		free_xid(xid);
652 		return rc;
653 	}
654 
655 	cifs_dbg(FYI, "inode = 0x%p file flags 0x%x for %s\n",
656 		 inode, cfile->f_flags, full_path);
657 
658 	if (tcon->ses->server->oplocks)
659 		oplock = REQ_OPLOCK;
660 	else
661 		oplock = 0;
662 
663 	if (tcon->unix_ext && cap_unix(tcon->ses) &&
664 	    (CIFS_UNIX_POSIX_PATH_OPS_CAP &
665 				le64_to_cpu(tcon->fsUnixInfo.Capability))) {
666 		/*
667 		 * O_CREAT, O_EXCL and O_TRUNC already had their effect on the
668 		 * original open. Must mask them off for a reopen.
669 		 */
670 		unsigned int oflags = cfile->f_flags &
671 						~(O_CREAT | O_EXCL | O_TRUNC);
672 
673 		rc = cifs_posix_open(full_path, NULL, inode->i_sb,
674 				     cifs_sb->mnt_file_mode /* ignored */,
675 				     oflags, &oplock, &cfile->fid.netfid, xid);
676 		if (rc == 0) {
677 			cifs_dbg(FYI, "posix reopen succeeded\n");
678 			oparms.reconnect = true;
679 			goto reopen_success;
680 		}
681 		/*
682 		 * fallthrough to retry open the old way on errors, especially
683 		 * in the reconnect path it is important to retry hard
684 		 */
685 	}
686 
687 	desired_access = cifs_convert_flags(cfile->f_flags);
688 
689 	if (backup_cred(cifs_sb))
690 		create_options |= CREATE_OPEN_BACKUP_INTENT;
691 
692 	if (server->ops->get_lease_key)
693 		server->ops->get_lease_key(inode, &cfile->fid);
694 
695 	oparms.tcon = tcon;
696 	oparms.cifs_sb = cifs_sb;
697 	oparms.desired_access = desired_access;
698 	oparms.create_options = create_options;
699 	oparms.disposition = disposition;
700 	oparms.path = full_path;
701 	oparms.fid = &cfile->fid;
702 	oparms.reconnect = true;
703 
704 	/*
705 	 * Can not refresh inode by passing in file_info buf to be returned by
706 	 * ops->open and then calling get_inode_info with returned buf since
707 	 * file might have write behind data that needs to be flushed and server
708 	 * version of file size can be stale. If we knew for sure that inode was
709 	 * not dirty locally we could do this.
710 	 */
711 	rc = server->ops->open(xid, &oparms, &oplock, NULL);
712 	if (rc == -ENOENT && oparms.reconnect == false) {
713 		/* durable handle timeout is expired - open the file again */
714 		rc = server->ops->open(xid, &oparms, &oplock, NULL);
715 		/* indicate that we need to relock the file */
716 		oparms.reconnect = true;
717 	}
718 
719 	if (rc) {
720 		mutex_unlock(&cfile->fh_mutex);
721 		cifs_dbg(FYI, "cifs_reopen returned 0x%x\n", rc);
722 		cifs_dbg(FYI, "oplock: %d\n", oplock);
723 		goto reopen_error_exit;
724 	}
725 
726 reopen_success:
727 	cfile->invalidHandle = false;
728 	mutex_unlock(&cfile->fh_mutex);
729 	cinode = CIFS_I(inode);
730 
731 	if (can_flush) {
732 		rc = filemap_write_and_wait(inode->i_mapping);
733 		mapping_set_error(inode->i_mapping, rc);
734 
735 		if (tcon->unix_ext)
736 			rc = cifs_get_inode_info_unix(&inode, full_path,
737 						      inode->i_sb, xid);
738 		else
739 			rc = cifs_get_inode_info(&inode, full_path, NULL,
740 						 inode->i_sb, xid, NULL);
741 	}
742 	/*
743 	 * Else we are writing out data to server already and could deadlock if
744 	 * we tried to flush data, and since we do not know if we have data that
745 	 * would invalidate the current end of file on the server we can not go
746 	 * to the server to get the new inode info.
747 	 */
748 
749 	/*
750 	 * If the server returned a read oplock and we have mandatory brlocks,
751 	 * set oplock level to None.
752 	 */
753 	if (server->ops->is_read_op(oplock) && cifs_has_mand_locks(cinode)) {
754 		cifs_dbg(FYI, "Reset oplock val from read to None due to mand locks\n");
755 		oplock = 0;
756 	}
757 
758 	server->ops->set_fid(cfile, &cfile->fid, oplock);
759 	if (oparms.reconnect)
760 		cifs_relock_file(cfile);
761 
762 reopen_error_exit:
763 	kfree(full_path);
764 	free_xid(xid);
765 	return rc;
766 }
767 
cifs_close(struct inode * inode,struct file * file)768 int cifs_close(struct inode *inode, struct file *file)
769 {
770 	if (file->private_data != NULL) {
771 		cifsFileInfo_put(file->private_data);
772 		file->private_data = NULL;
773 	}
774 
775 	/* return code from the ->release op is always ignored */
776 	return 0;
777 }
778 
779 void
cifs_reopen_persistent_handles(struct cifs_tcon * tcon)780 cifs_reopen_persistent_handles(struct cifs_tcon *tcon)
781 {
782 	struct cifsFileInfo *open_file;
783 	struct list_head *tmp;
784 	struct list_head *tmp1;
785 	struct list_head tmp_list;
786 
787 	if (!tcon->use_persistent || !tcon->need_reopen_files)
788 		return;
789 
790 	tcon->need_reopen_files = false;
791 
792 	cifs_dbg(FYI, "Reopen persistent handles");
793 	INIT_LIST_HEAD(&tmp_list);
794 
795 	/* list all files open on tree connection, reopen resilient handles  */
796 	spin_lock(&tcon->open_file_lock);
797 	list_for_each(tmp, &tcon->openFileList) {
798 		open_file = list_entry(tmp, struct cifsFileInfo, tlist);
799 		if (!open_file->invalidHandle)
800 			continue;
801 		cifsFileInfo_get(open_file);
802 		list_add_tail(&open_file->rlist, &tmp_list);
803 	}
804 	spin_unlock(&tcon->open_file_lock);
805 
806 	list_for_each_safe(tmp, tmp1, &tmp_list) {
807 		open_file = list_entry(tmp, struct cifsFileInfo, rlist);
808 		if (cifs_reopen_file(open_file, false /* do not flush */))
809 			tcon->need_reopen_files = true;
810 		list_del_init(&open_file->rlist);
811 		cifsFileInfo_put(open_file);
812 	}
813 }
814 
cifs_closedir(struct inode * inode,struct file * file)815 int cifs_closedir(struct inode *inode, struct file *file)
816 {
817 	int rc = 0;
818 	unsigned int xid;
819 	struct cifsFileInfo *cfile = file->private_data;
820 	struct cifs_tcon *tcon;
821 	struct TCP_Server_Info *server;
822 	char *buf;
823 
824 	cifs_dbg(FYI, "Closedir inode = 0x%p\n", inode);
825 
826 	if (cfile == NULL)
827 		return rc;
828 
829 	xid = get_xid();
830 	tcon = tlink_tcon(cfile->tlink);
831 	server = tcon->ses->server;
832 
833 	cifs_dbg(FYI, "Freeing private data in close dir\n");
834 	spin_lock(&cfile->file_info_lock);
835 	if (server->ops->dir_needs_close(cfile)) {
836 		cfile->invalidHandle = true;
837 		spin_unlock(&cfile->file_info_lock);
838 		if (server->ops->close_dir)
839 			rc = server->ops->close_dir(xid, tcon, &cfile->fid);
840 		else
841 			rc = -ENOSYS;
842 		cifs_dbg(FYI, "Closing uncompleted readdir with rc %d\n", rc);
843 		/* not much we can do if it fails anyway, ignore rc */
844 		rc = 0;
845 	} else
846 		spin_unlock(&cfile->file_info_lock);
847 
848 	buf = cfile->srch_inf.ntwrk_buf_start;
849 	if (buf) {
850 		cifs_dbg(FYI, "closedir free smb buf in srch struct\n");
851 		cfile->srch_inf.ntwrk_buf_start = NULL;
852 		if (cfile->srch_inf.smallBuf)
853 			cifs_small_buf_release(buf);
854 		else
855 			cifs_buf_release(buf);
856 	}
857 
858 	cifs_put_tlink(cfile->tlink);
859 	kfree(file->private_data);
860 	file->private_data = NULL;
861 	/* BB can we lock the filestruct while this is going on? */
862 	free_xid(xid);
863 	return rc;
864 }
865 
866 static struct cifsLockInfo *
cifs_lock_init(__u64 offset,__u64 length,__u8 type)867 cifs_lock_init(__u64 offset, __u64 length, __u8 type)
868 {
869 	struct cifsLockInfo *lock =
870 		kmalloc(sizeof(struct cifsLockInfo), GFP_KERNEL);
871 	if (!lock)
872 		return lock;
873 	lock->offset = offset;
874 	lock->length = length;
875 	lock->type = type;
876 	lock->pid = current->tgid;
877 	INIT_LIST_HEAD(&lock->blist);
878 	init_waitqueue_head(&lock->block_q);
879 	return lock;
880 }
881 
882 void
cifs_del_lock_waiters(struct cifsLockInfo * lock)883 cifs_del_lock_waiters(struct cifsLockInfo *lock)
884 {
885 	struct cifsLockInfo *li, *tmp;
886 	list_for_each_entry_safe(li, tmp, &lock->blist, blist) {
887 		list_del_init(&li->blist);
888 		wake_up(&li->block_q);
889 	}
890 }
891 
892 #define CIFS_LOCK_OP	0
893 #define CIFS_READ_OP	1
894 #define CIFS_WRITE_OP	2
895 
896 /* @rw_check : 0 - no op, 1 - read, 2 - write */
897 static bool
cifs_find_fid_lock_conflict(struct cifs_fid_locks * fdlocks,__u64 offset,__u64 length,__u8 type,struct cifsFileInfo * cfile,struct cifsLockInfo ** conf_lock,int rw_check)898 cifs_find_fid_lock_conflict(struct cifs_fid_locks *fdlocks, __u64 offset,
899 			    __u64 length, __u8 type, struct cifsFileInfo *cfile,
900 			    struct cifsLockInfo **conf_lock, int rw_check)
901 {
902 	struct cifsLockInfo *li;
903 	struct cifsFileInfo *cur_cfile = fdlocks->cfile;
904 	struct TCP_Server_Info *server = tlink_tcon(cfile->tlink)->ses->server;
905 
906 	list_for_each_entry(li, &fdlocks->locks, llist) {
907 		if (offset + length <= li->offset ||
908 		    offset >= li->offset + li->length)
909 			continue;
910 		if (rw_check != CIFS_LOCK_OP && current->tgid == li->pid &&
911 		    server->ops->compare_fids(cfile, cur_cfile)) {
912 			/* shared lock prevents write op through the same fid */
913 			if (!(li->type & server->vals->shared_lock_type) ||
914 			    rw_check != CIFS_WRITE_OP)
915 				continue;
916 		}
917 		if ((type & server->vals->shared_lock_type) &&
918 		    ((server->ops->compare_fids(cfile, cur_cfile) &&
919 		     current->tgid == li->pid) || type == li->type))
920 			continue;
921 		if (conf_lock)
922 			*conf_lock = li;
923 		return true;
924 	}
925 	return false;
926 }
927 
928 bool
cifs_find_lock_conflict(struct cifsFileInfo * cfile,__u64 offset,__u64 length,__u8 type,struct cifsLockInfo ** conf_lock,int rw_check)929 cifs_find_lock_conflict(struct cifsFileInfo *cfile, __u64 offset, __u64 length,
930 			__u8 type, struct cifsLockInfo **conf_lock,
931 			int rw_check)
932 {
933 	bool rc = false;
934 	struct cifs_fid_locks *cur;
935 	struct cifsInodeInfo *cinode = CIFS_I(d_inode(cfile->dentry));
936 
937 	list_for_each_entry(cur, &cinode->llist, llist) {
938 		rc = cifs_find_fid_lock_conflict(cur, offset, length, type,
939 						 cfile, conf_lock, rw_check);
940 		if (rc)
941 			break;
942 	}
943 
944 	return rc;
945 }
946 
947 /*
948  * Check if there is another lock that prevents us to set the lock (mandatory
949  * style). If such a lock exists, update the flock structure with its
950  * properties. Otherwise, set the flock type to F_UNLCK if we can cache brlocks
951  * or leave it the same if we can't. Returns 0 if we don't need to request to
952  * the server or 1 otherwise.
953  */
954 static int
cifs_lock_test(struct cifsFileInfo * cfile,__u64 offset,__u64 length,__u8 type,struct file_lock * flock)955 cifs_lock_test(struct cifsFileInfo *cfile, __u64 offset, __u64 length,
956 	       __u8 type, struct file_lock *flock)
957 {
958 	int rc = 0;
959 	struct cifsLockInfo *conf_lock;
960 	struct cifsInodeInfo *cinode = CIFS_I(d_inode(cfile->dentry));
961 	struct TCP_Server_Info *server = tlink_tcon(cfile->tlink)->ses->server;
962 	bool exist;
963 
964 	down_read(&cinode->lock_sem);
965 
966 	exist = cifs_find_lock_conflict(cfile, offset, length, type,
967 					&conf_lock, CIFS_LOCK_OP);
968 	if (exist) {
969 		flock->fl_start = conf_lock->offset;
970 		flock->fl_end = conf_lock->offset + conf_lock->length - 1;
971 		flock->fl_pid = conf_lock->pid;
972 		if (conf_lock->type & server->vals->shared_lock_type)
973 			flock->fl_type = F_RDLCK;
974 		else
975 			flock->fl_type = F_WRLCK;
976 	} else if (!cinode->can_cache_brlcks)
977 		rc = 1;
978 	else
979 		flock->fl_type = F_UNLCK;
980 
981 	up_read(&cinode->lock_sem);
982 	return rc;
983 }
984 
985 static void
cifs_lock_add(struct cifsFileInfo * cfile,struct cifsLockInfo * lock)986 cifs_lock_add(struct cifsFileInfo *cfile, struct cifsLockInfo *lock)
987 {
988 	struct cifsInodeInfo *cinode = CIFS_I(d_inode(cfile->dentry));
989 	down_write(&cinode->lock_sem);
990 	list_add_tail(&lock->llist, &cfile->llist->locks);
991 	up_write(&cinode->lock_sem);
992 }
993 
994 /*
995  * Set the byte-range lock (mandatory style). Returns:
996  * 1) 0, if we set the lock and don't need to request to the server;
997  * 2) 1, if no locks prevent us but we need to request to the server;
998  * 3) -EACCESS, if there is a lock that prevents us and wait is false.
999  */
1000 static int
cifs_lock_add_if(struct cifsFileInfo * cfile,struct cifsLockInfo * lock,bool wait)1001 cifs_lock_add_if(struct cifsFileInfo *cfile, struct cifsLockInfo *lock,
1002 		 bool wait)
1003 {
1004 	struct cifsLockInfo *conf_lock;
1005 	struct cifsInodeInfo *cinode = CIFS_I(d_inode(cfile->dentry));
1006 	bool exist;
1007 	int rc = 0;
1008 
1009 try_again:
1010 	exist = false;
1011 	down_write(&cinode->lock_sem);
1012 
1013 	exist = cifs_find_lock_conflict(cfile, lock->offset, lock->length,
1014 					lock->type, &conf_lock, CIFS_LOCK_OP);
1015 	if (!exist && cinode->can_cache_brlcks) {
1016 		list_add_tail(&lock->llist, &cfile->llist->locks);
1017 		up_write(&cinode->lock_sem);
1018 		return rc;
1019 	}
1020 
1021 	if (!exist)
1022 		rc = 1;
1023 	else if (!wait)
1024 		rc = -EACCES;
1025 	else {
1026 		list_add_tail(&lock->blist, &conf_lock->blist);
1027 		up_write(&cinode->lock_sem);
1028 		rc = wait_event_interruptible(lock->block_q,
1029 					(lock->blist.prev == &lock->blist) &&
1030 					(lock->blist.next == &lock->blist));
1031 		if (!rc)
1032 			goto try_again;
1033 		down_write(&cinode->lock_sem);
1034 		list_del_init(&lock->blist);
1035 	}
1036 
1037 	up_write(&cinode->lock_sem);
1038 	return rc;
1039 }
1040 
1041 /*
1042  * Check if there is another lock that prevents us to set the lock (posix
1043  * style). If such a lock exists, update the flock structure with its
1044  * properties. Otherwise, set the flock type to F_UNLCK if we can cache brlocks
1045  * or leave it the same if we can't. Returns 0 if we don't need to request to
1046  * the server or 1 otherwise.
1047  */
1048 static int
cifs_posix_lock_test(struct file * file,struct file_lock * flock)1049 cifs_posix_lock_test(struct file *file, struct file_lock *flock)
1050 {
1051 	int rc = 0;
1052 	struct cifsInodeInfo *cinode = CIFS_I(file_inode(file));
1053 	unsigned char saved_type = flock->fl_type;
1054 
1055 	if ((flock->fl_flags & FL_POSIX) == 0)
1056 		return 1;
1057 
1058 	down_read(&cinode->lock_sem);
1059 	posix_test_lock(file, flock);
1060 
1061 	if (flock->fl_type == F_UNLCK && !cinode->can_cache_brlcks) {
1062 		flock->fl_type = saved_type;
1063 		rc = 1;
1064 	}
1065 
1066 	up_read(&cinode->lock_sem);
1067 	return rc;
1068 }
1069 
1070 /*
1071  * Set the byte-range lock (posix style). Returns:
1072  * 1) 0, if we set the lock and don't need to request to the server;
1073  * 2) 1, if we need to request to the server;
1074  * 3) <0, if the error occurs while setting the lock.
1075  */
1076 static int
cifs_posix_lock_set(struct file * file,struct file_lock * flock)1077 cifs_posix_lock_set(struct file *file, struct file_lock *flock)
1078 {
1079 	struct cifsInodeInfo *cinode = CIFS_I(file_inode(file));
1080 	int rc = 1;
1081 
1082 	if ((flock->fl_flags & FL_POSIX) == 0)
1083 		return rc;
1084 
1085 try_again:
1086 	down_write(&cinode->lock_sem);
1087 	if (!cinode->can_cache_brlcks) {
1088 		up_write(&cinode->lock_sem);
1089 		return rc;
1090 	}
1091 
1092 	rc = posix_lock_file(file, flock, NULL);
1093 	up_write(&cinode->lock_sem);
1094 	if (rc == FILE_LOCK_DEFERRED) {
1095 		rc = wait_event_interruptible(flock->fl_wait, !flock->fl_next);
1096 		if (!rc)
1097 			goto try_again;
1098 		posix_unblock_lock(flock);
1099 	}
1100 	return rc;
1101 }
1102 
1103 int
cifs_push_mandatory_locks(struct cifsFileInfo * cfile)1104 cifs_push_mandatory_locks(struct cifsFileInfo *cfile)
1105 {
1106 	unsigned int xid;
1107 	int rc = 0, stored_rc;
1108 	struct cifsLockInfo *li, *tmp;
1109 	struct cifs_tcon *tcon;
1110 	unsigned int num, max_num, max_buf;
1111 	LOCKING_ANDX_RANGE *buf, *cur;
1112 	int types[] = {LOCKING_ANDX_LARGE_FILES,
1113 		       LOCKING_ANDX_SHARED_LOCK | LOCKING_ANDX_LARGE_FILES};
1114 	int i;
1115 
1116 	xid = get_xid();
1117 	tcon = tlink_tcon(cfile->tlink);
1118 
1119 	/*
1120 	 * Accessing maxBuf is racy with cifs_reconnect - need to store value
1121 	 * and check it for zero before using.
1122 	 */
1123 	max_buf = tcon->ses->server->maxBuf;
1124 	if (!max_buf) {
1125 		free_xid(xid);
1126 		return -EINVAL;
1127 	}
1128 
1129 	max_num = (max_buf - sizeof(struct smb_hdr)) /
1130 						sizeof(LOCKING_ANDX_RANGE);
1131 	buf = kcalloc(max_num, sizeof(LOCKING_ANDX_RANGE), GFP_KERNEL);
1132 	if (!buf) {
1133 		free_xid(xid);
1134 		return -ENOMEM;
1135 	}
1136 
1137 	for (i = 0; i < 2; i++) {
1138 		cur = buf;
1139 		num = 0;
1140 		list_for_each_entry_safe(li, tmp, &cfile->llist->locks, llist) {
1141 			if (li->type != types[i])
1142 				continue;
1143 			cur->Pid = cpu_to_le16(li->pid);
1144 			cur->LengthLow = cpu_to_le32((u32)li->length);
1145 			cur->LengthHigh = cpu_to_le32((u32)(li->length>>32));
1146 			cur->OffsetLow = cpu_to_le32((u32)li->offset);
1147 			cur->OffsetHigh = cpu_to_le32((u32)(li->offset>>32));
1148 			if (++num == max_num) {
1149 				stored_rc = cifs_lockv(xid, tcon,
1150 						       cfile->fid.netfid,
1151 						       (__u8)li->type, 0, num,
1152 						       buf);
1153 				if (stored_rc)
1154 					rc = stored_rc;
1155 				cur = buf;
1156 				num = 0;
1157 			} else
1158 				cur++;
1159 		}
1160 
1161 		if (num) {
1162 			stored_rc = cifs_lockv(xid, tcon, cfile->fid.netfid,
1163 					       (__u8)types[i], 0, num, buf);
1164 			if (stored_rc)
1165 				rc = stored_rc;
1166 		}
1167 	}
1168 
1169 	kfree(buf);
1170 	free_xid(xid);
1171 	return rc;
1172 }
1173 
1174 static __u32
hash_lockowner(fl_owner_t owner)1175 hash_lockowner(fl_owner_t owner)
1176 {
1177 	return cifs_lock_secret ^ hash32_ptr((const void *)owner);
1178 }
1179 
1180 struct lock_to_push {
1181 	struct list_head llist;
1182 	__u64 offset;
1183 	__u64 length;
1184 	__u32 pid;
1185 	__u16 netfid;
1186 	__u8 type;
1187 };
1188 
1189 static int
cifs_push_posix_locks(struct cifsFileInfo * cfile)1190 cifs_push_posix_locks(struct cifsFileInfo *cfile)
1191 {
1192 	struct inode *inode = d_inode(cfile->dentry);
1193 	struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
1194 	struct file_lock *flock;
1195 	struct file_lock_context *flctx = inode->i_flctx;
1196 	unsigned int count = 0, i;
1197 	int rc = 0, xid, type;
1198 	struct list_head locks_to_send, *el;
1199 	struct lock_to_push *lck, *tmp;
1200 	__u64 length;
1201 
1202 	xid = get_xid();
1203 
1204 	if (!flctx)
1205 		goto out;
1206 
1207 	spin_lock(&flctx->flc_lock);
1208 	list_for_each(el, &flctx->flc_posix) {
1209 		count++;
1210 	}
1211 	spin_unlock(&flctx->flc_lock);
1212 
1213 	INIT_LIST_HEAD(&locks_to_send);
1214 
1215 	/*
1216 	 * Allocating count locks is enough because no FL_POSIX locks can be
1217 	 * added to the list while we are holding cinode->lock_sem that
1218 	 * protects locking operations of this inode.
1219 	 */
1220 	for (i = 0; i < count; i++) {
1221 		lck = kmalloc(sizeof(struct lock_to_push), GFP_KERNEL);
1222 		if (!lck) {
1223 			rc = -ENOMEM;
1224 			goto err_out;
1225 		}
1226 		list_add_tail(&lck->llist, &locks_to_send);
1227 	}
1228 
1229 	el = locks_to_send.next;
1230 	spin_lock(&flctx->flc_lock);
1231 	list_for_each_entry(flock, &flctx->flc_posix, fl_list) {
1232 		if (el == &locks_to_send) {
1233 			/*
1234 			 * The list ended. We don't have enough allocated
1235 			 * structures - something is really wrong.
1236 			 */
1237 			cifs_dbg(VFS, "Can't push all brlocks!\n");
1238 			break;
1239 		}
1240 		length = 1 + flock->fl_end - flock->fl_start;
1241 		if (flock->fl_type == F_RDLCK || flock->fl_type == F_SHLCK)
1242 			type = CIFS_RDLCK;
1243 		else
1244 			type = CIFS_WRLCK;
1245 		lck = list_entry(el, struct lock_to_push, llist);
1246 		lck->pid = hash_lockowner(flock->fl_owner);
1247 		lck->netfid = cfile->fid.netfid;
1248 		lck->length = length;
1249 		lck->type = type;
1250 		lck->offset = flock->fl_start;
1251 	}
1252 	spin_unlock(&flctx->flc_lock);
1253 
1254 	list_for_each_entry_safe(lck, tmp, &locks_to_send, llist) {
1255 		int stored_rc;
1256 
1257 		stored_rc = CIFSSMBPosixLock(xid, tcon, lck->netfid, lck->pid,
1258 					     lck->offset, lck->length, NULL,
1259 					     lck->type, 0);
1260 		if (stored_rc)
1261 			rc = stored_rc;
1262 		list_del(&lck->llist);
1263 		kfree(lck);
1264 	}
1265 
1266 out:
1267 	free_xid(xid);
1268 	return rc;
1269 err_out:
1270 	list_for_each_entry_safe(lck, tmp, &locks_to_send, llist) {
1271 		list_del(&lck->llist);
1272 		kfree(lck);
1273 	}
1274 	goto out;
1275 }
1276 
1277 static int
cifs_push_locks(struct cifsFileInfo * cfile)1278 cifs_push_locks(struct cifsFileInfo *cfile)
1279 {
1280 	struct cifs_sb_info *cifs_sb = CIFS_SB(cfile->dentry->d_sb);
1281 	struct cifsInodeInfo *cinode = CIFS_I(d_inode(cfile->dentry));
1282 	struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
1283 	int rc = 0;
1284 
1285 	/* we are going to update can_cache_brlcks here - need a write access */
1286 	down_write(&cinode->lock_sem);
1287 	if (!cinode->can_cache_brlcks) {
1288 		up_write(&cinode->lock_sem);
1289 		return rc;
1290 	}
1291 
1292 	if (cap_unix(tcon->ses) &&
1293 	    (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) &&
1294 	    ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0))
1295 		rc = cifs_push_posix_locks(cfile);
1296 	else
1297 		rc = tcon->ses->server->ops->push_mand_locks(cfile);
1298 
1299 	cinode->can_cache_brlcks = false;
1300 	up_write(&cinode->lock_sem);
1301 	return rc;
1302 }
1303 
1304 static void
cifs_read_flock(struct file_lock * flock,__u32 * type,int * lock,int * unlock,bool * wait_flag,struct TCP_Server_Info * server)1305 cifs_read_flock(struct file_lock *flock, __u32 *type, int *lock, int *unlock,
1306 		bool *wait_flag, struct TCP_Server_Info *server)
1307 {
1308 	if (flock->fl_flags & FL_POSIX)
1309 		cifs_dbg(FYI, "Posix\n");
1310 	if (flock->fl_flags & FL_FLOCK)
1311 		cifs_dbg(FYI, "Flock\n");
1312 	if (flock->fl_flags & FL_SLEEP) {
1313 		cifs_dbg(FYI, "Blocking lock\n");
1314 		*wait_flag = true;
1315 	}
1316 	if (flock->fl_flags & FL_ACCESS)
1317 		cifs_dbg(FYI, "Process suspended by mandatory locking - not implemented yet\n");
1318 	if (flock->fl_flags & FL_LEASE)
1319 		cifs_dbg(FYI, "Lease on file - not implemented yet\n");
1320 	if (flock->fl_flags &
1321 	    (~(FL_POSIX | FL_FLOCK | FL_SLEEP |
1322 	       FL_ACCESS | FL_LEASE | FL_CLOSE)))
1323 		cifs_dbg(FYI, "Unknown lock flags 0x%x\n", flock->fl_flags);
1324 
1325 	*type = server->vals->large_lock_type;
1326 	if (flock->fl_type == F_WRLCK) {
1327 		cifs_dbg(FYI, "F_WRLCK\n");
1328 		*type |= server->vals->exclusive_lock_type;
1329 		*lock = 1;
1330 	} else if (flock->fl_type == F_UNLCK) {
1331 		cifs_dbg(FYI, "F_UNLCK\n");
1332 		*type |= server->vals->unlock_lock_type;
1333 		*unlock = 1;
1334 		/* Check if unlock includes more than one lock range */
1335 	} else if (flock->fl_type == F_RDLCK) {
1336 		cifs_dbg(FYI, "F_RDLCK\n");
1337 		*type |= server->vals->shared_lock_type;
1338 		*lock = 1;
1339 	} else if (flock->fl_type == F_EXLCK) {
1340 		cifs_dbg(FYI, "F_EXLCK\n");
1341 		*type |= server->vals->exclusive_lock_type;
1342 		*lock = 1;
1343 	} else if (flock->fl_type == F_SHLCK) {
1344 		cifs_dbg(FYI, "F_SHLCK\n");
1345 		*type |= server->vals->shared_lock_type;
1346 		*lock = 1;
1347 	} else
1348 		cifs_dbg(FYI, "Unknown type of lock\n");
1349 }
1350 
1351 static int
cifs_getlk(struct file * file,struct file_lock * flock,__u32 type,bool wait_flag,bool posix_lck,unsigned int xid)1352 cifs_getlk(struct file *file, struct file_lock *flock, __u32 type,
1353 	   bool wait_flag, bool posix_lck, unsigned int xid)
1354 {
1355 	int rc = 0;
1356 	__u64 length = 1 + flock->fl_end - flock->fl_start;
1357 	struct cifsFileInfo *cfile = (struct cifsFileInfo *)file->private_data;
1358 	struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
1359 	struct TCP_Server_Info *server = tcon->ses->server;
1360 	__u16 netfid = cfile->fid.netfid;
1361 
1362 	if (posix_lck) {
1363 		int posix_lock_type;
1364 
1365 		rc = cifs_posix_lock_test(file, flock);
1366 		if (!rc)
1367 			return rc;
1368 
1369 		if (type & server->vals->shared_lock_type)
1370 			posix_lock_type = CIFS_RDLCK;
1371 		else
1372 			posix_lock_type = CIFS_WRLCK;
1373 		rc = CIFSSMBPosixLock(xid, tcon, netfid,
1374 				      hash_lockowner(flock->fl_owner),
1375 				      flock->fl_start, length, flock,
1376 				      posix_lock_type, wait_flag);
1377 		return rc;
1378 	}
1379 
1380 	rc = cifs_lock_test(cfile, flock->fl_start, length, type, flock);
1381 	if (!rc)
1382 		return rc;
1383 
1384 	/* BB we could chain these into one lock request BB */
1385 	rc = server->ops->mand_lock(xid, cfile, flock->fl_start, length, type,
1386 				    1, 0, false);
1387 	if (rc == 0) {
1388 		rc = server->ops->mand_lock(xid, cfile, flock->fl_start, length,
1389 					    type, 0, 1, false);
1390 		flock->fl_type = F_UNLCK;
1391 		if (rc != 0)
1392 			cifs_dbg(VFS, "Error unlocking previously locked range %d during test of lock\n",
1393 				 rc);
1394 		return 0;
1395 	}
1396 
1397 	if (type & server->vals->shared_lock_type) {
1398 		flock->fl_type = F_WRLCK;
1399 		return 0;
1400 	}
1401 
1402 	type &= ~server->vals->exclusive_lock_type;
1403 
1404 	rc = server->ops->mand_lock(xid, cfile, flock->fl_start, length,
1405 				    type | server->vals->shared_lock_type,
1406 				    1, 0, false);
1407 	if (rc == 0) {
1408 		rc = server->ops->mand_lock(xid, cfile, flock->fl_start, length,
1409 			type | server->vals->shared_lock_type, 0, 1, false);
1410 		flock->fl_type = F_RDLCK;
1411 		if (rc != 0)
1412 			cifs_dbg(VFS, "Error unlocking previously locked range %d during test of lock\n",
1413 				 rc);
1414 	} else
1415 		flock->fl_type = F_WRLCK;
1416 
1417 	return 0;
1418 }
1419 
1420 void
cifs_move_llist(struct list_head * source,struct list_head * dest)1421 cifs_move_llist(struct list_head *source, struct list_head *dest)
1422 {
1423 	struct list_head *li, *tmp;
1424 	list_for_each_safe(li, tmp, source)
1425 		list_move(li, dest);
1426 }
1427 
1428 void
cifs_free_llist(struct list_head * llist)1429 cifs_free_llist(struct list_head *llist)
1430 {
1431 	struct cifsLockInfo *li, *tmp;
1432 	list_for_each_entry_safe(li, tmp, llist, llist) {
1433 		cifs_del_lock_waiters(li);
1434 		list_del(&li->llist);
1435 		kfree(li);
1436 	}
1437 }
1438 
1439 int
cifs_unlock_range(struct cifsFileInfo * cfile,struct file_lock * flock,unsigned int xid)1440 cifs_unlock_range(struct cifsFileInfo *cfile, struct file_lock *flock,
1441 		  unsigned int xid)
1442 {
1443 	int rc = 0, stored_rc;
1444 	int types[] = {LOCKING_ANDX_LARGE_FILES,
1445 		       LOCKING_ANDX_SHARED_LOCK | LOCKING_ANDX_LARGE_FILES};
1446 	unsigned int i;
1447 	unsigned int max_num, num, max_buf;
1448 	LOCKING_ANDX_RANGE *buf, *cur;
1449 	struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
1450 	struct cifsInodeInfo *cinode = CIFS_I(d_inode(cfile->dentry));
1451 	struct cifsLockInfo *li, *tmp;
1452 	__u64 length = 1 + flock->fl_end - flock->fl_start;
1453 	struct list_head tmp_llist;
1454 
1455 	INIT_LIST_HEAD(&tmp_llist);
1456 
1457 	/*
1458 	 * Accessing maxBuf is racy with cifs_reconnect - need to store value
1459 	 * and check it for zero before using.
1460 	 */
1461 	max_buf = tcon->ses->server->maxBuf;
1462 	if (!max_buf)
1463 		return -EINVAL;
1464 
1465 	max_num = (max_buf - sizeof(struct smb_hdr)) /
1466 						sizeof(LOCKING_ANDX_RANGE);
1467 	buf = kcalloc(max_num, sizeof(LOCKING_ANDX_RANGE), GFP_KERNEL);
1468 	if (!buf)
1469 		return -ENOMEM;
1470 
1471 	down_write(&cinode->lock_sem);
1472 	for (i = 0; i < 2; i++) {
1473 		cur = buf;
1474 		num = 0;
1475 		list_for_each_entry_safe(li, tmp, &cfile->llist->locks, llist) {
1476 			if (flock->fl_start > li->offset ||
1477 			    (flock->fl_start + length) <
1478 			    (li->offset + li->length))
1479 				continue;
1480 			if (current->tgid != li->pid)
1481 				continue;
1482 			if (types[i] != li->type)
1483 				continue;
1484 			if (cinode->can_cache_brlcks) {
1485 				/*
1486 				 * We can cache brlock requests - simply remove
1487 				 * a lock from the file's list.
1488 				 */
1489 				list_del(&li->llist);
1490 				cifs_del_lock_waiters(li);
1491 				kfree(li);
1492 				continue;
1493 			}
1494 			cur->Pid = cpu_to_le16(li->pid);
1495 			cur->LengthLow = cpu_to_le32((u32)li->length);
1496 			cur->LengthHigh = cpu_to_le32((u32)(li->length>>32));
1497 			cur->OffsetLow = cpu_to_le32((u32)li->offset);
1498 			cur->OffsetHigh = cpu_to_le32((u32)(li->offset>>32));
1499 			/*
1500 			 * We need to save a lock here to let us add it again to
1501 			 * the file's list if the unlock range request fails on
1502 			 * the server.
1503 			 */
1504 			list_move(&li->llist, &tmp_llist);
1505 			if (++num == max_num) {
1506 				stored_rc = cifs_lockv(xid, tcon,
1507 						       cfile->fid.netfid,
1508 						       li->type, num, 0, buf);
1509 				if (stored_rc) {
1510 					/*
1511 					 * We failed on the unlock range
1512 					 * request - add all locks from the tmp
1513 					 * list to the head of the file's list.
1514 					 */
1515 					cifs_move_llist(&tmp_llist,
1516 							&cfile->llist->locks);
1517 					rc = stored_rc;
1518 				} else
1519 					/*
1520 					 * The unlock range request succeed -
1521 					 * free the tmp list.
1522 					 */
1523 					cifs_free_llist(&tmp_llist);
1524 				cur = buf;
1525 				num = 0;
1526 			} else
1527 				cur++;
1528 		}
1529 		if (num) {
1530 			stored_rc = cifs_lockv(xid, tcon, cfile->fid.netfid,
1531 					       types[i], num, 0, buf);
1532 			if (stored_rc) {
1533 				cifs_move_llist(&tmp_llist,
1534 						&cfile->llist->locks);
1535 				rc = stored_rc;
1536 			} else
1537 				cifs_free_llist(&tmp_llist);
1538 		}
1539 	}
1540 
1541 	up_write(&cinode->lock_sem);
1542 	kfree(buf);
1543 	return rc;
1544 }
1545 
1546 static int
cifs_setlk(struct file * file,struct file_lock * flock,__u32 type,bool wait_flag,bool posix_lck,int lock,int unlock,unsigned int xid)1547 cifs_setlk(struct file *file, struct file_lock *flock, __u32 type,
1548 	   bool wait_flag, bool posix_lck, int lock, int unlock,
1549 	   unsigned int xid)
1550 {
1551 	int rc = 0;
1552 	__u64 length = 1 + flock->fl_end - flock->fl_start;
1553 	struct cifsFileInfo *cfile = (struct cifsFileInfo *)file->private_data;
1554 	struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
1555 	struct TCP_Server_Info *server = tcon->ses->server;
1556 	struct inode *inode = d_inode(cfile->dentry);
1557 
1558 	if (posix_lck) {
1559 		int posix_lock_type;
1560 
1561 		rc = cifs_posix_lock_set(file, flock);
1562 		if (!rc || rc < 0)
1563 			return rc;
1564 
1565 		if (type & server->vals->shared_lock_type)
1566 			posix_lock_type = CIFS_RDLCK;
1567 		else
1568 			posix_lock_type = CIFS_WRLCK;
1569 
1570 		if (unlock == 1)
1571 			posix_lock_type = CIFS_UNLCK;
1572 
1573 		rc = CIFSSMBPosixLock(xid, tcon, cfile->fid.netfid,
1574 				      hash_lockowner(flock->fl_owner),
1575 				      flock->fl_start, length,
1576 				      NULL, posix_lock_type, wait_flag);
1577 		goto out;
1578 	}
1579 
1580 	if (lock) {
1581 		struct cifsLockInfo *lock;
1582 
1583 		lock = cifs_lock_init(flock->fl_start, length, type);
1584 		if (!lock)
1585 			return -ENOMEM;
1586 
1587 		rc = cifs_lock_add_if(cfile, lock, wait_flag);
1588 		if (rc < 0) {
1589 			kfree(lock);
1590 			return rc;
1591 		}
1592 		if (!rc)
1593 			goto out;
1594 
1595 		/*
1596 		 * Windows 7 server can delay breaking lease from read to None
1597 		 * if we set a byte-range lock on a file - break it explicitly
1598 		 * before sending the lock to the server to be sure the next
1599 		 * read won't conflict with non-overlapted locks due to
1600 		 * pagereading.
1601 		 */
1602 		if (!CIFS_CACHE_WRITE(CIFS_I(inode)) &&
1603 					CIFS_CACHE_READ(CIFS_I(inode))) {
1604 			cifs_zap_mapping(inode);
1605 			cifs_dbg(FYI, "Set no oplock for inode=%p due to mand locks\n",
1606 				 inode);
1607 			CIFS_I(inode)->oplock = 0;
1608 		}
1609 
1610 		rc = server->ops->mand_lock(xid, cfile, flock->fl_start, length,
1611 					    type, 1, 0, wait_flag);
1612 		if (rc) {
1613 			kfree(lock);
1614 			return rc;
1615 		}
1616 
1617 		cifs_lock_add(cfile, lock);
1618 	} else if (unlock)
1619 		rc = server->ops->mand_unlock_range(cfile, flock, xid);
1620 
1621 out:
1622 	if (flock->fl_flags & FL_POSIX && !rc)
1623 		rc = locks_lock_file_wait(file, flock);
1624 	return rc;
1625 }
1626 
cifs_lock(struct file * file,int cmd,struct file_lock * flock)1627 int cifs_lock(struct file *file, int cmd, struct file_lock *flock)
1628 {
1629 	int rc, xid;
1630 	int lock = 0, unlock = 0;
1631 	bool wait_flag = false;
1632 	bool posix_lck = false;
1633 	struct cifs_sb_info *cifs_sb;
1634 	struct cifs_tcon *tcon;
1635 	struct cifsInodeInfo *cinode;
1636 	struct cifsFileInfo *cfile;
1637 	__u16 netfid;
1638 	__u32 type;
1639 
1640 	rc = -EACCES;
1641 	xid = get_xid();
1642 
1643 	cifs_dbg(FYI, "Lock parm: 0x%x flockflags: 0x%x flocktype: 0x%x start: %lld end: %lld\n",
1644 		 cmd, flock->fl_flags, flock->fl_type,
1645 		 flock->fl_start, flock->fl_end);
1646 
1647 	cfile = (struct cifsFileInfo *)file->private_data;
1648 	tcon = tlink_tcon(cfile->tlink);
1649 
1650 	cifs_read_flock(flock, &type, &lock, &unlock, &wait_flag,
1651 			tcon->ses->server);
1652 
1653 	cifs_sb = CIFS_FILE_SB(file);
1654 	netfid = cfile->fid.netfid;
1655 	cinode = CIFS_I(file_inode(file));
1656 
1657 	if (cap_unix(tcon->ses) &&
1658 	    (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) &&
1659 	    ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0))
1660 		posix_lck = true;
1661 	/*
1662 	 * BB add code here to normalize offset and length to account for
1663 	 * negative length which we can not accept over the wire.
1664 	 */
1665 	if (IS_GETLK(cmd)) {
1666 		rc = cifs_getlk(file, flock, type, wait_flag, posix_lck, xid);
1667 		free_xid(xid);
1668 		return rc;
1669 	}
1670 
1671 	if (!lock && !unlock) {
1672 		/*
1673 		 * if no lock or unlock then nothing to do since we do not
1674 		 * know what it is
1675 		 */
1676 		free_xid(xid);
1677 		return -EOPNOTSUPP;
1678 	}
1679 
1680 	rc = cifs_setlk(file, flock, type, wait_flag, posix_lck, lock, unlock,
1681 			xid);
1682 	free_xid(xid);
1683 	return rc;
1684 }
1685 
1686 /*
1687  * update the file size (if needed) after a write. Should be called with
1688  * the inode->i_lock held
1689  */
1690 void
cifs_update_eof(struct cifsInodeInfo * cifsi,loff_t offset,unsigned int bytes_written)1691 cifs_update_eof(struct cifsInodeInfo *cifsi, loff_t offset,
1692 		      unsigned int bytes_written)
1693 {
1694 	loff_t end_of_write = offset + bytes_written;
1695 
1696 	if (end_of_write > cifsi->server_eof)
1697 		cifsi->server_eof = end_of_write;
1698 }
1699 
1700 static ssize_t
cifs_write(struct cifsFileInfo * open_file,__u32 pid,const char * write_data,size_t write_size,loff_t * offset)1701 cifs_write(struct cifsFileInfo *open_file, __u32 pid, const char *write_data,
1702 	   size_t write_size, loff_t *offset)
1703 {
1704 	int rc = 0;
1705 	unsigned int bytes_written = 0;
1706 	unsigned int total_written;
1707 	struct cifs_sb_info *cifs_sb;
1708 	struct cifs_tcon *tcon;
1709 	struct TCP_Server_Info *server;
1710 	unsigned int xid;
1711 	struct dentry *dentry = open_file->dentry;
1712 	struct cifsInodeInfo *cifsi = CIFS_I(d_inode(dentry));
1713 	struct cifs_io_parms io_parms;
1714 
1715 	cifs_sb = CIFS_SB(dentry->d_sb);
1716 
1717 	cifs_dbg(FYI, "write %zd bytes to offset %lld of %pd\n",
1718 		 write_size, *offset, dentry);
1719 
1720 	tcon = tlink_tcon(open_file->tlink);
1721 	server = tcon->ses->server;
1722 
1723 	if (!server->ops->sync_write)
1724 		return -ENOSYS;
1725 
1726 	xid = get_xid();
1727 
1728 	for (total_written = 0; write_size > total_written;
1729 	     total_written += bytes_written) {
1730 		rc = -EAGAIN;
1731 		while (rc == -EAGAIN) {
1732 			struct kvec iov[2];
1733 			unsigned int len;
1734 
1735 			if (open_file->invalidHandle) {
1736 				/* we could deadlock if we called
1737 				   filemap_fdatawait from here so tell
1738 				   reopen_file not to flush data to
1739 				   server now */
1740 				rc = cifs_reopen_file(open_file, false);
1741 				if (rc != 0)
1742 					break;
1743 			}
1744 
1745 			len = min(server->ops->wp_retry_size(d_inode(dentry)),
1746 				  (unsigned int)write_size - total_written);
1747 			/* iov[0] is reserved for smb header */
1748 			iov[1].iov_base = (char *)write_data + total_written;
1749 			iov[1].iov_len = len;
1750 			io_parms.pid = pid;
1751 			io_parms.tcon = tcon;
1752 			io_parms.offset = *offset;
1753 			io_parms.length = len;
1754 			rc = server->ops->sync_write(xid, &open_file->fid,
1755 					&io_parms, &bytes_written, iov, 1);
1756 		}
1757 		if (rc || (bytes_written == 0)) {
1758 			if (total_written)
1759 				break;
1760 			else {
1761 				free_xid(xid);
1762 				return rc;
1763 			}
1764 		} else {
1765 			spin_lock(&d_inode(dentry)->i_lock);
1766 			cifs_update_eof(cifsi, *offset, bytes_written);
1767 			spin_unlock(&d_inode(dentry)->i_lock);
1768 			*offset += bytes_written;
1769 		}
1770 	}
1771 
1772 	cifs_stats_bytes_written(tcon, total_written);
1773 
1774 	if (total_written > 0) {
1775 		spin_lock(&d_inode(dentry)->i_lock);
1776 		if (*offset > d_inode(dentry)->i_size)
1777 			i_size_write(d_inode(dentry), *offset);
1778 		spin_unlock(&d_inode(dentry)->i_lock);
1779 	}
1780 	mark_inode_dirty_sync(d_inode(dentry));
1781 	free_xid(xid);
1782 	return total_written;
1783 }
1784 
find_readable_file(struct cifsInodeInfo * cifs_inode,bool fsuid_only)1785 struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *cifs_inode,
1786 					bool fsuid_only)
1787 {
1788 	struct cifsFileInfo *open_file = NULL;
1789 	struct cifs_sb_info *cifs_sb = CIFS_SB(cifs_inode->vfs_inode.i_sb);
1790 	struct cifs_tcon *tcon = cifs_sb_master_tcon(cifs_sb);
1791 
1792 	/* only filter by fsuid on multiuser mounts */
1793 	if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
1794 		fsuid_only = false;
1795 
1796 	spin_lock(&tcon->open_file_lock);
1797 	/* we could simply get the first_list_entry since write-only entries
1798 	   are always at the end of the list but since the first entry might
1799 	   have a close pending, we go through the whole list */
1800 	list_for_each_entry(open_file, &cifs_inode->openFileList, flist) {
1801 		if (fsuid_only && !uid_eq(open_file->uid, current_fsuid()))
1802 			continue;
1803 		if (OPEN_FMODE(open_file->f_flags) & FMODE_READ) {
1804 			if (!open_file->invalidHandle) {
1805 				/* found a good file */
1806 				/* lock it so it will not be closed on us */
1807 				cifsFileInfo_get(open_file);
1808 				spin_unlock(&tcon->open_file_lock);
1809 				return open_file;
1810 			} /* else might as well continue, and look for
1811 			     another, or simply have the caller reopen it
1812 			     again rather than trying to fix this handle */
1813 		} else /* write only file */
1814 			break; /* write only files are last so must be done */
1815 	}
1816 	spin_unlock(&tcon->open_file_lock);
1817 	return NULL;
1818 }
1819 
find_writable_file(struct cifsInodeInfo * cifs_inode,bool fsuid_only)1820 struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *cifs_inode,
1821 					bool fsuid_only)
1822 {
1823 	struct cifsFileInfo *open_file, *inv_file = NULL;
1824 	struct cifs_sb_info *cifs_sb;
1825 	struct cifs_tcon *tcon;
1826 	bool any_available = false;
1827 	int rc;
1828 	unsigned int refind = 0;
1829 
1830 	/* Having a null inode here (because mapping->host was set to zero by
1831 	the VFS or MM) should not happen but we had reports of on oops (due to
1832 	it being zero) during stress testcases so we need to check for it */
1833 
1834 	if (cifs_inode == NULL) {
1835 		cifs_dbg(VFS, "Null inode passed to cifs_writeable_file\n");
1836 		dump_stack();
1837 		return NULL;
1838 	}
1839 
1840 	cifs_sb = CIFS_SB(cifs_inode->vfs_inode.i_sb);
1841 	tcon = cifs_sb_master_tcon(cifs_sb);
1842 
1843 	/* only filter by fsuid on multiuser mounts */
1844 	if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
1845 		fsuid_only = false;
1846 
1847 	spin_lock(&tcon->open_file_lock);
1848 refind_writable:
1849 	if (refind > MAX_REOPEN_ATT) {
1850 		spin_unlock(&tcon->open_file_lock);
1851 		return NULL;
1852 	}
1853 	list_for_each_entry(open_file, &cifs_inode->openFileList, flist) {
1854 		if (!any_available && open_file->pid != current->tgid)
1855 			continue;
1856 		if (fsuid_only && !uid_eq(open_file->uid, current_fsuid()))
1857 			continue;
1858 		if (OPEN_FMODE(open_file->f_flags) & FMODE_WRITE) {
1859 			if (!open_file->invalidHandle) {
1860 				/* found a good writable file */
1861 				cifsFileInfo_get(open_file);
1862 				spin_unlock(&tcon->open_file_lock);
1863 				return open_file;
1864 			} else {
1865 				if (!inv_file)
1866 					inv_file = open_file;
1867 			}
1868 		}
1869 	}
1870 	/* couldn't find useable FH with same pid, try any available */
1871 	if (!any_available) {
1872 		any_available = true;
1873 		goto refind_writable;
1874 	}
1875 
1876 	if (inv_file) {
1877 		any_available = false;
1878 		cifsFileInfo_get(inv_file);
1879 	}
1880 
1881 	spin_unlock(&tcon->open_file_lock);
1882 
1883 	if (inv_file) {
1884 		rc = cifs_reopen_file(inv_file, false);
1885 		if (!rc)
1886 			return inv_file;
1887 		else {
1888 			spin_lock(&tcon->open_file_lock);
1889 			list_move_tail(&inv_file->flist,
1890 					&cifs_inode->openFileList);
1891 			spin_unlock(&tcon->open_file_lock);
1892 			cifsFileInfo_put(inv_file);
1893 			++refind;
1894 			inv_file = NULL;
1895 			spin_lock(&tcon->open_file_lock);
1896 			goto refind_writable;
1897 		}
1898 	}
1899 
1900 	return NULL;
1901 }
1902 
cifs_partialpagewrite(struct page * page,unsigned from,unsigned to)1903 static int cifs_partialpagewrite(struct page *page, unsigned from, unsigned to)
1904 {
1905 	struct address_space *mapping = page->mapping;
1906 	loff_t offset = (loff_t)page->index << PAGE_SHIFT;
1907 	char *write_data;
1908 	int rc = -EFAULT;
1909 	int bytes_written = 0;
1910 	struct inode *inode;
1911 	struct cifsFileInfo *open_file;
1912 
1913 	if (!mapping || !mapping->host)
1914 		return -EFAULT;
1915 
1916 	inode = page->mapping->host;
1917 
1918 	offset += (loff_t)from;
1919 	write_data = kmap(page);
1920 	write_data += from;
1921 
1922 	if ((to > PAGE_SIZE) || (from > to)) {
1923 		kunmap(page);
1924 		return -EIO;
1925 	}
1926 
1927 	/* racing with truncate? */
1928 	if (offset > mapping->host->i_size) {
1929 		kunmap(page);
1930 		return 0; /* don't care */
1931 	}
1932 
1933 	/* check to make sure that we are not extending the file */
1934 	if (mapping->host->i_size - offset < (loff_t)to)
1935 		to = (unsigned)(mapping->host->i_size - offset);
1936 
1937 	open_file = find_writable_file(CIFS_I(mapping->host), false);
1938 	if (open_file) {
1939 		bytes_written = cifs_write(open_file, open_file->pid,
1940 					   write_data, to - from, &offset);
1941 		cifsFileInfo_put(open_file);
1942 		/* Does mm or vfs already set times? */
1943 		inode->i_atime = inode->i_mtime = current_time(inode);
1944 		if ((bytes_written > 0) && (offset))
1945 			rc = 0;
1946 		else if (bytes_written < 0)
1947 			rc = bytes_written;
1948 	} else {
1949 		cifs_dbg(FYI, "No writeable filehandles for inode\n");
1950 		rc = -EIO;
1951 	}
1952 
1953 	kunmap(page);
1954 	return rc;
1955 }
1956 
1957 static struct cifs_writedata *
wdata_alloc_and_fillpages(pgoff_t tofind,struct address_space * mapping,pgoff_t end,pgoff_t * index,unsigned int * found_pages)1958 wdata_alloc_and_fillpages(pgoff_t tofind, struct address_space *mapping,
1959 			  pgoff_t end, pgoff_t *index,
1960 			  unsigned int *found_pages)
1961 {
1962 	unsigned int nr_pages;
1963 	struct page **pages;
1964 	struct cifs_writedata *wdata;
1965 
1966 	wdata = cifs_writedata_alloc((unsigned int)tofind,
1967 				     cifs_writev_complete);
1968 	if (!wdata)
1969 		return NULL;
1970 
1971 	/*
1972 	 * find_get_pages_tag seems to return a max of 256 on each
1973 	 * iteration, so we must call it several times in order to
1974 	 * fill the array or the wsize is effectively limited to
1975 	 * 256 * PAGE_SIZE.
1976 	 */
1977 	*found_pages = 0;
1978 	pages = wdata->pages;
1979 	do {
1980 		nr_pages = find_get_pages_tag(mapping, index,
1981 					      PAGECACHE_TAG_DIRTY, tofind,
1982 					      pages);
1983 		*found_pages += nr_pages;
1984 		tofind -= nr_pages;
1985 		pages += nr_pages;
1986 	} while (nr_pages && tofind && *index <= end);
1987 
1988 	return wdata;
1989 }
1990 
1991 static unsigned int
wdata_prepare_pages(struct cifs_writedata * wdata,unsigned int found_pages,struct address_space * mapping,struct writeback_control * wbc,pgoff_t end,pgoff_t * index,pgoff_t * next,bool * done)1992 wdata_prepare_pages(struct cifs_writedata *wdata, unsigned int found_pages,
1993 		    struct address_space *mapping,
1994 		    struct writeback_control *wbc,
1995 		    pgoff_t end, pgoff_t *index, pgoff_t *next, bool *done)
1996 {
1997 	unsigned int nr_pages = 0, i;
1998 	struct page *page;
1999 
2000 	for (i = 0; i < found_pages; i++) {
2001 		page = wdata->pages[i];
2002 		/*
2003 		 * At this point we hold neither mapping->tree_lock nor
2004 		 * lock on the page itself: the page may be truncated or
2005 		 * invalidated (changing page->mapping to NULL), or even
2006 		 * swizzled back from swapper_space to tmpfs file
2007 		 * mapping
2008 		 */
2009 
2010 		if (nr_pages == 0)
2011 			lock_page(page);
2012 		else if (!trylock_page(page))
2013 			break;
2014 
2015 		if (unlikely(page->mapping != mapping)) {
2016 			unlock_page(page);
2017 			break;
2018 		}
2019 
2020 		if (!wbc->range_cyclic && page->index > end) {
2021 			*done = true;
2022 			unlock_page(page);
2023 			break;
2024 		}
2025 
2026 		if (*next && (page->index != *next)) {
2027 			/* Not next consecutive page */
2028 			unlock_page(page);
2029 			break;
2030 		}
2031 
2032 		if (wbc->sync_mode != WB_SYNC_NONE)
2033 			wait_on_page_writeback(page);
2034 
2035 		if (PageWriteback(page) ||
2036 				!clear_page_dirty_for_io(page)) {
2037 			unlock_page(page);
2038 			break;
2039 		}
2040 
2041 		/*
2042 		 * This actually clears the dirty bit in the radix tree.
2043 		 * See cifs_writepage() for more commentary.
2044 		 */
2045 		set_page_writeback(page);
2046 		if (page_offset(page) >= i_size_read(mapping->host)) {
2047 			*done = true;
2048 			unlock_page(page);
2049 			end_page_writeback(page);
2050 			break;
2051 		}
2052 
2053 		wdata->pages[i] = page;
2054 		*next = page->index + 1;
2055 		++nr_pages;
2056 	}
2057 
2058 	/* reset index to refind any pages skipped */
2059 	if (nr_pages == 0)
2060 		*index = wdata->pages[0]->index + 1;
2061 
2062 	/* put any pages we aren't going to use */
2063 	for (i = nr_pages; i < found_pages; i++) {
2064 		put_page(wdata->pages[i]);
2065 		wdata->pages[i] = NULL;
2066 	}
2067 
2068 	return nr_pages;
2069 }
2070 
2071 static int
wdata_send_pages(struct cifs_writedata * wdata,unsigned int nr_pages,struct address_space * mapping,struct writeback_control * wbc)2072 wdata_send_pages(struct cifs_writedata *wdata, unsigned int nr_pages,
2073 		 struct address_space *mapping, struct writeback_control *wbc)
2074 {
2075 	int rc = 0;
2076 	struct TCP_Server_Info *server;
2077 	unsigned int i;
2078 
2079 	wdata->sync_mode = wbc->sync_mode;
2080 	wdata->nr_pages = nr_pages;
2081 	wdata->offset = page_offset(wdata->pages[0]);
2082 	wdata->pagesz = PAGE_SIZE;
2083 	wdata->tailsz = min(i_size_read(mapping->host) -
2084 			page_offset(wdata->pages[nr_pages - 1]),
2085 			(loff_t)PAGE_SIZE);
2086 	wdata->bytes = ((nr_pages - 1) * PAGE_SIZE) + wdata->tailsz;
2087 
2088 	if (wdata->cfile != NULL)
2089 		cifsFileInfo_put(wdata->cfile);
2090 	wdata->cfile = find_writable_file(CIFS_I(mapping->host), false);
2091 	if (!wdata->cfile) {
2092 		cifs_dbg(VFS, "No writable handles for inode\n");
2093 		rc = -EBADF;
2094 	} else {
2095 		wdata->pid = wdata->cfile->pid;
2096 		server = tlink_tcon(wdata->cfile->tlink)->ses->server;
2097 		rc = server->ops->async_writev(wdata, cifs_writedata_release);
2098 	}
2099 
2100 	for (i = 0; i < nr_pages; ++i)
2101 		unlock_page(wdata->pages[i]);
2102 
2103 	return rc;
2104 }
2105 
cifs_writepages(struct address_space * mapping,struct writeback_control * wbc)2106 static int cifs_writepages(struct address_space *mapping,
2107 			   struct writeback_control *wbc)
2108 {
2109 	struct cifs_sb_info *cifs_sb = CIFS_SB(mapping->host->i_sb);
2110 	struct TCP_Server_Info *server;
2111 	bool done = false, scanned = false, range_whole = false;
2112 	pgoff_t end, index;
2113 	struct cifs_writedata *wdata;
2114 	int rc = 0;
2115 
2116 	/*
2117 	 * If wsize is smaller than the page cache size, default to writing
2118 	 * one page at a time via cifs_writepage
2119 	 */
2120 	if (cifs_sb->wsize < PAGE_SIZE)
2121 		return generic_writepages(mapping, wbc);
2122 
2123 	if (wbc->range_cyclic) {
2124 		index = mapping->writeback_index; /* Start from prev offset */
2125 		end = -1;
2126 	} else {
2127 		index = wbc->range_start >> PAGE_SHIFT;
2128 		end = wbc->range_end >> PAGE_SHIFT;
2129 		if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX)
2130 			range_whole = true;
2131 		scanned = true;
2132 	}
2133 	server = cifs_sb_master_tcon(cifs_sb)->ses->server;
2134 retry:
2135 	while (!done && index <= end) {
2136 		unsigned int i, nr_pages, found_pages, wsize, credits;
2137 		pgoff_t next = 0, tofind, saved_index = index;
2138 
2139 		rc = server->ops->wait_mtu_credits(server, cifs_sb->wsize,
2140 						   &wsize, &credits);
2141 		if (rc)
2142 			break;
2143 
2144 		tofind = min((wsize / PAGE_SIZE) - 1, end - index) + 1;
2145 
2146 		wdata = wdata_alloc_and_fillpages(tofind, mapping, end, &index,
2147 						  &found_pages);
2148 		if (!wdata) {
2149 			rc = -ENOMEM;
2150 			add_credits_and_wake_if(server, credits, 0);
2151 			break;
2152 		}
2153 
2154 		if (found_pages == 0) {
2155 			kref_put(&wdata->refcount, cifs_writedata_release);
2156 			add_credits_and_wake_if(server, credits, 0);
2157 			break;
2158 		}
2159 
2160 		nr_pages = wdata_prepare_pages(wdata, found_pages, mapping, wbc,
2161 					       end, &index, &next, &done);
2162 
2163 		/* nothing to write? */
2164 		if (nr_pages == 0) {
2165 			kref_put(&wdata->refcount, cifs_writedata_release);
2166 			add_credits_and_wake_if(server, credits, 0);
2167 			continue;
2168 		}
2169 
2170 		wdata->credits = credits;
2171 
2172 		rc = wdata_send_pages(wdata, nr_pages, mapping, wbc);
2173 
2174 		/* send failure -- clean up the mess */
2175 		if (rc != 0) {
2176 			add_credits_and_wake_if(server, wdata->credits, 0);
2177 			for (i = 0; i < nr_pages; ++i) {
2178 				if (rc == -EAGAIN)
2179 					redirty_page_for_writepage(wbc,
2180 							   wdata->pages[i]);
2181 				else
2182 					SetPageError(wdata->pages[i]);
2183 				end_page_writeback(wdata->pages[i]);
2184 				put_page(wdata->pages[i]);
2185 			}
2186 			if (rc != -EAGAIN)
2187 				mapping_set_error(mapping, rc);
2188 		}
2189 		kref_put(&wdata->refcount, cifs_writedata_release);
2190 
2191 		if (wbc->sync_mode == WB_SYNC_ALL && rc == -EAGAIN) {
2192 			index = saved_index;
2193 			continue;
2194 		}
2195 
2196 		wbc->nr_to_write -= nr_pages;
2197 		if (wbc->nr_to_write <= 0)
2198 			done = true;
2199 
2200 		index = next;
2201 	}
2202 
2203 	if (!scanned && !done) {
2204 		/*
2205 		 * We hit the last page and there is more work to be done: wrap
2206 		 * back to the start of the file
2207 		 */
2208 		scanned = true;
2209 		index = 0;
2210 		goto retry;
2211 	}
2212 
2213 	if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0))
2214 		mapping->writeback_index = index;
2215 
2216 	return rc;
2217 }
2218 
2219 static int
cifs_writepage_locked(struct page * page,struct writeback_control * wbc)2220 cifs_writepage_locked(struct page *page, struct writeback_control *wbc)
2221 {
2222 	int rc;
2223 	unsigned int xid;
2224 
2225 	xid = get_xid();
2226 /* BB add check for wbc flags */
2227 	get_page(page);
2228 	if (!PageUptodate(page))
2229 		cifs_dbg(FYI, "ppw - page not up to date\n");
2230 
2231 	/*
2232 	 * Set the "writeback" flag, and clear "dirty" in the radix tree.
2233 	 *
2234 	 * A writepage() implementation always needs to do either this,
2235 	 * or re-dirty the page with "redirty_page_for_writepage()" in
2236 	 * the case of a failure.
2237 	 *
2238 	 * Just unlocking the page will cause the radix tree tag-bits
2239 	 * to fail to update with the state of the page correctly.
2240 	 */
2241 	set_page_writeback(page);
2242 retry_write:
2243 	rc = cifs_partialpagewrite(page, 0, PAGE_SIZE);
2244 	if (rc == -EAGAIN && wbc->sync_mode == WB_SYNC_ALL)
2245 		goto retry_write;
2246 	else if (rc == -EAGAIN)
2247 		redirty_page_for_writepage(wbc, page);
2248 	else if (rc != 0)
2249 		SetPageError(page);
2250 	else
2251 		SetPageUptodate(page);
2252 	end_page_writeback(page);
2253 	put_page(page);
2254 	free_xid(xid);
2255 	return rc;
2256 }
2257 
cifs_writepage(struct page * page,struct writeback_control * wbc)2258 static int cifs_writepage(struct page *page, struct writeback_control *wbc)
2259 {
2260 	int rc = cifs_writepage_locked(page, wbc);
2261 	unlock_page(page);
2262 	return rc;
2263 }
2264 
cifs_write_end(struct file * file,struct address_space * mapping,loff_t pos,unsigned len,unsigned copied,struct page * page,void * fsdata)2265 static int cifs_write_end(struct file *file, struct address_space *mapping,
2266 			loff_t pos, unsigned len, unsigned copied,
2267 			struct page *page, void *fsdata)
2268 {
2269 	int rc;
2270 	struct inode *inode = mapping->host;
2271 	struct cifsFileInfo *cfile = file->private_data;
2272 	struct cifs_sb_info *cifs_sb = CIFS_SB(cfile->dentry->d_sb);
2273 	__u32 pid;
2274 
2275 	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD)
2276 		pid = cfile->pid;
2277 	else
2278 		pid = current->tgid;
2279 
2280 	cifs_dbg(FYI, "write_end for page %p from pos %lld with %d bytes\n",
2281 		 page, pos, copied);
2282 
2283 	if (PageChecked(page)) {
2284 		if (copied == len)
2285 			SetPageUptodate(page);
2286 		ClearPageChecked(page);
2287 	} else if (!PageUptodate(page) && copied == PAGE_SIZE)
2288 		SetPageUptodate(page);
2289 
2290 	if (!PageUptodate(page)) {
2291 		char *page_data;
2292 		unsigned offset = pos & (PAGE_SIZE - 1);
2293 		unsigned int xid;
2294 
2295 		xid = get_xid();
2296 		/* this is probably better than directly calling
2297 		   partialpage_write since in this function the file handle is
2298 		   known which we might as well	leverage */
2299 		/* BB check if anything else missing out of ppw
2300 		   such as updating last write time */
2301 		page_data = kmap(page);
2302 		rc = cifs_write(cfile, pid, page_data + offset, copied, &pos);
2303 		/* if (rc < 0) should we set writebehind rc? */
2304 		kunmap(page);
2305 
2306 		free_xid(xid);
2307 	} else {
2308 		rc = copied;
2309 		pos += copied;
2310 		set_page_dirty(page);
2311 	}
2312 
2313 	if (rc > 0) {
2314 		spin_lock(&inode->i_lock);
2315 		if (pos > inode->i_size)
2316 			i_size_write(inode, pos);
2317 		spin_unlock(&inode->i_lock);
2318 	}
2319 
2320 	unlock_page(page);
2321 	put_page(page);
2322 
2323 	return rc;
2324 }
2325 
cifs_strict_fsync(struct file * file,loff_t start,loff_t end,int datasync)2326 int cifs_strict_fsync(struct file *file, loff_t start, loff_t end,
2327 		      int datasync)
2328 {
2329 	unsigned int xid;
2330 	int rc = 0;
2331 	struct cifs_tcon *tcon;
2332 	struct TCP_Server_Info *server;
2333 	struct cifsFileInfo *smbfile = file->private_data;
2334 	struct inode *inode = file_inode(file);
2335 	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2336 
2337 	rc = filemap_write_and_wait_range(inode->i_mapping, start, end);
2338 	if (rc)
2339 		return rc;
2340 	inode_lock(inode);
2341 
2342 	xid = get_xid();
2343 
2344 	cifs_dbg(FYI, "Sync file - name: %pD datasync: 0x%x\n",
2345 		 file, datasync);
2346 
2347 	if (!CIFS_CACHE_READ(CIFS_I(inode))) {
2348 		rc = cifs_zap_mapping(inode);
2349 		if (rc) {
2350 			cifs_dbg(FYI, "rc: %d during invalidate phase\n", rc);
2351 			rc = 0; /* don't care about it in fsync */
2352 		}
2353 	}
2354 
2355 	tcon = tlink_tcon(smbfile->tlink);
2356 	if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC)) {
2357 		server = tcon->ses->server;
2358 		if (server->ops->flush)
2359 			rc = server->ops->flush(xid, tcon, &smbfile->fid);
2360 		else
2361 			rc = -ENOSYS;
2362 	}
2363 
2364 	free_xid(xid);
2365 	inode_unlock(inode);
2366 	return rc;
2367 }
2368 
cifs_fsync(struct file * file,loff_t start,loff_t end,int datasync)2369 int cifs_fsync(struct file *file, loff_t start, loff_t end, int datasync)
2370 {
2371 	unsigned int xid;
2372 	int rc = 0;
2373 	struct cifs_tcon *tcon;
2374 	struct TCP_Server_Info *server;
2375 	struct cifsFileInfo *smbfile = file->private_data;
2376 	struct cifs_sb_info *cifs_sb = CIFS_FILE_SB(file);
2377 	struct inode *inode = file->f_mapping->host;
2378 
2379 	rc = filemap_write_and_wait_range(inode->i_mapping, start, end);
2380 	if (rc)
2381 		return rc;
2382 	inode_lock(inode);
2383 
2384 	xid = get_xid();
2385 
2386 	cifs_dbg(FYI, "Sync file - name: %pD datasync: 0x%x\n",
2387 		 file, datasync);
2388 
2389 	tcon = tlink_tcon(smbfile->tlink);
2390 	if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC)) {
2391 		server = tcon->ses->server;
2392 		if (server->ops->flush)
2393 			rc = server->ops->flush(xid, tcon, &smbfile->fid);
2394 		else
2395 			rc = -ENOSYS;
2396 	}
2397 
2398 	free_xid(xid);
2399 	inode_unlock(inode);
2400 	return rc;
2401 }
2402 
2403 /*
2404  * As file closes, flush all cached write data for this inode checking
2405  * for write behind errors.
2406  */
cifs_flush(struct file * file,fl_owner_t id)2407 int cifs_flush(struct file *file, fl_owner_t id)
2408 {
2409 	struct inode *inode = file_inode(file);
2410 	int rc = 0;
2411 
2412 	if (file->f_mode & FMODE_WRITE)
2413 		rc = filemap_write_and_wait(inode->i_mapping);
2414 
2415 	cifs_dbg(FYI, "Flush inode %p file %p rc %d\n", inode, file, rc);
2416 
2417 	return rc;
2418 }
2419 
2420 static int
cifs_write_allocate_pages(struct page ** pages,unsigned long num_pages)2421 cifs_write_allocate_pages(struct page **pages, unsigned long num_pages)
2422 {
2423 	int rc = 0;
2424 	unsigned long i;
2425 
2426 	for (i = 0; i < num_pages; i++) {
2427 		pages[i] = alloc_page(GFP_KERNEL|__GFP_HIGHMEM);
2428 		if (!pages[i]) {
2429 			/*
2430 			 * save number of pages we have already allocated and
2431 			 * return with ENOMEM error
2432 			 */
2433 			num_pages = i;
2434 			rc = -ENOMEM;
2435 			break;
2436 		}
2437 	}
2438 
2439 	if (rc) {
2440 		for (i = 0; i < num_pages; i++)
2441 			put_page(pages[i]);
2442 	}
2443 	return rc;
2444 }
2445 
2446 static inline
get_numpages(const size_t wsize,const size_t len,size_t * cur_len)2447 size_t get_numpages(const size_t wsize, const size_t len, size_t *cur_len)
2448 {
2449 	size_t num_pages;
2450 	size_t clen;
2451 
2452 	clen = min_t(const size_t, len, wsize);
2453 	num_pages = DIV_ROUND_UP(clen, PAGE_SIZE);
2454 
2455 	if (cur_len)
2456 		*cur_len = clen;
2457 
2458 	return num_pages;
2459 }
2460 
2461 static void
cifs_uncached_writedata_release(struct kref * refcount)2462 cifs_uncached_writedata_release(struct kref *refcount)
2463 {
2464 	int i;
2465 	struct cifs_writedata *wdata = container_of(refcount,
2466 					struct cifs_writedata, refcount);
2467 
2468 	for (i = 0; i < wdata->nr_pages; i++)
2469 		put_page(wdata->pages[i]);
2470 	cifs_writedata_release(refcount);
2471 }
2472 
2473 static void
cifs_uncached_writev_complete(struct work_struct * work)2474 cifs_uncached_writev_complete(struct work_struct *work)
2475 {
2476 	struct cifs_writedata *wdata = container_of(work,
2477 					struct cifs_writedata, work);
2478 	struct inode *inode = d_inode(wdata->cfile->dentry);
2479 	struct cifsInodeInfo *cifsi = CIFS_I(inode);
2480 
2481 	spin_lock(&inode->i_lock);
2482 	cifs_update_eof(cifsi, wdata->offset, wdata->bytes);
2483 	if (cifsi->server_eof > inode->i_size)
2484 		i_size_write(inode, cifsi->server_eof);
2485 	spin_unlock(&inode->i_lock);
2486 
2487 	complete(&wdata->done);
2488 
2489 	kref_put(&wdata->refcount, cifs_uncached_writedata_release);
2490 }
2491 
2492 static int
wdata_fill_from_iovec(struct cifs_writedata * wdata,struct iov_iter * from,size_t * len,unsigned long * num_pages)2493 wdata_fill_from_iovec(struct cifs_writedata *wdata, struct iov_iter *from,
2494 		      size_t *len, unsigned long *num_pages)
2495 {
2496 	size_t save_len, copied, bytes, cur_len = *len;
2497 	unsigned long i, nr_pages = *num_pages;
2498 
2499 	save_len = cur_len;
2500 	for (i = 0; i < nr_pages; i++) {
2501 		bytes = min_t(const size_t, cur_len, PAGE_SIZE);
2502 		copied = copy_page_from_iter(wdata->pages[i], 0, bytes, from);
2503 		cur_len -= copied;
2504 		/*
2505 		 * If we didn't copy as much as we expected, then that
2506 		 * may mean we trod into an unmapped area. Stop copying
2507 		 * at that point. On the next pass through the big
2508 		 * loop, we'll likely end up getting a zero-length
2509 		 * write and bailing out of it.
2510 		 */
2511 		if (copied < bytes)
2512 			break;
2513 	}
2514 	cur_len = save_len - cur_len;
2515 	*len = cur_len;
2516 
2517 	/*
2518 	 * If we have no data to send, then that probably means that
2519 	 * the copy above failed altogether. That's most likely because
2520 	 * the address in the iovec was bogus. Return -EFAULT and let
2521 	 * the caller free anything we allocated and bail out.
2522 	 */
2523 	if (!cur_len)
2524 		return -EFAULT;
2525 
2526 	/*
2527 	 * i + 1 now represents the number of pages we actually used in
2528 	 * the copy phase above.
2529 	 */
2530 	*num_pages = i + 1;
2531 	return 0;
2532 }
2533 
2534 static int
cifs_write_from_iter(loff_t offset,size_t len,struct iov_iter * from,struct cifsFileInfo * open_file,struct cifs_sb_info * cifs_sb,struct list_head * wdata_list)2535 cifs_write_from_iter(loff_t offset, size_t len, struct iov_iter *from,
2536 		     struct cifsFileInfo *open_file,
2537 		     struct cifs_sb_info *cifs_sb, struct list_head *wdata_list)
2538 {
2539 	int rc = 0;
2540 	size_t cur_len;
2541 	unsigned long nr_pages, num_pages, i;
2542 	struct cifs_writedata *wdata;
2543 	struct iov_iter saved_from = *from;
2544 	loff_t saved_offset = offset;
2545 	pid_t pid;
2546 	struct TCP_Server_Info *server;
2547 
2548 	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD)
2549 		pid = open_file->pid;
2550 	else
2551 		pid = current->tgid;
2552 
2553 	server = tlink_tcon(open_file->tlink)->ses->server;
2554 
2555 	do {
2556 		unsigned int wsize, credits;
2557 
2558 		rc = server->ops->wait_mtu_credits(server, cifs_sb->wsize,
2559 						   &wsize, &credits);
2560 		if (rc)
2561 			break;
2562 
2563 		nr_pages = get_numpages(wsize, len, &cur_len);
2564 		wdata = cifs_writedata_alloc(nr_pages,
2565 					     cifs_uncached_writev_complete);
2566 		if (!wdata) {
2567 			rc = -ENOMEM;
2568 			add_credits_and_wake_if(server, credits, 0);
2569 			break;
2570 		}
2571 
2572 		rc = cifs_write_allocate_pages(wdata->pages, nr_pages);
2573 		if (rc) {
2574 			kfree(wdata);
2575 			add_credits_and_wake_if(server, credits, 0);
2576 			break;
2577 		}
2578 
2579 		num_pages = nr_pages;
2580 		rc = wdata_fill_from_iovec(wdata, from, &cur_len, &num_pages);
2581 		if (rc) {
2582 			for (i = 0; i < nr_pages; i++)
2583 				put_page(wdata->pages[i]);
2584 			kfree(wdata);
2585 			add_credits_and_wake_if(server, credits, 0);
2586 			break;
2587 		}
2588 
2589 		/*
2590 		 * Bring nr_pages down to the number of pages we actually used,
2591 		 * and free any pages that we didn't use.
2592 		 */
2593 		for ( ; nr_pages > num_pages; nr_pages--)
2594 			put_page(wdata->pages[nr_pages - 1]);
2595 
2596 		wdata->sync_mode = WB_SYNC_ALL;
2597 		wdata->nr_pages = nr_pages;
2598 		wdata->offset = (__u64)offset;
2599 		wdata->cfile = cifsFileInfo_get(open_file);
2600 		wdata->pid = pid;
2601 		wdata->bytes = cur_len;
2602 		wdata->pagesz = PAGE_SIZE;
2603 		wdata->tailsz = cur_len - ((nr_pages - 1) * PAGE_SIZE);
2604 		wdata->credits = credits;
2605 
2606 		if (!wdata->cfile->invalidHandle ||
2607 		    !(rc = cifs_reopen_file(wdata->cfile, false)))
2608 			rc = server->ops->async_writev(wdata,
2609 					cifs_uncached_writedata_release);
2610 		if (rc) {
2611 			add_credits_and_wake_if(server, wdata->credits, 0);
2612 			kref_put(&wdata->refcount,
2613 				 cifs_uncached_writedata_release);
2614 			if (rc == -EAGAIN) {
2615 				*from = saved_from;
2616 				iov_iter_advance(from, offset - saved_offset);
2617 				continue;
2618 			}
2619 			break;
2620 		}
2621 
2622 		list_add_tail(&wdata->list, wdata_list);
2623 		offset += cur_len;
2624 		len -= cur_len;
2625 	} while (len > 0);
2626 
2627 	return rc;
2628 }
2629 
cifs_user_writev(struct kiocb * iocb,struct iov_iter * from)2630 ssize_t cifs_user_writev(struct kiocb *iocb, struct iov_iter *from)
2631 {
2632 	struct file *file = iocb->ki_filp;
2633 	ssize_t total_written = 0;
2634 	struct cifsFileInfo *open_file;
2635 	struct cifs_tcon *tcon;
2636 	struct cifs_sb_info *cifs_sb;
2637 	struct cifs_writedata *wdata, *tmp;
2638 	struct list_head wdata_list;
2639 	struct iov_iter saved_from = *from;
2640 	int rc;
2641 
2642 	/*
2643 	 * BB - optimize the way when signing is disabled. We can drop this
2644 	 * extra memory-to-memory copying and use iovec buffers for constructing
2645 	 * write request.
2646 	 */
2647 
2648 	rc = generic_write_checks(iocb, from);
2649 	if (rc <= 0)
2650 		return rc;
2651 
2652 	INIT_LIST_HEAD(&wdata_list);
2653 	cifs_sb = CIFS_FILE_SB(file);
2654 	open_file = file->private_data;
2655 	tcon = tlink_tcon(open_file->tlink);
2656 
2657 	if (!tcon->ses->server->ops->async_writev)
2658 		return -ENOSYS;
2659 
2660 	rc = cifs_write_from_iter(iocb->ki_pos, iov_iter_count(from), from,
2661 				  open_file, cifs_sb, &wdata_list);
2662 
2663 	/*
2664 	 * If at least one write was successfully sent, then discard any rc
2665 	 * value from the later writes. If the other write succeeds, then
2666 	 * we'll end up returning whatever was written. If it fails, then
2667 	 * we'll get a new rc value from that.
2668 	 */
2669 	if (!list_empty(&wdata_list))
2670 		rc = 0;
2671 
2672 	/*
2673 	 * Wait for and collect replies for any successful sends in order of
2674 	 * increasing offset. Once an error is hit or we get a fatal signal
2675 	 * while waiting, then return without waiting for any more replies.
2676 	 */
2677 restart_loop:
2678 	list_for_each_entry_safe(wdata, tmp, &wdata_list, list) {
2679 		if (!rc) {
2680 			/* FIXME: freezable too? */
2681 			rc = wait_for_completion_killable(&wdata->done);
2682 			if (rc)
2683 				rc = -EINTR;
2684 			else if (wdata->result)
2685 				rc = wdata->result;
2686 			else
2687 				total_written += wdata->bytes;
2688 
2689 			/* resend call if it's a retryable error */
2690 			if (rc == -EAGAIN) {
2691 				struct list_head tmp_list;
2692 				struct iov_iter tmp_from = saved_from;
2693 
2694 				INIT_LIST_HEAD(&tmp_list);
2695 				list_del_init(&wdata->list);
2696 
2697 				iov_iter_advance(&tmp_from,
2698 						 wdata->offset - iocb->ki_pos);
2699 
2700 				rc = cifs_write_from_iter(wdata->offset,
2701 						wdata->bytes, &tmp_from,
2702 						open_file, cifs_sb, &tmp_list);
2703 
2704 				list_splice(&tmp_list, &wdata_list);
2705 
2706 				kref_put(&wdata->refcount,
2707 					 cifs_uncached_writedata_release);
2708 				goto restart_loop;
2709 			}
2710 		}
2711 		list_del_init(&wdata->list);
2712 		kref_put(&wdata->refcount, cifs_uncached_writedata_release);
2713 	}
2714 
2715 	if (unlikely(!total_written))
2716 		return rc;
2717 
2718 	iocb->ki_pos += total_written;
2719 	set_bit(CIFS_INO_INVALID_MAPPING, &CIFS_I(file_inode(file))->flags);
2720 	cifs_stats_bytes_written(tcon, total_written);
2721 	return total_written;
2722 }
2723 
2724 static ssize_t
cifs_writev(struct kiocb * iocb,struct iov_iter * from)2725 cifs_writev(struct kiocb *iocb, struct iov_iter *from)
2726 {
2727 	struct file *file = iocb->ki_filp;
2728 	struct cifsFileInfo *cfile = (struct cifsFileInfo *)file->private_data;
2729 	struct inode *inode = file->f_mapping->host;
2730 	struct cifsInodeInfo *cinode = CIFS_I(inode);
2731 	struct TCP_Server_Info *server = tlink_tcon(cfile->tlink)->ses->server;
2732 	ssize_t rc;
2733 
2734 	/*
2735 	 * We need to hold the sem to be sure nobody modifies lock list
2736 	 * with a brlock that prevents writing.
2737 	 */
2738 	down_read(&cinode->lock_sem);
2739 	inode_lock(inode);
2740 
2741 	rc = generic_write_checks(iocb, from);
2742 	if (rc <= 0)
2743 		goto out;
2744 
2745 	if (!cifs_find_lock_conflict(cfile, iocb->ki_pos, iov_iter_count(from),
2746 				     server->vals->exclusive_lock_type, NULL,
2747 				     CIFS_WRITE_OP))
2748 		rc = __generic_file_write_iter(iocb, from);
2749 	else
2750 		rc = -EACCES;
2751 out:
2752 	inode_unlock(inode);
2753 
2754 	if (rc > 0)
2755 		rc = generic_write_sync(iocb, rc);
2756 	up_read(&cinode->lock_sem);
2757 	return rc;
2758 }
2759 
2760 ssize_t
cifs_strict_writev(struct kiocb * iocb,struct iov_iter * from)2761 cifs_strict_writev(struct kiocb *iocb, struct iov_iter *from)
2762 {
2763 	struct inode *inode = file_inode(iocb->ki_filp);
2764 	struct cifsInodeInfo *cinode = CIFS_I(inode);
2765 	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2766 	struct cifsFileInfo *cfile = (struct cifsFileInfo *)
2767 						iocb->ki_filp->private_data;
2768 	struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
2769 	ssize_t written;
2770 
2771 	written = cifs_get_writer(cinode);
2772 	if (written)
2773 		return written;
2774 
2775 	if (CIFS_CACHE_WRITE(cinode)) {
2776 		if (cap_unix(tcon->ses) &&
2777 		(CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability))
2778 		  && ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0)) {
2779 			written = generic_file_write_iter(iocb, from);
2780 			goto out;
2781 		}
2782 		written = cifs_writev(iocb, from);
2783 		goto out;
2784 	}
2785 	/*
2786 	 * For non-oplocked files in strict cache mode we need to write the data
2787 	 * to the server exactly from the pos to pos+len-1 rather than flush all
2788 	 * affected pages because it may cause a error with mandatory locks on
2789 	 * these pages but not on the region from pos to ppos+len-1.
2790 	 */
2791 	written = cifs_user_writev(iocb, from);
2792 	if (written > 0 && CIFS_CACHE_READ(cinode)) {
2793 		/*
2794 		 * Windows 7 server can delay breaking level2 oplock if a write
2795 		 * request comes - break it on the client to prevent reading
2796 		 * an old data.
2797 		 */
2798 		cifs_zap_mapping(inode);
2799 		cifs_dbg(FYI, "Set no oplock for inode=%p after a write operation\n",
2800 			 inode);
2801 		cinode->oplock = 0;
2802 	}
2803 out:
2804 	cifs_put_writer(cinode);
2805 	return written;
2806 }
2807 
2808 static struct cifs_readdata *
cifs_readdata_alloc(unsigned int nr_pages,work_func_t complete)2809 cifs_readdata_alloc(unsigned int nr_pages, work_func_t complete)
2810 {
2811 	struct cifs_readdata *rdata;
2812 
2813 	rdata = kzalloc(sizeof(*rdata) + (sizeof(struct page *) * nr_pages),
2814 			GFP_KERNEL);
2815 	if (rdata != NULL) {
2816 		kref_init(&rdata->refcount);
2817 		INIT_LIST_HEAD(&rdata->list);
2818 		init_completion(&rdata->done);
2819 		INIT_WORK(&rdata->work, complete);
2820 	}
2821 
2822 	return rdata;
2823 }
2824 
2825 void
cifs_readdata_release(struct kref * refcount)2826 cifs_readdata_release(struct kref *refcount)
2827 {
2828 	struct cifs_readdata *rdata = container_of(refcount,
2829 					struct cifs_readdata, refcount);
2830 
2831 	if (rdata->cfile)
2832 		cifsFileInfo_put(rdata->cfile);
2833 
2834 	kfree(rdata);
2835 }
2836 
2837 static int
cifs_read_allocate_pages(struct cifs_readdata * rdata,unsigned int nr_pages)2838 cifs_read_allocate_pages(struct cifs_readdata *rdata, unsigned int nr_pages)
2839 {
2840 	int rc = 0;
2841 	struct page *page;
2842 	unsigned int i;
2843 
2844 	for (i = 0; i < nr_pages; i++) {
2845 		page = alloc_page(GFP_KERNEL|__GFP_HIGHMEM);
2846 		if (!page) {
2847 			rc = -ENOMEM;
2848 			break;
2849 		}
2850 		rdata->pages[i] = page;
2851 	}
2852 
2853 	if (rc) {
2854 		for (i = 0; i < nr_pages; i++) {
2855 			put_page(rdata->pages[i]);
2856 			rdata->pages[i] = NULL;
2857 		}
2858 	}
2859 	return rc;
2860 }
2861 
2862 static void
cifs_uncached_readdata_release(struct kref * refcount)2863 cifs_uncached_readdata_release(struct kref *refcount)
2864 {
2865 	struct cifs_readdata *rdata = container_of(refcount,
2866 					struct cifs_readdata, refcount);
2867 	unsigned int i;
2868 
2869 	for (i = 0; i < rdata->nr_pages; i++) {
2870 		put_page(rdata->pages[i]);
2871 		rdata->pages[i] = NULL;
2872 	}
2873 	cifs_readdata_release(refcount);
2874 }
2875 
2876 /**
2877  * cifs_readdata_to_iov - copy data from pages in response to an iovec
2878  * @rdata:	the readdata response with list of pages holding data
2879  * @iter:	destination for our data
2880  *
2881  * This function copies data from a list of pages in a readdata response into
2882  * an array of iovecs. It will first calculate where the data should go
2883  * based on the info in the readdata and then copy the data into that spot.
2884  */
2885 static int
cifs_readdata_to_iov(struct cifs_readdata * rdata,struct iov_iter * iter)2886 cifs_readdata_to_iov(struct cifs_readdata *rdata, struct iov_iter *iter)
2887 {
2888 	size_t remaining = rdata->got_bytes;
2889 	unsigned int i;
2890 
2891 	for (i = 0; i < rdata->nr_pages; i++) {
2892 		struct page *page = rdata->pages[i];
2893 		size_t copy = min_t(size_t, remaining, PAGE_SIZE);
2894 		size_t written;
2895 
2896 		if (unlikely(iter->type & ITER_PIPE)) {
2897 			void *addr = kmap_atomic(page);
2898 
2899 			written = copy_to_iter(addr, copy, iter);
2900 			kunmap_atomic(addr);
2901 		} else
2902 			written = copy_page_to_iter(page, 0, copy, iter);
2903 		remaining -= written;
2904 		if (written < copy && iov_iter_count(iter) > 0)
2905 			break;
2906 	}
2907 	return remaining ? -EFAULT : 0;
2908 }
2909 
2910 static void
cifs_uncached_readv_complete(struct work_struct * work)2911 cifs_uncached_readv_complete(struct work_struct *work)
2912 {
2913 	struct cifs_readdata *rdata = container_of(work,
2914 						struct cifs_readdata, work);
2915 
2916 	complete(&rdata->done);
2917 	kref_put(&rdata->refcount, cifs_uncached_readdata_release);
2918 }
2919 
2920 static int
cifs_uncached_read_into_pages(struct TCP_Server_Info * server,struct cifs_readdata * rdata,unsigned int len)2921 cifs_uncached_read_into_pages(struct TCP_Server_Info *server,
2922 			struct cifs_readdata *rdata, unsigned int len)
2923 {
2924 	int result = 0;
2925 	unsigned int i;
2926 	unsigned int nr_pages = rdata->nr_pages;
2927 
2928 	rdata->got_bytes = 0;
2929 	rdata->tailsz = PAGE_SIZE;
2930 	for (i = 0; i < nr_pages; i++) {
2931 		struct page *page = rdata->pages[i];
2932 		size_t n;
2933 
2934 		if (len <= 0) {
2935 			/* no need to hold page hostage */
2936 			rdata->pages[i] = NULL;
2937 			rdata->nr_pages--;
2938 			put_page(page);
2939 			continue;
2940 		}
2941 		n = len;
2942 		if (len >= PAGE_SIZE) {
2943 			/* enough data to fill the page */
2944 			n = PAGE_SIZE;
2945 			len -= n;
2946 		} else {
2947 			zero_user(page, len, PAGE_SIZE - len);
2948 			rdata->tailsz = len;
2949 			len = 0;
2950 		}
2951 		result = cifs_read_page_from_socket(server, page, n);
2952 		if (result < 0)
2953 			break;
2954 
2955 		rdata->got_bytes += result;
2956 	}
2957 
2958 	return rdata->got_bytes > 0 && result != -ECONNABORTED ?
2959 						rdata->got_bytes : result;
2960 }
2961 
2962 static int
cifs_send_async_read(loff_t offset,size_t len,struct cifsFileInfo * open_file,struct cifs_sb_info * cifs_sb,struct list_head * rdata_list)2963 cifs_send_async_read(loff_t offset, size_t len, struct cifsFileInfo *open_file,
2964 		     struct cifs_sb_info *cifs_sb, struct list_head *rdata_list)
2965 {
2966 	struct cifs_readdata *rdata;
2967 	unsigned int npages, rsize, credits;
2968 	size_t cur_len;
2969 	int rc;
2970 	pid_t pid;
2971 	struct TCP_Server_Info *server;
2972 
2973 	server = tlink_tcon(open_file->tlink)->ses->server;
2974 
2975 	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD)
2976 		pid = open_file->pid;
2977 	else
2978 		pid = current->tgid;
2979 
2980 	do {
2981 		rc = server->ops->wait_mtu_credits(server, cifs_sb->rsize,
2982 						   &rsize, &credits);
2983 		if (rc)
2984 			break;
2985 
2986 		cur_len = min_t(const size_t, len, rsize);
2987 		npages = DIV_ROUND_UP(cur_len, PAGE_SIZE);
2988 
2989 		/* allocate a readdata struct */
2990 		rdata = cifs_readdata_alloc(npages,
2991 					    cifs_uncached_readv_complete);
2992 		if (!rdata) {
2993 			add_credits_and_wake_if(server, credits, 0);
2994 			rc = -ENOMEM;
2995 			break;
2996 		}
2997 
2998 		rc = cifs_read_allocate_pages(rdata, npages);
2999 		if (rc)
3000 			goto error;
3001 
3002 		rdata->cfile = cifsFileInfo_get(open_file);
3003 		rdata->nr_pages = npages;
3004 		rdata->offset = offset;
3005 		rdata->bytes = cur_len;
3006 		rdata->pid = pid;
3007 		rdata->pagesz = PAGE_SIZE;
3008 		rdata->read_into_pages = cifs_uncached_read_into_pages;
3009 		rdata->credits = credits;
3010 
3011 		if (!rdata->cfile->invalidHandle ||
3012 		    !(rc = cifs_reopen_file(rdata->cfile, true)))
3013 			rc = server->ops->async_readv(rdata);
3014 error:
3015 		if (rc) {
3016 			add_credits_and_wake_if(server, rdata->credits, 0);
3017 			kref_put(&rdata->refcount,
3018 				 cifs_uncached_readdata_release);
3019 			if (rc == -EAGAIN)
3020 				continue;
3021 			break;
3022 		}
3023 
3024 		list_add_tail(&rdata->list, rdata_list);
3025 		offset += cur_len;
3026 		len -= cur_len;
3027 	} while (len > 0);
3028 
3029 	return rc;
3030 }
3031 
cifs_user_readv(struct kiocb * iocb,struct iov_iter * to)3032 ssize_t cifs_user_readv(struct kiocb *iocb, struct iov_iter *to)
3033 {
3034 	struct file *file = iocb->ki_filp;
3035 	ssize_t rc;
3036 	size_t len;
3037 	ssize_t total_read = 0;
3038 	loff_t offset = iocb->ki_pos;
3039 	struct cifs_sb_info *cifs_sb;
3040 	struct cifs_tcon *tcon;
3041 	struct cifsFileInfo *open_file;
3042 	struct cifs_readdata *rdata, *tmp;
3043 	struct list_head rdata_list;
3044 
3045 	len = iov_iter_count(to);
3046 	if (!len)
3047 		return 0;
3048 
3049 	INIT_LIST_HEAD(&rdata_list);
3050 	cifs_sb = CIFS_FILE_SB(file);
3051 	open_file = file->private_data;
3052 	tcon = tlink_tcon(open_file->tlink);
3053 
3054 	if (!tcon->ses->server->ops->async_readv)
3055 		return -ENOSYS;
3056 
3057 	if ((file->f_flags & O_ACCMODE) == O_WRONLY)
3058 		cifs_dbg(FYI, "attempting read on write only file instance\n");
3059 
3060 	rc = cifs_send_async_read(offset, len, open_file, cifs_sb, &rdata_list);
3061 
3062 	/* if at least one read request send succeeded, then reset rc */
3063 	if (!list_empty(&rdata_list))
3064 		rc = 0;
3065 
3066 	len = iov_iter_count(to);
3067 	/* the loop below should proceed in the order of increasing offsets */
3068 again:
3069 	list_for_each_entry_safe(rdata, tmp, &rdata_list, list) {
3070 		if (!rc) {
3071 			/* FIXME: freezable sleep too? */
3072 			rc = wait_for_completion_killable(&rdata->done);
3073 			if (rc)
3074 				rc = -EINTR;
3075 			else if (rdata->result == -EAGAIN) {
3076 				/* resend call if it's a retryable error */
3077 				struct list_head tmp_list;
3078 				unsigned int got_bytes = rdata->got_bytes;
3079 
3080 				list_del_init(&rdata->list);
3081 				INIT_LIST_HEAD(&tmp_list);
3082 
3083 				/*
3084 				 * Got a part of data and then reconnect has
3085 				 * happened -- fill the buffer and continue
3086 				 * reading.
3087 				 */
3088 				if (got_bytes && got_bytes < rdata->bytes) {
3089 					rc = cifs_readdata_to_iov(rdata, to);
3090 					if (rc) {
3091 						kref_put(&rdata->refcount,
3092 						cifs_uncached_readdata_release);
3093 						continue;
3094 					}
3095 				}
3096 
3097 				rc = cifs_send_async_read(
3098 						rdata->offset + got_bytes,
3099 						rdata->bytes - got_bytes,
3100 						rdata->cfile, cifs_sb,
3101 						&tmp_list);
3102 
3103 				list_splice(&tmp_list, &rdata_list);
3104 
3105 				kref_put(&rdata->refcount,
3106 					 cifs_uncached_readdata_release);
3107 				goto again;
3108 			} else if (rdata->result)
3109 				rc = rdata->result;
3110 			else
3111 				rc = cifs_readdata_to_iov(rdata, to);
3112 
3113 			/* if there was a short read -- discard anything left */
3114 			if (rdata->got_bytes && rdata->got_bytes < rdata->bytes)
3115 				rc = -ENODATA;
3116 		}
3117 		list_del_init(&rdata->list);
3118 		kref_put(&rdata->refcount, cifs_uncached_readdata_release);
3119 	}
3120 
3121 	total_read = len - iov_iter_count(to);
3122 
3123 	cifs_stats_bytes_read(tcon, total_read);
3124 
3125 	/* mask nodata case */
3126 	if (rc == -ENODATA)
3127 		rc = 0;
3128 
3129 	if (total_read) {
3130 		iocb->ki_pos += total_read;
3131 		return total_read;
3132 	}
3133 	return rc;
3134 }
3135 
3136 ssize_t
cifs_strict_readv(struct kiocb * iocb,struct iov_iter * to)3137 cifs_strict_readv(struct kiocb *iocb, struct iov_iter *to)
3138 {
3139 	struct inode *inode = file_inode(iocb->ki_filp);
3140 	struct cifsInodeInfo *cinode = CIFS_I(inode);
3141 	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
3142 	struct cifsFileInfo *cfile = (struct cifsFileInfo *)
3143 						iocb->ki_filp->private_data;
3144 	struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
3145 	int rc = -EACCES;
3146 
3147 	/*
3148 	 * In strict cache mode we need to read from the server all the time
3149 	 * if we don't have level II oplock because the server can delay mtime
3150 	 * change - so we can't make a decision about inode invalidating.
3151 	 * And we can also fail with pagereading if there are mandatory locks
3152 	 * on pages affected by this read but not on the region from pos to
3153 	 * pos+len-1.
3154 	 */
3155 	if (!CIFS_CACHE_READ(cinode))
3156 		return cifs_user_readv(iocb, to);
3157 
3158 	if (cap_unix(tcon->ses) &&
3159 	    (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) &&
3160 	    ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0))
3161 		return generic_file_read_iter(iocb, to);
3162 
3163 	/*
3164 	 * We need to hold the sem to be sure nobody modifies lock list
3165 	 * with a brlock that prevents reading.
3166 	 */
3167 	down_read(&cinode->lock_sem);
3168 	if (!cifs_find_lock_conflict(cfile, iocb->ki_pos, iov_iter_count(to),
3169 				     tcon->ses->server->vals->shared_lock_type,
3170 				     NULL, CIFS_READ_OP))
3171 		rc = generic_file_read_iter(iocb, to);
3172 	up_read(&cinode->lock_sem);
3173 	return rc;
3174 }
3175 
3176 static ssize_t
cifs_read(struct file * file,char * read_data,size_t read_size,loff_t * offset)3177 cifs_read(struct file *file, char *read_data, size_t read_size, loff_t *offset)
3178 {
3179 	int rc = -EACCES;
3180 	unsigned int bytes_read = 0;
3181 	unsigned int total_read;
3182 	unsigned int current_read_size;
3183 	unsigned int rsize;
3184 	struct cifs_sb_info *cifs_sb;
3185 	struct cifs_tcon *tcon;
3186 	struct TCP_Server_Info *server;
3187 	unsigned int xid;
3188 	char *cur_offset;
3189 	struct cifsFileInfo *open_file;
3190 	struct cifs_io_parms io_parms;
3191 	int buf_type = CIFS_NO_BUFFER;
3192 	__u32 pid;
3193 
3194 	xid = get_xid();
3195 	cifs_sb = CIFS_FILE_SB(file);
3196 
3197 	/* FIXME: set up handlers for larger reads and/or convert to async */
3198 	rsize = min_t(unsigned int, cifs_sb->rsize, CIFSMaxBufSize);
3199 
3200 	if (file->private_data == NULL) {
3201 		rc = -EBADF;
3202 		free_xid(xid);
3203 		return rc;
3204 	}
3205 	open_file = file->private_data;
3206 	tcon = tlink_tcon(open_file->tlink);
3207 	server = tcon->ses->server;
3208 
3209 	if (!server->ops->sync_read) {
3210 		free_xid(xid);
3211 		return -ENOSYS;
3212 	}
3213 
3214 	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD)
3215 		pid = open_file->pid;
3216 	else
3217 		pid = current->tgid;
3218 
3219 	if ((file->f_flags & O_ACCMODE) == O_WRONLY)
3220 		cifs_dbg(FYI, "attempting read on write only file instance\n");
3221 
3222 	for (total_read = 0, cur_offset = read_data; read_size > total_read;
3223 	     total_read += bytes_read, cur_offset += bytes_read) {
3224 		do {
3225 			current_read_size = min_t(uint, read_size - total_read,
3226 						  rsize);
3227 			/*
3228 			 * For windows me and 9x we do not want to request more
3229 			 * than it negotiated since it will refuse the read
3230 			 * then.
3231 			 */
3232 			if ((tcon->ses) && !(tcon->ses->capabilities &
3233 				tcon->ses->server->vals->cap_large_files)) {
3234 				current_read_size = min_t(uint,
3235 					current_read_size, CIFSMaxBufSize);
3236 			}
3237 			if (open_file->invalidHandle) {
3238 				rc = cifs_reopen_file(open_file, true);
3239 				if (rc != 0)
3240 					break;
3241 			}
3242 			io_parms.pid = pid;
3243 			io_parms.tcon = tcon;
3244 			io_parms.offset = *offset;
3245 			io_parms.length = current_read_size;
3246 			rc = server->ops->sync_read(xid, &open_file->fid, &io_parms,
3247 						    &bytes_read, &cur_offset,
3248 						    &buf_type);
3249 		} while (rc == -EAGAIN);
3250 
3251 		if (rc || (bytes_read == 0)) {
3252 			if (total_read) {
3253 				break;
3254 			} else {
3255 				free_xid(xid);
3256 				return rc;
3257 			}
3258 		} else {
3259 			cifs_stats_bytes_read(tcon, total_read);
3260 			*offset += bytes_read;
3261 		}
3262 	}
3263 	free_xid(xid);
3264 	return total_read;
3265 }
3266 
3267 /*
3268  * If the page is mmap'ed into a process' page tables, then we need to make
3269  * sure that it doesn't change while being written back.
3270  */
3271 static int
cifs_page_mkwrite(struct vm_area_struct * vma,struct vm_fault * vmf)3272 cifs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
3273 {
3274 	struct page *page = vmf->page;
3275 
3276 	lock_page(page);
3277 	return VM_FAULT_LOCKED;
3278 }
3279 
3280 static const struct vm_operations_struct cifs_file_vm_ops = {
3281 	.fault = filemap_fault,
3282 	.map_pages = filemap_map_pages,
3283 	.page_mkwrite = cifs_page_mkwrite,
3284 };
3285 
cifs_file_strict_mmap(struct file * file,struct vm_area_struct * vma)3286 int cifs_file_strict_mmap(struct file *file, struct vm_area_struct *vma)
3287 {
3288 	int xid, rc = 0;
3289 	struct inode *inode = file_inode(file);
3290 
3291 	xid = get_xid();
3292 
3293 	if (!CIFS_CACHE_READ(CIFS_I(inode)))
3294 		rc = cifs_zap_mapping(inode);
3295 	if (!rc)
3296 		rc = generic_file_mmap(file, vma);
3297 	if (!rc)
3298 		vma->vm_ops = &cifs_file_vm_ops;
3299 
3300 	free_xid(xid);
3301 	return rc;
3302 }
3303 
cifs_file_mmap(struct file * file,struct vm_area_struct * vma)3304 int cifs_file_mmap(struct file *file, struct vm_area_struct *vma)
3305 {
3306 	int rc, xid;
3307 
3308 	xid = get_xid();
3309 
3310 	rc = cifs_revalidate_file(file);
3311 	if (rc)
3312 		cifs_dbg(FYI, "Validation prior to mmap failed, error=%d\n",
3313 			 rc);
3314 	if (!rc)
3315 		rc = generic_file_mmap(file, vma);
3316 	if (!rc)
3317 		vma->vm_ops = &cifs_file_vm_ops;
3318 
3319 	free_xid(xid);
3320 	return rc;
3321 }
3322 
3323 static void
cifs_readv_complete(struct work_struct * work)3324 cifs_readv_complete(struct work_struct *work)
3325 {
3326 	unsigned int i, got_bytes;
3327 	struct cifs_readdata *rdata = container_of(work,
3328 						struct cifs_readdata, work);
3329 
3330 	got_bytes = rdata->got_bytes;
3331 	for (i = 0; i < rdata->nr_pages; i++) {
3332 		struct page *page = rdata->pages[i];
3333 
3334 		lru_cache_add_file(page);
3335 
3336 		if (rdata->result == 0 ||
3337 		    (rdata->result == -EAGAIN && got_bytes)) {
3338 			flush_dcache_page(page);
3339 			SetPageUptodate(page);
3340 		}
3341 
3342 		unlock_page(page);
3343 
3344 		if (rdata->result == 0 ||
3345 		    (rdata->result == -EAGAIN && got_bytes))
3346 			cifs_readpage_to_fscache(rdata->mapping->host, page);
3347 
3348 		got_bytes -= min_t(unsigned int, PAGE_SIZE, got_bytes);
3349 
3350 		put_page(page);
3351 		rdata->pages[i] = NULL;
3352 	}
3353 	kref_put(&rdata->refcount, cifs_readdata_release);
3354 }
3355 
3356 static int
cifs_readpages_read_into_pages(struct TCP_Server_Info * server,struct cifs_readdata * rdata,unsigned int len)3357 cifs_readpages_read_into_pages(struct TCP_Server_Info *server,
3358 			struct cifs_readdata *rdata, unsigned int len)
3359 {
3360 	int result = 0;
3361 	unsigned int i;
3362 	u64 eof;
3363 	pgoff_t eof_index;
3364 	unsigned int nr_pages = rdata->nr_pages;
3365 
3366 	/* determine the eof that the server (probably) has */
3367 	eof = CIFS_I(rdata->mapping->host)->server_eof;
3368 	eof_index = eof ? (eof - 1) >> PAGE_SHIFT : 0;
3369 	cifs_dbg(FYI, "eof=%llu eof_index=%lu\n", eof, eof_index);
3370 
3371 	rdata->got_bytes = 0;
3372 	rdata->tailsz = PAGE_SIZE;
3373 	for (i = 0; i < nr_pages; i++) {
3374 		struct page *page = rdata->pages[i];
3375 		size_t n = PAGE_SIZE;
3376 
3377 		if (len >= PAGE_SIZE) {
3378 			len -= PAGE_SIZE;
3379 		} else if (len > 0) {
3380 			/* enough for partial page, fill and zero the rest */
3381 			zero_user(page, len, PAGE_SIZE - len);
3382 			n = rdata->tailsz = len;
3383 			len = 0;
3384 		} else if (page->index > eof_index) {
3385 			/*
3386 			 * The VFS will not try to do readahead past the
3387 			 * i_size, but it's possible that we have outstanding
3388 			 * writes with gaps in the middle and the i_size hasn't
3389 			 * caught up yet. Populate those with zeroed out pages
3390 			 * to prevent the VFS from repeatedly attempting to
3391 			 * fill them until the writes are flushed.
3392 			 */
3393 			zero_user(page, 0, PAGE_SIZE);
3394 			lru_cache_add_file(page);
3395 			flush_dcache_page(page);
3396 			SetPageUptodate(page);
3397 			unlock_page(page);
3398 			put_page(page);
3399 			rdata->pages[i] = NULL;
3400 			rdata->nr_pages--;
3401 			continue;
3402 		} else {
3403 			/* no need to hold page hostage */
3404 			lru_cache_add_file(page);
3405 			unlock_page(page);
3406 			put_page(page);
3407 			rdata->pages[i] = NULL;
3408 			rdata->nr_pages--;
3409 			continue;
3410 		}
3411 
3412 		result = cifs_read_page_from_socket(server, page, n);
3413 		if (result < 0)
3414 			break;
3415 
3416 		rdata->got_bytes += result;
3417 	}
3418 
3419 	return rdata->got_bytes > 0 && result != -ECONNABORTED ?
3420 						rdata->got_bytes : result;
3421 }
3422 
3423 static int
readpages_get_pages(struct address_space * mapping,struct list_head * page_list,unsigned int rsize,struct list_head * tmplist,unsigned int * nr_pages,loff_t * offset,unsigned int * bytes)3424 readpages_get_pages(struct address_space *mapping, struct list_head *page_list,
3425 		    unsigned int rsize, struct list_head *tmplist,
3426 		    unsigned int *nr_pages, loff_t *offset, unsigned int *bytes)
3427 {
3428 	struct page *page, *tpage;
3429 	unsigned int expected_index;
3430 	int rc;
3431 	gfp_t gfp = readahead_gfp_mask(mapping);
3432 
3433 	INIT_LIST_HEAD(tmplist);
3434 
3435 	page = list_entry(page_list->prev, struct page, lru);
3436 
3437 	/*
3438 	 * Lock the page and put it in the cache. Since no one else
3439 	 * should have access to this page, we're safe to simply set
3440 	 * PG_locked without checking it first.
3441 	 */
3442 	__SetPageLocked(page);
3443 	rc = add_to_page_cache_locked(page, mapping,
3444 				      page->index, gfp);
3445 
3446 	/* give up if we can't stick it in the cache */
3447 	if (rc) {
3448 		__ClearPageLocked(page);
3449 		return rc;
3450 	}
3451 
3452 	/* move first page to the tmplist */
3453 	*offset = (loff_t)page->index << PAGE_SHIFT;
3454 	*bytes = PAGE_SIZE;
3455 	*nr_pages = 1;
3456 	list_move_tail(&page->lru, tmplist);
3457 
3458 	/* now try and add more pages onto the request */
3459 	expected_index = page->index + 1;
3460 	list_for_each_entry_safe_reverse(page, tpage, page_list, lru) {
3461 		/* discontinuity ? */
3462 		if (page->index != expected_index)
3463 			break;
3464 
3465 		/* would this page push the read over the rsize? */
3466 		if (*bytes + PAGE_SIZE > rsize)
3467 			break;
3468 
3469 		__SetPageLocked(page);
3470 		if (add_to_page_cache_locked(page, mapping, page->index, gfp)) {
3471 			__ClearPageLocked(page);
3472 			break;
3473 		}
3474 		list_move_tail(&page->lru, tmplist);
3475 		(*bytes) += PAGE_SIZE;
3476 		expected_index++;
3477 		(*nr_pages)++;
3478 	}
3479 	return rc;
3480 }
3481 
cifs_readpages(struct file * file,struct address_space * mapping,struct list_head * page_list,unsigned num_pages)3482 static int cifs_readpages(struct file *file, struct address_space *mapping,
3483 	struct list_head *page_list, unsigned num_pages)
3484 {
3485 	int rc;
3486 	struct list_head tmplist;
3487 	struct cifsFileInfo *open_file = file->private_data;
3488 	struct cifs_sb_info *cifs_sb = CIFS_FILE_SB(file);
3489 	struct TCP_Server_Info *server;
3490 	pid_t pid;
3491 
3492 	/*
3493 	 * Reads as many pages as possible from fscache. Returns -ENOBUFS
3494 	 * immediately if the cookie is negative
3495 	 *
3496 	 * After this point, every page in the list might have PG_fscache set,
3497 	 * so we will need to clean that up off of every page we don't use.
3498 	 */
3499 	rc = cifs_readpages_from_fscache(mapping->host, mapping, page_list,
3500 					 &num_pages);
3501 	if (rc == 0)
3502 		return rc;
3503 
3504 	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD)
3505 		pid = open_file->pid;
3506 	else
3507 		pid = current->tgid;
3508 
3509 	rc = 0;
3510 	server = tlink_tcon(open_file->tlink)->ses->server;
3511 
3512 	cifs_dbg(FYI, "%s: file=%p mapping=%p num_pages=%u\n",
3513 		 __func__, file, mapping, num_pages);
3514 
3515 	/*
3516 	 * Start with the page at end of list and move it to private
3517 	 * list. Do the same with any following pages until we hit
3518 	 * the rsize limit, hit an index discontinuity, or run out of
3519 	 * pages. Issue the async read and then start the loop again
3520 	 * until the list is empty.
3521 	 *
3522 	 * Note that list order is important. The page_list is in
3523 	 * the order of declining indexes. When we put the pages in
3524 	 * the rdata->pages, then we want them in increasing order.
3525 	 */
3526 	while (!list_empty(page_list)) {
3527 		unsigned int i, nr_pages, bytes, rsize;
3528 		loff_t offset;
3529 		struct page *page, *tpage;
3530 		struct cifs_readdata *rdata;
3531 		unsigned credits;
3532 
3533 		rc = server->ops->wait_mtu_credits(server, cifs_sb->rsize,
3534 						   &rsize, &credits);
3535 		if (rc)
3536 			break;
3537 
3538 		/*
3539 		 * Give up immediately if rsize is too small to read an entire
3540 		 * page. The VFS will fall back to readpage. We should never
3541 		 * reach this point however since we set ra_pages to 0 when the
3542 		 * rsize is smaller than a cache page.
3543 		 */
3544 		if (unlikely(rsize < PAGE_SIZE)) {
3545 			add_credits_and_wake_if(server, credits, 0);
3546 			return 0;
3547 		}
3548 
3549 		rc = readpages_get_pages(mapping, page_list, rsize, &tmplist,
3550 					 &nr_pages, &offset, &bytes);
3551 		if (rc) {
3552 			add_credits_and_wake_if(server, credits, 0);
3553 			break;
3554 		}
3555 
3556 		rdata = cifs_readdata_alloc(nr_pages, cifs_readv_complete);
3557 		if (!rdata) {
3558 			/* best to give up if we're out of mem */
3559 			list_for_each_entry_safe(page, tpage, &tmplist, lru) {
3560 				list_del(&page->lru);
3561 				lru_cache_add_file(page);
3562 				unlock_page(page);
3563 				put_page(page);
3564 			}
3565 			rc = -ENOMEM;
3566 			add_credits_and_wake_if(server, credits, 0);
3567 			break;
3568 		}
3569 
3570 		rdata->cfile = cifsFileInfo_get(open_file);
3571 		rdata->mapping = mapping;
3572 		rdata->offset = offset;
3573 		rdata->bytes = bytes;
3574 		rdata->pid = pid;
3575 		rdata->pagesz = PAGE_SIZE;
3576 		rdata->read_into_pages = cifs_readpages_read_into_pages;
3577 		rdata->credits = credits;
3578 
3579 		list_for_each_entry_safe(page, tpage, &tmplist, lru) {
3580 			list_del(&page->lru);
3581 			rdata->pages[rdata->nr_pages++] = page;
3582 		}
3583 
3584 		if (!rdata->cfile->invalidHandle ||
3585 		    !(rc = cifs_reopen_file(rdata->cfile, true)))
3586 			rc = server->ops->async_readv(rdata);
3587 		if (rc) {
3588 			add_credits_and_wake_if(server, rdata->credits, 0);
3589 			for (i = 0; i < rdata->nr_pages; i++) {
3590 				page = rdata->pages[i];
3591 				lru_cache_add_file(page);
3592 				unlock_page(page);
3593 				put_page(page);
3594 			}
3595 			/* Fallback to the readpage in error/reconnect cases */
3596 			kref_put(&rdata->refcount, cifs_readdata_release);
3597 			break;
3598 		}
3599 
3600 		kref_put(&rdata->refcount, cifs_readdata_release);
3601 	}
3602 
3603 	/* Any pages that have been shown to fscache but didn't get added to
3604 	 * the pagecache must be uncached before they get returned to the
3605 	 * allocator.
3606 	 */
3607 	cifs_fscache_readpages_cancel(mapping->host, page_list);
3608 	return rc;
3609 }
3610 
3611 /*
3612  * cifs_readpage_worker must be called with the page pinned
3613  */
cifs_readpage_worker(struct file * file,struct page * page,loff_t * poffset)3614 static int cifs_readpage_worker(struct file *file, struct page *page,
3615 	loff_t *poffset)
3616 {
3617 	char *read_data;
3618 	int rc;
3619 
3620 	/* Is the page cached? */
3621 	rc = cifs_readpage_from_fscache(file_inode(file), page);
3622 	if (rc == 0)
3623 		goto read_complete;
3624 
3625 	read_data = kmap(page);
3626 	/* for reads over a certain size could initiate async read ahead */
3627 
3628 	rc = cifs_read(file, read_data, PAGE_SIZE, poffset);
3629 
3630 	if (rc < 0)
3631 		goto io_error;
3632 	else
3633 		cifs_dbg(FYI, "Bytes read %d\n", rc);
3634 
3635 	file_inode(file)->i_atime =
3636 		current_time(file_inode(file));
3637 
3638 	if (PAGE_SIZE > rc)
3639 		memset(read_data + rc, 0, PAGE_SIZE - rc);
3640 
3641 	flush_dcache_page(page);
3642 	SetPageUptodate(page);
3643 
3644 	/* send this page to the cache */
3645 	cifs_readpage_to_fscache(file_inode(file), page);
3646 
3647 	rc = 0;
3648 
3649 io_error:
3650 	kunmap(page);
3651 	unlock_page(page);
3652 
3653 read_complete:
3654 	return rc;
3655 }
3656 
cifs_readpage(struct file * file,struct page * page)3657 static int cifs_readpage(struct file *file, struct page *page)
3658 {
3659 	loff_t offset = (loff_t)page->index << PAGE_SHIFT;
3660 	int rc = -EACCES;
3661 	unsigned int xid;
3662 
3663 	xid = get_xid();
3664 
3665 	if (file->private_data == NULL) {
3666 		rc = -EBADF;
3667 		free_xid(xid);
3668 		return rc;
3669 	}
3670 
3671 	cifs_dbg(FYI, "readpage %p at offset %d 0x%x\n",
3672 		 page, (int)offset, (int)offset);
3673 
3674 	rc = cifs_readpage_worker(file, page, &offset);
3675 
3676 	free_xid(xid);
3677 	return rc;
3678 }
3679 
is_inode_writable(struct cifsInodeInfo * cifs_inode)3680 static int is_inode_writable(struct cifsInodeInfo *cifs_inode)
3681 {
3682 	struct cifsFileInfo *open_file;
3683 	struct cifs_tcon *tcon =
3684 		cifs_sb_master_tcon(CIFS_SB(cifs_inode->vfs_inode.i_sb));
3685 
3686 	spin_lock(&tcon->open_file_lock);
3687 	list_for_each_entry(open_file, &cifs_inode->openFileList, flist) {
3688 		if (OPEN_FMODE(open_file->f_flags) & FMODE_WRITE) {
3689 			spin_unlock(&tcon->open_file_lock);
3690 			return 1;
3691 		}
3692 	}
3693 	spin_unlock(&tcon->open_file_lock);
3694 	return 0;
3695 }
3696 
3697 /* We do not want to update the file size from server for inodes
3698    open for write - to avoid races with writepage extending
3699    the file - in the future we could consider allowing
3700    refreshing the inode only on increases in the file size
3701    but this is tricky to do without racing with writebehind
3702    page caching in the current Linux kernel design */
is_size_safe_to_change(struct cifsInodeInfo * cifsInode,__u64 end_of_file)3703 bool is_size_safe_to_change(struct cifsInodeInfo *cifsInode, __u64 end_of_file)
3704 {
3705 	if (!cifsInode)
3706 		return true;
3707 
3708 	if (is_inode_writable(cifsInode)) {
3709 		/* This inode is open for write at least once */
3710 		struct cifs_sb_info *cifs_sb;
3711 
3712 		cifs_sb = CIFS_SB(cifsInode->vfs_inode.i_sb);
3713 		if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) {
3714 			/* since no page cache to corrupt on directio
3715 			we can change size safely */
3716 			return true;
3717 		}
3718 
3719 		if (i_size_read(&cifsInode->vfs_inode) < end_of_file)
3720 			return true;
3721 
3722 		return false;
3723 	} else
3724 		return true;
3725 }
3726 
cifs_write_begin(struct file * file,struct address_space * mapping,loff_t pos,unsigned len,unsigned flags,struct page ** pagep,void ** fsdata)3727 static int cifs_write_begin(struct file *file, struct address_space *mapping,
3728 			loff_t pos, unsigned len, unsigned flags,
3729 			struct page **pagep, void **fsdata)
3730 {
3731 	int oncethru = 0;
3732 	pgoff_t index = pos >> PAGE_SHIFT;
3733 	loff_t offset = pos & (PAGE_SIZE - 1);
3734 	loff_t page_start = pos & PAGE_MASK;
3735 	loff_t i_size;
3736 	struct page *page;
3737 	int rc = 0;
3738 
3739 	cifs_dbg(FYI, "write_begin from %lld len %d\n", (long long)pos, len);
3740 
3741 start:
3742 	page = grab_cache_page_write_begin(mapping, index, flags);
3743 	if (!page) {
3744 		rc = -ENOMEM;
3745 		goto out;
3746 	}
3747 
3748 	if (PageUptodate(page))
3749 		goto out;
3750 
3751 	/*
3752 	 * If we write a full page it will be up to date, no need to read from
3753 	 * the server. If the write is short, we'll end up doing a sync write
3754 	 * instead.
3755 	 */
3756 	if (len == PAGE_SIZE)
3757 		goto out;
3758 
3759 	/*
3760 	 * optimize away the read when we have an oplock, and we're not
3761 	 * expecting to use any of the data we'd be reading in. That
3762 	 * is, when the page lies beyond the EOF, or straddles the EOF
3763 	 * and the write will cover all of the existing data.
3764 	 */
3765 	if (CIFS_CACHE_READ(CIFS_I(mapping->host))) {
3766 		i_size = i_size_read(mapping->host);
3767 		if (page_start >= i_size ||
3768 		    (offset == 0 && (pos + len) >= i_size)) {
3769 			zero_user_segments(page, 0, offset,
3770 					   offset + len,
3771 					   PAGE_SIZE);
3772 			/*
3773 			 * PageChecked means that the parts of the page
3774 			 * to which we're not writing are considered up
3775 			 * to date. Once the data is copied to the
3776 			 * page, it can be set uptodate.
3777 			 */
3778 			SetPageChecked(page);
3779 			goto out;
3780 		}
3781 	}
3782 
3783 	if ((file->f_flags & O_ACCMODE) != O_WRONLY && !oncethru) {
3784 		/*
3785 		 * might as well read a page, it is fast enough. If we get
3786 		 * an error, we don't need to return it. cifs_write_end will
3787 		 * do a sync write instead since PG_uptodate isn't set.
3788 		 */
3789 		cifs_readpage_worker(file, page, &page_start);
3790 		put_page(page);
3791 		oncethru = 1;
3792 		goto start;
3793 	} else {
3794 		/* we could try using another file handle if there is one -
3795 		   but how would we lock it to prevent close of that handle
3796 		   racing with this read? In any case
3797 		   this will be written out by write_end so is fine */
3798 	}
3799 out:
3800 	*pagep = page;
3801 	return rc;
3802 }
3803 
cifs_release_page(struct page * page,gfp_t gfp)3804 static int cifs_release_page(struct page *page, gfp_t gfp)
3805 {
3806 	if (PagePrivate(page))
3807 		return 0;
3808 
3809 	return cifs_fscache_release_page(page, gfp);
3810 }
3811 
cifs_invalidate_page(struct page * page,unsigned int offset,unsigned int length)3812 static void cifs_invalidate_page(struct page *page, unsigned int offset,
3813 				 unsigned int length)
3814 {
3815 	struct cifsInodeInfo *cifsi = CIFS_I(page->mapping->host);
3816 
3817 	if (offset == 0 && length == PAGE_SIZE)
3818 		cifs_fscache_invalidate_page(page, &cifsi->vfs_inode);
3819 }
3820 
cifs_launder_page(struct page * page)3821 static int cifs_launder_page(struct page *page)
3822 {
3823 	int rc = 0;
3824 	loff_t range_start = page_offset(page);
3825 	loff_t range_end = range_start + (loff_t)(PAGE_SIZE - 1);
3826 	struct writeback_control wbc = {
3827 		.sync_mode = WB_SYNC_ALL,
3828 		.nr_to_write = 0,
3829 		.range_start = range_start,
3830 		.range_end = range_end,
3831 	};
3832 
3833 	cifs_dbg(FYI, "Launder page: %p\n", page);
3834 
3835 	if (clear_page_dirty_for_io(page))
3836 		rc = cifs_writepage_locked(page, &wbc);
3837 
3838 	cifs_fscache_invalidate_page(page, page->mapping->host);
3839 	return rc;
3840 }
3841 
cifs_oplock_break(struct work_struct * work)3842 void cifs_oplock_break(struct work_struct *work)
3843 {
3844 	struct cifsFileInfo *cfile = container_of(work, struct cifsFileInfo,
3845 						  oplock_break);
3846 	struct inode *inode = d_inode(cfile->dentry);
3847 	struct cifsInodeInfo *cinode = CIFS_I(inode);
3848 	struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
3849 	struct TCP_Server_Info *server = tcon->ses->server;
3850 	int rc = 0;
3851 
3852 	wait_on_bit(&cinode->flags, CIFS_INODE_PENDING_WRITERS,
3853 			TASK_UNINTERRUPTIBLE);
3854 
3855 	server->ops->downgrade_oplock(server, cinode,
3856 		test_bit(CIFS_INODE_DOWNGRADE_OPLOCK_TO_L2, &cinode->flags));
3857 
3858 	if (!CIFS_CACHE_WRITE(cinode) && CIFS_CACHE_READ(cinode) &&
3859 						cifs_has_mand_locks(cinode)) {
3860 		cifs_dbg(FYI, "Reset oplock to None for inode=%p due to mand locks\n",
3861 			 inode);
3862 		cinode->oplock = 0;
3863 	}
3864 
3865 	if (inode && S_ISREG(inode->i_mode)) {
3866 		if (CIFS_CACHE_READ(cinode))
3867 			break_lease(inode, O_RDONLY);
3868 		else
3869 			break_lease(inode, O_WRONLY);
3870 		rc = filemap_fdatawrite(inode->i_mapping);
3871 		if (!CIFS_CACHE_READ(cinode)) {
3872 			rc = filemap_fdatawait(inode->i_mapping);
3873 			mapping_set_error(inode->i_mapping, rc);
3874 			cifs_zap_mapping(inode);
3875 		}
3876 		cifs_dbg(FYI, "Oplock flush inode %p rc %d\n", inode, rc);
3877 	}
3878 
3879 	rc = cifs_push_locks(cfile);
3880 	if (rc)
3881 		cifs_dbg(VFS, "Push locks rc = %d\n", rc);
3882 
3883 	/*
3884 	 * releasing stale oplock after recent reconnect of smb session using
3885 	 * a now incorrect file handle is not a data integrity issue but do
3886 	 * not bother sending an oplock release if session to server still is
3887 	 * disconnected since oplock already released by the server
3888 	 */
3889 	if (!cfile->oplock_break_cancelled) {
3890 		rc = tcon->ses->server->ops->oplock_response(tcon, &cfile->fid,
3891 							     cinode);
3892 		cifs_dbg(FYI, "Oplock release rc = %d\n", rc);
3893 	}
3894 	cifs_done_oplock_break(cinode);
3895 }
3896 
3897 /*
3898  * The presence of cifs_direct_io() in the address space ops vector
3899  * allowes open() O_DIRECT flags which would have failed otherwise.
3900  *
3901  * In the non-cached mode (mount with cache=none), we shunt off direct read and write requests
3902  * so this method should never be called.
3903  *
3904  * Direct IO is not yet supported in the cached mode.
3905  */
3906 static ssize_t
cifs_direct_io(struct kiocb * iocb,struct iov_iter * iter)3907 cifs_direct_io(struct kiocb *iocb, struct iov_iter *iter)
3908 {
3909         /*
3910          * FIXME
3911          * Eventually need to support direct IO for non forcedirectio mounts
3912          */
3913         return -EINVAL;
3914 }
3915 
3916 
3917 const struct address_space_operations cifs_addr_ops = {
3918 	.readpage = cifs_readpage,
3919 	.readpages = cifs_readpages,
3920 	.writepage = cifs_writepage,
3921 	.writepages = cifs_writepages,
3922 	.write_begin = cifs_write_begin,
3923 	.write_end = cifs_write_end,
3924 	.set_page_dirty = __set_page_dirty_nobuffers,
3925 	.releasepage = cifs_release_page,
3926 	.direct_IO = cifs_direct_io,
3927 	.invalidatepage = cifs_invalidate_page,
3928 	.launder_page = cifs_launder_page,
3929 };
3930 
3931 /*
3932  * cifs_readpages requires the server to support a buffer large enough to
3933  * contain the header plus one complete page of data.  Otherwise, we need
3934  * to leave cifs_readpages out of the address space operations.
3935  */
3936 const struct address_space_operations cifs_addr_ops_smallbuf = {
3937 	.readpage = cifs_readpage,
3938 	.writepage = cifs_writepage,
3939 	.writepages = cifs_writepages,
3940 	.write_begin = cifs_write_begin,
3941 	.write_end = cifs_write_end,
3942 	.set_page_dirty = __set_page_dirty_nobuffers,
3943 	.releasepage = cifs_release_page,
3944 	.invalidatepage = cifs_invalidate_page,
3945 	.launder_page = cifs_launder_page,
3946 };
3947