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