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