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