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