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