[CIFS] Fix minor checkpatch warning and update cifs version
[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>
1da177e4
LT
35#include <asm/div64.h>
36#include "cifsfs.h"
37#include "cifspdu.h"
38#include "cifsglob.h"
39#include "cifsproto.h"
40#include "cifs_unicode.h"
41#include "cifs_debug.h"
42#include "cifs_fs_sb.h"
9451a9a5 43#include "fscache.h"
1da177e4 44
1da177e4
LT
45static inline int cifs_convert_flags(unsigned int flags)
46{
47 if ((flags & O_ACCMODE) == O_RDONLY)
48 return GENERIC_READ;
49 else if ((flags & O_ACCMODE) == O_WRONLY)
50 return GENERIC_WRITE;
51 else if ((flags & O_ACCMODE) == O_RDWR) {
52 /* GENERIC_ALL is too much permission to request
53 can cause unnecessary access denied on create */
54 /* return GENERIC_ALL; */
55 return (GENERIC_READ | GENERIC_WRITE);
56 }
57
e10f7b55
JL
58 return (READ_CONTROL | FILE_WRITE_ATTRIBUTES | FILE_READ_ATTRIBUTES |
59 FILE_WRITE_EA | FILE_APPEND_DATA | FILE_WRITE_DATA |
60 FILE_READ_DATA);
7fc8f4e9 61}
e10f7b55 62
608712fe 63static u32 cifs_posix_convert_flags(unsigned int flags)
7fc8f4e9 64{
608712fe 65 u32 posix_flags = 0;
e10f7b55 66
7fc8f4e9 67 if ((flags & O_ACCMODE) == O_RDONLY)
608712fe 68 posix_flags = SMB_O_RDONLY;
7fc8f4e9 69 else if ((flags & O_ACCMODE) == O_WRONLY)
608712fe
JL
70 posix_flags = SMB_O_WRONLY;
71 else if ((flags & O_ACCMODE) == O_RDWR)
72 posix_flags = SMB_O_RDWR;
73
74 if (flags & O_CREAT)
75 posix_flags |= SMB_O_CREAT;
76 if (flags & O_EXCL)
77 posix_flags |= SMB_O_EXCL;
78 if (flags & O_TRUNC)
79 posix_flags |= SMB_O_TRUNC;
80 /* be safe and imply O_SYNC for O_DSYNC */
6b2f3d1f 81 if (flags & O_DSYNC)
608712fe 82 posix_flags |= SMB_O_SYNC;
7fc8f4e9 83 if (flags & O_DIRECTORY)
608712fe 84 posix_flags |= SMB_O_DIRECTORY;
7fc8f4e9 85 if (flags & O_NOFOLLOW)
608712fe 86 posix_flags |= SMB_O_NOFOLLOW;
7fc8f4e9 87 if (flags & O_DIRECT)
608712fe 88 posix_flags |= SMB_O_DIRECT;
7fc8f4e9
SF
89
90 return posix_flags;
1da177e4
LT
91}
92
93static inline int cifs_get_disposition(unsigned int flags)
94{
95 if ((flags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL))
96 return FILE_CREATE;
97 else if ((flags & (O_CREAT | O_TRUNC)) == (O_CREAT | O_TRUNC))
98 return FILE_OVERWRITE_IF;
99 else if ((flags & O_CREAT) == O_CREAT)
100 return FILE_OPEN_IF;
55aa2e09
SF
101 else if ((flags & O_TRUNC) == O_TRUNC)
102 return FILE_OVERWRITE;
1da177e4
LT
103 else
104 return FILE_OPEN;
105}
106
db460242 107static inline int cifs_open_inode_helper(struct inode *inode,
a347ecb2 108 struct cifsTconInfo *pTcon, __u32 oplock, FILE_ALL_INFO *buf,
1da177e4
LT
109 char *full_path, int xid)
110{
db460242 111 struct cifsInodeInfo *pCifsInode = CIFS_I(inode);
1da177e4
LT
112 struct timespec temp;
113 int rc;
114
1da177e4
LT
115 if (pCifsInode->clientCanCacheRead) {
116 /* we have the inode open somewhere else
117 no need to discard cache data */
118 goto client_can_cache;
119 }
120
121 /* BB need same check in cifs_create too? */
122 /* if not oplocked, invalidate inode pages if mtime or file
123 size changed */
07119a4d 124 temp = cifs_NTtimeToUnix(buf->LastWriteTime);
db460242
JL
125 if (timespec_equal(&inode->i_mtime, &temp) &&
126 (inode->i_size ==
1da177e4 127 (loff_t)le64_to_cpu(buf->EndOfFile))) {
b6b38f70 128 cFYI(1, "inode unchanged on server");
1da177e4 129 } else {
db460242 130 if (inode->i_mapping) {
ff215713
SF
131 /* BB no need to lock inode until after invalidate
132 since namei code should already have it locked? */
db460242 133 rc = filemap_write_and_wait(inode->i_mapping);
cea21805 134 if (rc != 0)
db460242 135 pCifsInode->write_behind_rc = rc;
1da177e4 136 }
b6b38f70
JP
137 cFYI(1, "invalidating remote inode since open detected it "
138 "changed");
db460242 139 invalidate_remote_inode(inode);
1da177e4
LT
140 }
141
142client_can_cache:
c18c842b 143 if (pTcon->unix_ext)
db460242
JL
144 rc = cifs_get_inode_info_unix(&inode, full_path, inode->i_sb,
145 xid);
1da177e4 146 else
db460242
JL
147 rc = cifs_get_inode_info(&inode, full_path, buf, inode->i_sb,
148 xid, NULL);
1da177e4 149
a347ecb2 150 if ((oplock & 0xF) == OPLOCK_EXCLUSIVE) {
4b18f2a9
SF
151 pCifsInode->clientCanCacheAll = true;
152 pCifsInode->clientCanCacheRead = true;
db460242 153 cFYI(1, "Exclusive Oplock granted on inode %p", inode);
a347ecb2 154 } else if ((oplock & 0xF) == OPLOCK_READ)
4b18f2a9 155 pCifsInode->clientCanCacheRead = true;
1da177e4
LT
156
157 return rc;
158}
159
608712fe
JL
160int cifs_posix_open(char *full_path, struct inode **pinode,
161 struct super_block *sb, int mode, unsigned int f_flags,
162 __u32 *poplock, __u16 *pnetfid, int xid)
163{
164 int rc;
165 FILE_UNIX_BASIC_INFO *presp_data;
166 __u32 posix_flags = 0;
167 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
168 struct cifs_fattr fattr;
169 struct tcon_link *tlink;
170 struct cifsTconInfo *tcon;
171
172 cFYI(1, "posix open %s", full_path);
173
174 presp_data = kzalloc(sizeof(FILE_UNIX_BASIC_INFO), GFP_KERNEL);
175 if (presp_data == NULL)
176 return -ENOMEM;
177
178 tlink = cifs_sb_tlink(cifs_sb);
179 if (IS_ERR(tlink)) {
180 rc = PTR_ERR(tlink);
181 goto posix_open_ret;
182 }
183
184 tcon = tlink_tcon(tlink);
185 mode &= ~current_umask();
186
187 posix_flags = cifs_posix_convert_flags(f_flags);
188 rc = CIFSPOSIXCreate(xid, tcon, posix_flags, mode, pnetfid, presp_data,
189 poplock, full_path, cifs_sb->local_nls,
190 cifs_sb->mnt_cifs_flags &
191 CIFS_MOUNT_MAP_SPECIAL_CHR);
192 cifs_put_tlink(tlink);
193
194 if (rc)
195 goto posix_open_ret;
196
197 if (presp_data->Type == cpu_to_le32(-1))
198 goto posix_open_ret; /* open ok, caller does qpathinfo */
199
200 if (!pinode)
201 goto posix_open_ret; /* caller does not need info */
202
203 cifs_unix_basic_to_fattr(&fattr, presp_data, cifs_sb);
204
205 /* get new inode and set it up */
206 if (*pinode == NULL) {
207 cifs_fill_uniqueid(sb, &fattr);
208 *pinode = cifs_iget(sb, &fattr);
209 if (!*pinode) {
210 rc = -ENOMEM;
211 goto posix_open_ret;
212 }
213 } else {
214 cifs_fattr_to_inode(*pinode, &fattr);
215 }
216
217posix_open_ret:
218 kfree(presp_data);
219 return rc;
220}
221
15ecb436
JL
222struct cifsFileInfo *
223cifs_new_fileinfo(__u16 fileHandle, struct file *file,
224 struct tcon_link *tlink, __u32 oplock)
225{
226 struct dentry *dentry = file->f_path.dentry;
227 struct inode *inode = dentry->d_inode;
228 struct cifsInodeInfo *pCifsInode = CIFS_I(inode);
229 struct cifsFileInfo *pCifsFile;
230
231 pCifsFile = kzalloc(sizeof(struct cifsFileInfo), GFP_KERNEL);
232 if (pCifsFile == NULL)
233 return pCifsFile;
234
235 pCifsFile->netfid = fileHandle;
236 pCifsFile->pid = current->tgid;
237 pCifsFile->uid = current_fsuid();
238 pCifsFile->dentry = dget(dentry);
239 pCifsFile->f_flags = file->f_flags;
240 pCifsFile->invalidHandle = false;
241 pCifsFile->closePend = false;
242 pCifsFile->tlink = cifs_get_tlink(tlink);
243 mutex_init(&pCifsFile->fh_mutex);
244 mutex_init(&pCifsFile->lock_mutex);
245 INIT_LIST_HEAD(&pCifsFile->llist);
246 atomic_set(&pCifsFile->count, 1);
247 INIT_WORK(&pCifsFile->oplock_break, cifs_oplock_break);
248
249 write_lock(&GlobalSMBSeslock);
250 list_add(&pCifsFile->tlist, &(tlink_tcon(tlink)->openFileList));
251 /* if readable file instance put first in list*/
252 if (file->f_mode & FMODE_READ)
253 list_add(&pCifsFile->flist, &pCifsInode->openFileList);
254 else
255 list_add_tail(&pCifsFile->flist, &pCifsInode->openFileList);
256 write_unlock(&GlobalSMBSeslock);
257
258 if ((oplock & 0xF) == OPLOCK_EXCLUSIVE) {
259 pCifsInode->clientCanCacheAll = true;
260 pCifsInode->clientCanCacheRead = true;
261 cFYI(1, "Exclusive Oplock inode %p", inode);
262 } else if ((oplock & 0xF) == OPLOCK_READ)
263 pCifsInode->clientCanCacheRead = true;
264
265 file->private_data = pCifsFile;
266 return pCifsFile;
267}
268
1da177e4
LT
269int cifs_open(struct inode *inode, struct file *file)
270{
271 int rc = -EACCES;
590a3fe0
JL
272 int xid;
273 __u32 oplock;
1da177e4 274 struct cifs_sb_info *cifs_sb;
276a74a4 275 struct cifsTconInfo *tcon;
7ffec372 276 struct tcon_link *tlink;
6ca9f3ba 277 struct cifsFileInfo *pCifsFile = NULL;
1da177e4 278 struct cifsInodeInfo *pCifsInode;
1da177e4
LT
279 char *full_path = NULL;
280 int desiredAccess;
281 int disposition;
282 __u16 netfid;
283 FILE_ALL_INFO *buf = NULL;
284
285 xid = GetXid();
286
287 cifs_sb = CIFS_SB(inode->i_sb);
7ffec372
JL
288 tlink = cifs_sb_tlink(cifs_sb);
289 if (IS_ERR(tlink)) {
290 FreeXid(xid);
291 return PTR_ERR(tlink);
292 }
293 tcon = tlink_tcon(tlink);
1da177e4 294
a6ce4932 295 pCifsInode = CIFS_I(file->f_path.dentry->d_inode);
1da177e4 296
e6a00296 297 full_path = build_path_from_dentry(file->f_path.dentry);
1da177e4 298 if (full_path == NULL) {
0f3bc09e 299 rc = -ENOMEM;
232341ba 300 goto out;
1da177e4
LT
301 }
302
b6b38f70
JP
303 cFYI(1, "inode = 0x%p file flags are 0x%x for %s",
304 inode, file->f_flags, full_path);
276a74a4
SF
305
306 if (oplockEnabled)
307 oplock = REQ_OPLOCK;
308 else
309 oplock = 0;
310
64cc2c63
SF
311 if (!tcon->broken_posix_open && tcon->unix_ext &&
312 (tcon->ses->capabilities & CAP_UNIX) &&
276a74a4
SF
313 (CIFS_UNIX_POSIX_PATH_OPS_CAP &
314 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
276a74a4 315 /* can not refresh inode info since size could be stale */
2422f676 316 rc = cifs_posix_open(full_path, &inode, inode->i_sb,
fa588e0c 317 cifs_sb->mnt_file_mode /* ignored */,
608712fe 318 file->f_flags, &oplock, &netfid, xid);
276a74a4 319 if (rc == 0) {
b6b38f70 320 cFYI(1, "posix open succeeded");
47c78b7f 321
abfe1eed
JL
322 pCifsFile = cifs_new_fileinfo(netfid, file, tlink,
323 oplock);
2422f676
JL
324 if (pCifsFile == NULL) {
325 CIFSSMBClose(xid, tcon, netfid);
326 rc = -ENOMEM;
2422f676 327 }
9451a9a5
SJ
328
329 cifs_fscache_set_inode_cookie(inode, file);
330
276a74a4 331 goto out;
64cc2c63
SF
332 } else if ((rc == -EINVAL) || (rc == -EOPNOTSUPP)) {
333 if (tcon->ses->serverNOS)
b6b38f70 334 cERROR(1, "server %s of type %s returned"
64cc2c63
SF
335 " unexpected error on SMB posix open"
336 ", disabling posix open support."
337 " Check if server update available.",
338 tcon->ses->serverName,
b6b38f70 339 tcon->ses->serverNOS);
64cc2c63 340 tcon->broken_posix_open = true;
276a74a4
SF
341 } else if ((rc != -EIO) && (rc != -EREMOTE) &&
342 (rc != -EOPNOTSUPP)) /* path not found or net err */
343 goto out;
64cc2c63
SF
344 /* else fallthrough to retry open the old way on network i/o
345 or DFS errors */
276a74a4
SF
346 }
347
1da177e4
LT
348 desiredAccess = cifs_convert_flags(file->f_flags);
349
350/*********************************************************************
351 * open flag mapping table:
fb8c4b14 352 *
1da177e4 353 * POSIX Flag CIFS Disposition
fb8c4b14 354 * ---------- ----------------
1da177e4
LT
355 * O_CREAT FILE_OPEN_IF
356 * O_CREAT | O_EXCL FILE_CREATE
357 * O_CREAT | O_TRUNC FILE_OVERWRITE_IF
358 * O_TRUNC FILE_OVERWRITE
359 * none of the above FILE_OPEN
360 *
361 * Note that there is not a direct match between disposition
fb8c4b14 362 * FILE_SUPERSEDE (ie create whether or not file exists although
1da177e4
LT
363 * O_CREAT | O_TRUNC is similar but truncates the existing
364 * file rather than creating a new file as FILE_SUPERSEDE does
365 * (which uses the attributes / metadata passed in on open call)
366 *?
fb8c4b14 367 *? O_SYNC is a reasonable match to CIFS writethrough flag
1da177e4
LT
368 *? and the read write flags match reasonably. O_LARGEFILE
369 *? is irrelevant because largefile support is always used
370 *? by this client. Flags O_APPEND, O_DIRECT, O_DIRECTORY,
371 * O_FASYNC, O_NOFOLLOW, O_NONBLOCK need further investigation
372 *********************************************************************/
373
374 disposition = cifs_get_disposition(file->f_flags);
375
1da177e4
LT
376 /* BB pass O_SYNC flag through on file attributes .. BB */
377
378 /* Also refresh inode by passing in file_info buf returned by SMBOpen
379 and calling get_inode_info with returned buf (at least helps
380 non-Unix server case) */
381
fb8c4b14
SF
382 /* BB we can not do this if this is the second open of a file
383 and the first handle has writebehind data, we might be
1da177e4
LT
384 able to simply do a filemap_fdatawrite/filemap_fdatawait first */
385 buf = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
386 if (!buf) {
387 rc = -ENOMEM;
388 goto out;
389 }
5bafd765 390
a6e8a845 391 if (tcon->ses->capabilities & CAP_NT_SMBS)
276a74a4 392 rc = CIFSSMBOpen(xid, tcon, full_path, disposition,
5bafd765 393 desiredAccess, CREATE_NOT_DIR, &netfid, &oplock, buf,
737b758c
SF
394 cifs_sb->local_nls, cifs_sb->mnt_cifs_flags
395 & CIFS_MOUNT_MAP_SPECIAL_CHR);
5bafd765
SF
396 else
397 rc = -EIO; /* no NT SMB support fall into legacy open below */
398
a9d02ad4
SF
399 if (rc == -EIO) {
400 /* Old server, try legacy style OpenX */
276a74a4 401 rc = SMBLegacyOpen(xid, tcon, full_path, disposition,
a9d02ad4
SF
402 desiredAccess, CREATE_NOT_DIR, &netfid, &oplock, buf,
403 cifs_sb->local_nls, cifs_sb->mnt_cifs_flags
404 & CIFS_MOUNT_MAP_SPECIAL_CHR);
405 }
1da177e4 406 if (rc) {
b6b38f70 407 cFYI(1, "cifs_open returned 0x%x", rc);
1da177e4
LT
408 goto out;
409 }
3321b791 410
a347ecb2 411 rc = cifs_open_inode_helper(inode, tcon, oplock, buf, full_path, xid);
47c78b7f
JL
412 if (rc != 0)
413 goto out;
414
abfe1eed 415 pCifsFile = cifs_new_fileinfo(netfid, file, tlink, oplock);
6ca9f3ba 416 if (pCifsFile == NULL) {
1da177e4
LT
417 rc = -ENOMEM;
418 goto out;
419 }
1da177e4 420
9451a9a5
SJ
421 cifs_fscache_set_inode_cookie(inode, file);
422
fb8c4b14 423 if (oplock & CIFS_CREATE_ACTION) {
1da177e4
LT
424 /* time to set mode which we can not set earlier due to
425 problems creating new read-only files */
276a74a4 426 if (tcon->unix_ext) {
4e1e7fb9
JL
427 struct cifs_unix_set_info_args args = {
428 .mode = inode->i_mode,
429 .uid = NO_CHANGE_64,
430 .gid = NO_CHANGE_64,
431 .ctime = NO_CHANGE_64,
432 .atime = NO_CHANGE_64,
433 .mtime = NO_CHANGE_64,
434 .device = 0,
435 };
01ea95e3
JL
436 CIFSSMBUnixSetPathInfo(xid, tcon, full_path, &args,
437 cifs_sb->local_nls,
438 cifs_sb->mnt_cifs_flags &
737b758c 439 CIFS_MOUNT_MAP_SPECIAL_CHR);
1da177e4
LT
440 }
441 }
442
443out:
444 kfree(buf);
445 kfree(full_path);
446 FreeXid(xid);
7ffec372 447 cifs_put_tlink(tlink);
1da177e4
LT
448 return rc;
449}
450
0418726b 451/* Try to reacquire byte range locks that were released when session */
1da177e4
LT
452/* to server was lost */
453static int cifs_relock_file(struct cifsFileInfo *cifsFile)
454{
455 int rc = 0;
456
457/* BB list all locks open on this file and relock */
458
459 return rc;
460}
461
15886177 462static int cifs_reopen_file(struct cifsFileInfo *pCifsFile, bool can_flush)
1da177e4
LT
463{
464 int rc = -EACCES;
590a3fe0
JL
465 int xid;
466 __u32 oplock;
1da177e4 467 struct cifs_sb_info *cifs_sb;
7fc8f4e9 468 struct cifsTconInfo *tcon;
1da177e4 469 struct cifsInodeInfo *pCifsInode;
fb8c4b14 470 struct inode *inode;
1da177e4
LT
471 char *full_path = NULL;
472 int desiredAccess;
473 int disposition = FILE_OPEN;
474 __u16 netfid;
475
1da177e4 476 xid = GetXid();
f0a71eb8 477 mutex_lock(&pCifsFile->fh_mutex);
4b18f2a9 478 if (!pCifsFile->invalidHandle) {
f0a71eb8 479 mutex_unlock(&pCifsFile->fh_mutex);
0f3bc09e 480 rc = 0;
1da177e4 481 FreeXid(xid);
0f3bc09e 482 return rc;
1da177e4
LT
483 }
484
15886177 485 inode = pCifsFile->dentry->d_inode;
1da177e4 486 cifs_sb = CIFS_SB(inode->i_sb);
13cfb733 487 tcon = tlink_tcon(pCifsFile->tlink);
3a9f462f 488
1da177e4
LT
489/* can not grab rename sem here because various ops, including
490 those that already have the rename sem can end up causing writepage
491 to get called and if the server was down that means we end up here,
492 and we can never tell if the caller already has the rename_sem */
15886177 493 full_path = build_path_from_dentry(pCifsFile->dentry);
1da177e4 494 if (full_path == NULL) {
3a9f462f 495 rc = -ENOMEM;
f0a71eb8 496 mutex_unlock(&pCifsFile->fh_mutex);
1da177e4 497 FreeXid(xid);
3a9f462f 498 return rc;
1da177e4
LT
499 }
500
b6b38f70 501 cFYI(1, "inode = 0x%p file flags 0x%x for %s",
15886177 502 inode, pCifsFile->f_flags, full_path);
1da177e4
LT
503
504 if (oplockEnabled)
505 oplock = REQ_OPLOCK;
506 else
4b18f2a9 507 oplock = 0;
1da177e4 508
7fc8f4e9
SF
509 if (tcon->unix_ext && (tcon->ses->capabilities & CAP_UNIX) &&
510 (CIFS_UNIX_POSIX_PATH_OPS_CAP &
511 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
608712fe
JL
512
513 /*
514 * O_CREAT, O_EXCL and O_TRUNC already had their effect on the
515 * original open. Must mask them off for a reopen.
516 */
15886177
JL
517 unsigned int oflags = pCifsFile->f_flags &
518 ~(O_CREAT | O_EXCL | O_TRUNC);
608712fe 519
2422f676 520 rc = cifs_posix_open(full_path, NULL, inode->i_sb,
fa588e0c
SF
521 cifs_sb->mnt_file_mode /* ignored */,
522 oflags, &oplock, &netfid, xid);
7fc8f4e9 523 if (rc == 0) {
b6b38f70 524 cFYI(1, "posix reopen succeeded");
7fc8f4e9
SF
525 goto reopen_success;
526 }
527 /* fallthrough to retry open the old way on errors, especially
528 in the reconnect path it is important to retry hard */
529 }
530
15886177 531 desiredAccess = cifs_convert_flags(pCifsFile->f_flags);
7fc8f4e9 532
1da177e4 533 /* Can not refresh inode by passing in file_info buf to be returned
fb8c4b14
SF
534 by SMBOpen and then calling get_inode_info with returned buf
535 since file might have write behind data that needs to be flushed
1da177e4
LT
536 and server version of file size can be stale. If we knew for sure
537 that inode was not dirty locally we could do this */
538
7fc8f4e9 539 rc = CIFSSMBOpen(xid, tcon, full_path, disposition, desiredAccess,
1da177e4 540 CREATE_NOT_DIR, &netfid, &oplock, NULL,
fb8c4b14 541 cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
737b758c 542 CIFS_MOUNT_MAP_SPECIAL_CHR);
1da177e4 543 if (rc) {
f0a71eb8 544 mutex_unlock(&pCifsFile->fh_mutex);
b6b38f70
JP
545 cFYI(1, "cifs_open returned 0x%x", rc);
546 cFYI(1, "oplock: %d", oplock);
15886177
JL
547 goto reopen_error_exit;
548 }
549
7fc8f4e9 550reopen_success:
15886177
JL
551 pCifsFile->netfid = netfid;
552 pCifsFile->invalidHandle = false;
553 mutex_unlock(&pCifsFile->fh_mutex);
554 pCifsInode = CIFS_I(inode);
555
556 if (can_flush) {
557 rc = filemap_write_and_wait(inode->i_mapping);
558 if (rc != 0)
559 CIFS_I(inode)->write_behind_rc = rc;
560
561 pCifsInode->clientCanCacheAll = false;
562 pCifsInode->clientCanCacheRead = false;
563 if (tcon->unix_ext)
564 rc = cifs_get_inode_info_unix(&inode,
565 full_path, inode->i_sb, xid);
566 else
567 rc = cifs_get_inode_info(&inode,
568 full_path, NULL, inode->i_sb,
569 xid, NULL);
570 } /* else we are writing out data to server already
571 and could deadlock if we tried to flush data, and
572 since we do not know if we have data that would
573 invalidate the current end of file on the server
574 we can not go to the server to get the new inod
575 info */
576 if ((oplock & 0xF) == OPLOCK_EXCLUSIVE) {
577 pCifsInode->clientCanCacheAll = true;
578 pCifsInode->clientCanCacheRead = true;
579 cFYI(1, "Exclusive Oplock granted on inode %p",
580 pCifsFile->dentry->d_inode);
581 } else if ((oplock & 0xF) == OPLOCK_READ) {
582 pCifsInode->clientCanCacheRead = true;
583 pCifsInode->clientCanCacheAll = false;
584 } else {
585 pCifsInode->clientCanCacheRead = false;
586 pCifsInode->clientCanCacheAll = false;
1da177e4 587 }
15886177
JL
588 cifs_relock_file(pCifsFile);
589
590reopen_error_exit:
1da177e4
LT
591 kfree(full_path);
592 FreeXid(xid);
593 return rc;
594}
595
596int cifs_close(struct inode *inode, struct file *file)
597{
598 int rc = 0;
15745320 599 int xid, timeout;
1da177e4
LT
600 struct cifs_sb_info *cifs_sb;
601 struct cifsTconInfo *pTcon;
c21dfb69 602 struct cifsFileInfo *pSMBFile = file->private_data;
1da177e4
LT
603
604 xid = GetXid();
605
606 cifs_sb = CIFS_SB(inode->i_sb);
13cfb733 607 pTcon = tlink_tcon(pSMBFile->tlink);
1da177e4 608 if (pSMBFile) {
7ee1af76 609 struct cifsLockInfo *li, *tmp;
ddb4cbfc 610 write_lock(&GlobalSMBSeslock);
4b18f2a9 611 pSMBFile->closePend = true;
1da177e4
LT
612 if (pTcon) {
613 /* no sense reconnecting to close a file that is
614 already closed */
3b795210 615 if (!pTcon->need_reconnect) {
ddb4cbfc 616 write_unlock(&GlobalSMBSeslock);
15745320 617 timeout = 2;
6ab409b5 618 while ((atomic_read(&pSMBFile->count) != 1)
15745320 619 && (timeout <= 2048)) {
23e7dd7d
SF
620 /* Give write a better chance to get to
621 server ahead of the close. We do not
622 want to add a wait_q here as it would
623 increase the memory utilization as
624 the struct would be in each open file,
fb8c4b14 625 but this should give enough time to
23e7dd7d 626 clear the socket */
b6b38f70 627 cFYI(DBG2, "close delay, write pending");
23e7dd7d
SF
628 msleep(timeout);
629 timeout *= 4;
4891d539 630 }
ddb4cbfc
SF
631 if (!pTcon->need_reconnect &&
632 !pSMBFile->invalidHandle)
633 rc = CIFSSMBClose(xid, pTcon,
1da177e4 634 pSMBFile->netfid);
ddb4cbfc
SF
635 } else
636 write_unlock(&GlobalSMBSeslock);
637 } else
638 write_unlock(&GlobalSMBSeslock);
7ee1af76
JA
639
640 /* Delete any outstanding lock records.
641 We'll lose them when the file is closed anyway. */
796e5661 642 mutex_lock(&pSMBFile->lock_mutex);
7ee1af76
JA
643 list_for_each_entry_safe(li, tmp, &pSMBFile->llist, llist) {
644 list_del(&li->llist);
645 kfree(li);
646 }
796e5661 647 mutex_unlock(&pSMBFile->lock_mutex);
7ee1af76 648
cbe0476f 649 write_lock(&GlobalSMBSeslock);
1da177e4
LT
650 list_del(&pSMBFile->flist);
651 list_del(&pSMBFile->tlist);
cbe0476f 652 write_unlock(&GlobalSMBSeslock);
6ab409b5 653 cifsFileInfo_put(file->private_data);
1da177e4
LT
654 file->private_data = NULL;
655 } else
656 rc = -EBADF;
657
4efa53f0 658 read_lock(&GlobalSMBSeslock);
1da177e4 659 if (list_empty(&(CIFS_I(inode)->openFileList))) {
b6b38f70 660 cFYI(1, "closing last open instance for inode %p", inode);
1da177e4
LT
661 /* if the file is not open we do not know if we can cache info
662 on this inode, much less write behind and read ahead */
4b18f2a9
SF
663 CIFS_I(inode)->clientCanCacheRead = false;
664 CIFS_I(inode)->clientCanCacheAll = false;
1da177e4 665 }
4efa53f0 666 read_unlock(&GlobalSMBSeslock);
fb8c4b14 667 if ((rc == 0) && CIFS_I(inode)->write_behind_rc)
1da177e4
LT
668 rc = CIFS_I(inode)->write_behind_rc;
669 FreeXid(xid);
670 return rc;
671}
672
673int cifs_closedir(struct inode *inode, struct file *file)
674{
675 int rc = 0;
676 int xid;
c21dfb69 677 struct cifsFileInfo *pCFileStruct = file->private_data;
1da177e4
LT
678 char *ptmp;
679
b6b38f70 680 cFYI(1, "Closedir inode = 0x%p", inode);
1da177e4
LT
681
682 xid = GetXid();
683
684 if (pCFileStruct) {
13cfb733 685 struct cifsTconInfo *pTcon = tlink_tcon(pCFileStruct->tlink);
1da177e4 686
b6b38f70 687 cFYI(1, "Freeing private data in close dir");
ddb4cbfc 688 write_lock(&GlobalSMBSeslock);
4b18f2a9
SF
689 if (!pCFileStruct->srch_inf.endOfSearch &&
690 !pCFileStruct->invalidHandle) {
691 pCFileStruct->invalidHandle = true;
ddb4cbfc 692 write_unlock(&GlobalSMBSeslock);
1da177e4 693 rc = CIFSFindClose(xid, pTcon, pCFileStruct->netfid);
b6b38f70
JP
694 cFYI(1, "Closing uncompleted readdir with rc %d",
695 rc);
1da177e4
LT
696 /* not much we can do if it fails anyway, ignore rc */
697 rc = 0;
ddb4cbfc
SF
698 } else
699 write_unlock(&GlobalSMBSeslock);
1da177e4
LT
700 ptmp = pCFileStruct->srch_inf.ntwrk_buf_start;
701 if (ptmp) {
b6b38f70 702 cFYI(1, "closedir free smb buf in srch struct");
1da177e4 703 pCFileStruct->srch_inf.ntwrk_buf_start = NULL;
fb8c4b14 704 if (pCFileStruct->srch_inf.smallBuf)
d47d7c1a
SF
705 cifs_small_buf_release(ptmp);
706 else
707 cifs_buf_release(ptmp);
1da177e4 708 }
13cfb733 709 cifs_put_tlink(pCFileStruct->tlink);
1da177e4
LT
710 kfree(file->private_data);
711 file->private_data = NULL;
712 }
713 /* BB can we lock the filestruct while this is going on? */
714 FreeXid(xid);
715 return rc;
716}
717
7ee1af76
JA
718static int store_file_lock(struct cifsFileInfo *fid, __u64 len,
719 __u64 offset, __u8 lockType)
720{
fb8c4b14
SF
721 struct cifsLockInfo *li =
722 kmalloc(sizeof(struct cifsLockInfo), GFP_KERNEL);
7ee1af76
JA
723 if (li == NULL)
724 return -ENOMEM;
725 li->offset = offset;
726 li->length = len;
727 li->type = lockType;
796e5661 728 mutex_lock(&fid->lock_mutex);
7ee1af76 729 list_add(&li->llist, &fid->llist);
796e5661 730 mutex_unlock(&fid->lock_mutex);
7ee1af76
JA
731 return 0;
732}
733
1da177e4
LT
734int cifs_lock(struct file *file, int cmd, struct file_lock *pfLock)
735{
736 int rc, xid;
1da177e4
LT
737 __u32 numLock = 0;
738 __u32 numUnlock = 0;
739 __u64 length;
4b18f2a9 740 bool wait_flag = false;
1da177e4 741 struct cifs_sb_info *cifs_sb;
13a6e42a 742 struct cifsTconInfo *tcon;
08547b03
SF
743 __u16 netfid;
744 __u8 lockType = LOCKING_ANDX_LARGE_FILES;
13a6e42a 745 bool posix_locking = 0;
1da177e4
LT
746
747 length = 1 + pfLock->fl_end - pfLock->fl_start;
748 rc = -EACCES;
749 xid = GetXid();
750
b6b38f70 751 cFYI(1, "Lock parm: 0x%x flockflags: "
1da177e4 752 "0x%x flocktype: 0x%x start: %lld end: %lld",
fb8c4b14 753 cmd, pfLock->fl_flags, pfLock->fl_type, pfLock->fl_start,
b6b38f70 754 pfLock->fl_end);
1da177e4
LT
755
756 if (pfLock->fl_flags & FL_POSIX)
b6b38f70 757 cFYI(1, "Posix");
1da177e4 758 if (pfLock->fl_flags & FL_FLOCK)
b6b38f70 759 cFYI(1, "Flock");
1da177e4 760 if (pfLock->fl_flags & FL_SLEEP) {
b6b38f70 761 cFYI(1, "Blocking lock");
4b18f2a9 762 wait_flag = true;
1da177e4
LT
763 }
764 if (pfLock->fl_flags & FL_ACCESS)
b6b38f70
JP
765 cFYI(1, "Process suspended by mandatory locking - "
766 "not implemented yet");
1da177e4 767 if (pfLock->fl_flags & FL_LEASE)
b6b38f70 768 cFYI(1, "Lease on file - not implemented yet");
fb8c4b14 769 if (pfLock->fl_flags &
1da177e4 770 (~(FL_POSIX | FL_FLOCK | FL_SLEEP | FL_ACCESS | FL_LEASE)))
b6b38f70 771 cFYI(1, "Unknown lock flags 0x%x", pfLock->fl_flags);
1da177e4
LT
772
773 if (pfLock->fl_type == F_WRLCK) {
b6b38f70 774 cFYI(1, "F_WRLCK ");
1da177e4
LT
775 numLock = 1;
776 } else if (pfLock->fl_type == F_UNLCK) {
b6b38f70 777 cFYI(1, "F_UNLCK");
1da177e4 778 numUnlock = 1;
d47d7c1a
SF
779 /* Check if unlock includes more than
780 one lock range */
1da177e4 781 } else if (pfLock->fl_type == F_RDLCK) {
b6b38f70 782 cFYI(1, "F_RDLCK");
1da177e4
LT
783 lockType |= LOCKING_ANDX_SHARED_LOCK;
784 numLock = 1;
785 } else if (pfLock->fl_type == F_EXLCK) {
b6b38f70 786 cFYI(1, "F_EXLCK");
1da177e4
LT
787 numLock = 1;
788 } else if (pfLock->fl_type == F_SHLCK) {
b6b38f70 789 cFYI(1, "F_SHLCK");
1da177e4
LT
790 lockType |= LOCKING_ANDX_SHARED_LOCK;
791 numLock = 1;
792 } else
b6b38f70 793 cFYI(1, "Unknown type of lock");
1da177e4 794
e6a00296 795 cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
13cfb733 796 tcon = tlink_tcon(((struct cifsFileInfo *)file->private_data)->tlink);
1da177e4
LT
797
798 if (file->private_data == NULL) {
0f3bc09e 799 rc = -EBADF;
1da177e4 800 FreeXid(xid);
0f3bc09e 801 return rc;
1da177e4 802 }
08547b03
SF
803 netfid = ((struct cifsFileInfo *)file->private_data)->netfid;
804
13a6e42a
SF
805 if ((tcon->ses->capabilities & CAP_UNIX) &&
806 (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) &&
acc18aa1 807 ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0))
13a6e42a 808 posix_locking = 1;
08547b03
SF
809 /* BB add code here to normalize offset and length to
810 account for negative length which we can not accept over the
811 wire */
1da177e4 812 if (IS_GETLK(cmd)) {
fb8c4b14 813 if (posix_locking) {
08547b03 814 int posix_lock_type;
fb8c4b14 815 if (lockType & LOCKING_ANDX_SHARED_LOCK)
08547b03
SF
816 posix_lock_type = CIFS_RDLCK;
817 else
818 posix_lock_type = CIFS_WRLCK;
13a6e42a 819 rc = CIFSSMBPosixLock(xid, tcon, netfid, 1 /* get */,
fc94cdb9 820 length, pfLock,
08547b03
SF
821 posix_lock_type, wait_flag);
822 FreeXid(xid);
823 return rc;
824 }
825
826 /* BB we could chain these into one lock request BB */
13a6e42a 827 rc = CIFSSMBLock(xid, tcon, netfid, length, pfLock->fl_start,
08547b03 828 0, 1, lockType, 0 /* wait flag */ );
1da177e4 829 if (rc == 0) {
13a6e42a 830 rc = CIFSSMBLock(xid, tcon, netfid, length,
1da177e4
LT
831 pfLock->fl_start, 1 /* numUnlock */ ,
832 0 /* numLock */ , lockType,
833 0 /* wait flag */ );
834 pfLock->fl_type = F_UNLCK;
835 if (rc != 0)
b6b38f70
JP
836 cERROR(1, "Error unlocking previously locked "
837 "range %d during test of lock", rc);
1da177e4
LT
838 rc = 0;
839
840 } else {
841 /* if rc == ERR_SHARING_VIOLATION ? */
f05337c6
PS
842 rc = 0;
843
844 if (lockType & LOCKING_ANDX_SHARED_LOCK) {
845 pfLock->fl_type = F_WRLCK;
846 } else {
847 rc = CIFSSMBLock(xid, tcon, netfid, length,
848 pfLock->fl_start, 0, 1,
849 lockType | LOCKING_ANDX_SHARED_LOCK,
850 0 /* wait flag */);
851 if (rc == 0) {
852 rc = CIFSSMBLock(xid, tcon, netfid,
853 length, pfLock->fl_start, 1, 0,
854 lockType |
855 LOCKING_ANDX_SHARED_LOCK,
856 0 /* wait flag */);
857 pfLock->fl_type = F_RDLCK;
858 if (rc != 0)
f19159dc 859 cERROR(1, "Error unlocking "
f05337c6 860 "previously locked range %d "
f19159dc 861 "during test of lock", rc);
f05337c6
PS
862 rc = 0;
863 } else {
864 pfLock->fl_type = F_WRLCK;
865 rc = 0;
866 }
867 }
1da177e4
LT
868 }
869
870 FreeXid(xid);
871 return rc;
872 }
7ee1af76
JA
873
874 if (!numLock && !numUnlock) {
875 /* if no lock or unlock then nothing
876 to do since we do not know what it is */
877 FreeXid(xid);
878 return -EOPNOTSUPP;
879 }
880
881 if (posix_locking) {
08547b03 882 int posix_lock_type;
fb8c4b14 883 if (lockType & LOCKING_ANDX_SHARED_LOCK)
08547b03
SF
884 posix_lock_type = CIFS_RDLCK;
885 else
886 posix_lock_type = CIFS_WRLCK;
50c2f753 887
fb8c4b14 888 if (numUnlock == 1)
beb84dc8 889 posix_lock_type = CIFS_UNLCK;
7ee1af76 890
13a6e42a 891 rc = CIFSSMBPosixLock(xid, tcon, netfid, 0 /* set */,
fc94cdb9 892 length, pfLock,
08547b03 893 posix_lock_type, wait_flag);
7ee1af76 894 } else {
c21dfb69 895 struct cifsFileInfo *fid = file->private_data;
7ee1af76
JA
896
897 if (numLock) {
13a6e42a 898 rc = CIFSSMBLock(xid, tcon, netfid, length,
fb8c4b14 899 pfLock->fl_start,
7ee1af76
JA
900 0, numLock, lockType, wait_flag);
901
902 if (rc == 0) {
903 /* For Windows locks we must store them. */
904 rc = store_file_lock(fid, length,
905 pfLock->fl_start, lockType);
906 }
907 } else if (numUnlock) {
908 /* For each stored lock that this unlock overlaps
909 completely, unlock it. */
910 int stored_rc = 0;
911 struct cifsLockInfo *li, *tmp;
912
6b70c955 913 rc = 0;
796e5661 914 mutex_lock(&fid->lock_mutex);
7ee1af76
JA
915 list_for_each_entry_safe(li, tmp, &fid->llist, llist) {
916 if (pfLock->fl_start <= li->offset &&
c19eb710 917 (pfLock->fl_start + length) >=
39db810c 918 (li->offset + li->length)) {
13a6e42a 919 stored_rc = CIFSSMBLock(xid, tcon,
fb8c4b14 920 netfid,
7ee1af76 921 li->length, li->offset,
4b18f2a9 922 1, 0, li->type, false);
7ee1af76
JA
923 if (stored_rc)
924 rc = stored_rc;
2c964d1f
PS
925 else {
926 list_del(&li->llist);
927 kfree(li);
928 }
7ee1af76
JA
929 }
930 }
796e5661 931 mutex_unlock(&fid->lock_mutex);
7ee1af76
JA
932 }
933 }
934
d634cc15 935 if (pfLock->fl_flags & FL_POSIX)
1da177e4
LT
936 posix_lock_file_wait(file, pfLock);
937 FreeXid(xid);
938 return rc;
939}
940
fbec9ab9
JL
941/*
942 * Set the timeout on write requests past EOF. For some servers (Windows)
943 * these calls can be very long.
944 *
945 * If we're writing >10M past the EOF we give a 180s timeout. Anything less
946 * than that gets a 45s timeout. Writes not past EOF get 15s timeouts.
947 * The 10M cutoff is totally arbitrary. A better scheme for this would be
948 * welcome if someone wants to suggest one.
949 *
950 * We may be able to do a better job with this if there were some way to
951 * declare that a file should be sparse.
952 */
953static int
954cifs_write_timeout(struct cifsInodeInfo *cifsi, loff_t offset)
955{
956 if (offset <= cifsi->server_eof)
957 return CIFS_STD_OP;
958 else if (offset > (cifsi->server_eof + (10 * 1024 * 1024)))
959 return CIFS_VLONG_OP;
960 else
961 return CIFS_LONG_OP;
962}
963
964/* update the file size (if needed) after a write */
965static void
966cifs_update_eof(struct cifsInodeInfo *cifsi, loff_t offset,
967 unsigned int bytes_written)
968{
969 loff_t end_of_write = offset + bytes_written;
970
971 if (end_of_write > cifsi->server_eof)
972 cifsi->server_eof = end_of_write;
973}
974
1da177e4
LT
975ssize_t cifs_user_write(struct file *file, const char __user *write_data,
976 size_t write_size, loff_t *poffset)
977{
978 int rc = 0;
979 unsigned int bytes_written = 0;
980 unsigned int total_written;
981 struct cifs_sb_info *cifs_sb;
982 struct cifsTconInfo *pTcon;
983 int xid, long_op;
984 struct cifsFileInfo *open_file;
fbec9ab9 985 struct cifsInodeInfo *cifsi = CIFS_I(file->f_path.dentry->d_inode);
1da177e4 986
e6a00296 987 cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
1da177e4 988
b6b38f70
JP
989 /* cFYI(1, " write %d bytes to offset %lld of %s", write_size,
990 *poffset, file->f_path.dentry->d_name.name); */
1da177e4
LT
991
992 if (file->private_data == NULL)
993 return -EBADF;
ba00ba64 994
c21dfb69 995 open_file = file->private_data;
13cfb733 996 pTcon = tlink_tcon(open_file->tlink);
50c2f753 997
838726c4
JL
998 rc = generic_write_checks(file, poffset, &write_size, 0);
999 if (rc)
1000 return rc;
1001
1da177e4 1002 xid = GetXid();
1da177e4 1003
fbec9ab9 1004 long_op = cifs_write_timeout(cifsi, *poffset);
1da177e4
LT
1005 for (total_written = 0; write_size > total_written;
1006 total_written += bytes_written) {
1007 rc = -EAGAIN;
1008 while (rc == -EAGAIN) {
1009 if (file->private_data == NULL) {
1010 /* file has been closed on us */
1011 FreeXid(xid);
1012 /* if we have gotten here we have written some data
1013 and blocked, and the file has been freed on us while
1014 we blocked so return what we managed to write */
1015 return total_written;
fb8c4b14 1016 }
1da177e4
LT
1017 if (open_file->closePend) {
1018 FreeXid(xid);
1019 if (total_written)
1020 return total_written;
1021 else
1022 return -EBADF;
1023 }
1024 if (open_file->invalidHandle) {
1da177e4
LT
1025 /* we could deadlock if we called
1026 filemap_fdatawait from here so tell
1027 reopen_file not to flush data to server
1028 now */
15886177 1029 rc = cifs_reopen_file(open_file, false);
1da177e4
LT
1030 if (rc != 0)
1031 break;
1032 }
1033
1034 rc = CIFSSMBWrite(xid, pTcon,
1035 open_file->netfid,
1036 min_t(const int, cifs_sb->wsize,
1037 write_size - total_written),
1038 *poffset, &bytes_written,
1039 NULL, write_data + total_written, long_op);
1040 }
1041 if (rc || (bytes_written == 0)) {
1042 if (total_written)
1043 break;
1044 else {
1045 FreeXid(xid);
1046 return rc;
1047 }
fbec9ab9
JL
1048 } else {
1049 cifs_update_eof(cifsi, *poffset, bytes_written);
1da177e4 1050 *poffset += bytes_written;
fbec9ab9 1051 }
133672ef 1052 long_op = CIFS_STD_OP; /* subsequent writes fast -
1da177e4
LT
1053 15 seconds is plenty */
1054 }
1055
a4544347 1056 cifs_stats_bytes_written(pTcon, total_written);
1da177e4
LT
1057
1058 /* since the write may have blocked check these pointers again */
3677db10
SF
1059 if ((file->f_path.dentry) && (file->f_path.dentry->d_inode)) {
1060 struct inode *inode = file->f_path.dentry->d_inode;
fb8c4b14
SF
1061/* Do not update local mtime - server will set its actual value on write
1062 * inode->i_ctime = inode->i_mtime =
3677db10
SF
1063 * current_fs_time(inode->i_sb);*/
1064 if (total_written > 0) {
1065 spin_lock(&inode->i_lock);
1066 if (*poffset > file->f_path.dentry->d_inode->i_size)
1067 i_size_write(file->f_path.dentry->d_inode,
1da177e4 1068 *poffset);
3677db10 1069 spin_unlock(&inode->i_lock);
1da177e4 1070 }
fb8c4b14 1071 mark_inode_dirty_sync(file->f_path.dentry->d_inode);
1da177e4
LT
1072 }
1073 FreeXid(xid);
1074 return total_written;
1075}
1076
7da4b49a
JL
1077static ssize_t cifs_write(struct cifsFileInfo *open_file,
1078 const char *write_data, size_t write_size,
1079 loff_t *poffset)
1da177e4
LT
1080{
1081 int rc = 0;
1082 unsigned int bytes_written = 0;
1083 unsigned int total_written;
1084 struct cifs_sb_info *cifs_sb;
1085 struct cifsTconInfo *pTcon;
1086 int xid, long_op;
7da4b49a
JL
1087 struct dentry *dentry = open_file->dentry;
1088 struct cifsInodeInfo *cifsi = CIFS_I(dentry->d_inode);
1da177e4 1089
7da4b49a 1090 cifs_sb = CIFS_SB(dentry->d_sb);
1da177e4 1091
b6b38f70 1092 cFYI(1, "write %zd bytes to offset %lld of %s", write_size,
7da4b49a 1093 *poffset, dentry->d_name.name);
1da177e4 1094
13cfb733 1095 pTcon = tlink_tcon(open_file->tlink);
50c2f753 1096
1da177e4 1097 xid = GetXid();
1da177e4 1098
fbec9ab9 1099 long_op = cifs_write_timeout(cifsi, *poffset);
1da177e4
LT
1100 for (total_written = 0; write_size > total_written;
1101 total_written += bytes_written) {
1102 rc = -EAGAIN;
1103 while (rc == -EAGAIN) {
1da177e4
LT
1104 if (open_file->closePend) {
1105 FreeXid(xid);
1106 if (total_written)
1107 return total_written;
1108 else
1109 return -EBADF;
1110 }
1111 if (open_file->invalidHandle) {
1da177e4
LT
1112 /* we could deadlock if we called
1113 filemap_fdatawait from here so tell
fb8c4b14 1114 reopen_file not to flush data to
1da177e4 1115 server now */
15886177 1116 rc = cifs_reopen_file(open_file, false);
1da177e4
LT
1117 if (rc != 0)
1118 break;
1119 }
fb8c4b14
SF
1120 if (experimEnabled || (pTcon->ses->server &&
1121 ((pTcon->ses->server->secMode &
08775834 1122 (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
c01f36a8 1123 == 0))) {
3e84469d
SF
1124 struct kvec iov[2];
1125 unsigned int len;
1126
0ae0efad 1127 len = min((size_t)cifs_sb->wsize,
3e84469d
SF
1128 write_size - total_written);
1129 /* iov[0] is reserved for smb header */
1130 iov[1].iov_base = (char *)write_data +
1131 total_written;
1132 iov[1].iov_len = len;
d6e04ae6 1133 rc = CIFSSMBWrite2(xid, pTcon,
3e84469d 1134 open_file->netfid, len,
d6e04ae6 1135 *poffset, &bytes_written,
3e84469d 1136 iov, 1, long_op);
d6e04ae6 1137 } else
60808233
SF
1138 rc = CIFSSMBWrite(xid, pTcon,
1139 open_file->netfid,
1140 min_t(const int, cifs_sb->wsize,
1141 write_size - total_written),
1142 *poffset, &bytes_written,
1143 write_data + total_written,
1144 NULL, long_op);
1da177e4
LT
1145 }
1146 if (rc || (bytes_written == 0)) {
1147 if (total_written)
1148 break;
1149 else {
1150 FreeXid(xid);
1151 return rc;
1152 }
fbec9ab9
JL
1153 } else {
1154 cifs_update_eof(cifsi, *poffset, bytes_written);
1da177e4 1155 *poffset += bytes_written;
fbec9ab9 1156 }
133672ef 1157 long_op = CIFS_STD_OP; /* subsequent writes fast -
1da177e4
LT
1158 15 seconds is plenty */
1159 }
1160
a4544347 1161 cifs_stats_bytes_written(pTcon, total_written);
1da177e4 1162
7da4b49a
JL
1163 if (total_written > 0) {
1164 spin_lock(&dentry->d_inode->i_lock);
1165 if (*poffset > dentry->d_inode->i_size)
1166 i_size_write(dentry->d_inode, *poffset);
1167 spin_unlock(&dentry->d_inode->i_lock);
1da177e4 1168 }
7da4b49a 1169 mark_inode_dirty_sync(dentry->d_inode);
1da177e4
LT
1170 FreeXid(xid);
1171 return total_written;
1172}
1173
630f3f0c 1174#ifdef CONFIG_CIFS_EXPERIMENTAL
6508d904
JL
1175struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *cifs_inode,
1176 bool fsuid_only)
630f3f0c
SF
1177{
1178 struct cifsFileInfo *open_file = NULL;
6508d904
JL
1179 struct cifs_sb_info *cifs_sb = CIFS_SB(cifs_inode->vfs_inode.i_sb);
1180
1181 /* only filter by fsuid on multiuser mounts */
1182 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
1183 fsuid_only = false;
630f3f0c
SF
1184
1185 read_lock(&GlobalSMBSeslock);
1186 /* we could simply get the first_list_entry since write-only entries
1187 are always at the end of the list but since the first entry might
1188 have a close pending, we go through the whole list */
1189 list_for_each_entry(open_file, &cifs_inode->openFileList, flist) {
1190 if (open_file->closePend)
1191 continue;
6508d904
JL
1192 if (fsuid_only && open_file->uid != current_fsuid())
1193 continue;
2e396b83 1194 if (OPEN_FMODE(open_file->f_flags) & FMODE_READ) {
630f3f0c
SF
1195 if (!open_file->invalidHandle) {
1196 /* found a good file */
1197 /* lock it so it will not be closed on us */
6ab409b5 1198 cifsFileInfo_get(open_file);
630f3f0c
SF
1199 read_unlock(&GlobalSMBSeslock);
1200 return open_file;
1201 } /* else might as well continue, and look for
1202 another, or simply have the caller reopen it
1203 again rather than trying to fix this handle */
1204 } else /* write only file */
1205 break; /* write only files are last so must be done */
1206 }
1207 read_unlock(&GlobalSMBSeslock);
1208 return NULL;
1209}
1210#endif
1211
6508d904
JL
1212struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *cifs_inode,
1213 bool fsuid_only)
6148a742
SF
1214{
1215 struct cifsFileInfo *open_file;
6508d904 1216 struct cifs_sb_info *cifs_sb = CIFS_SB(cifs_inode->vfs_inode.i_sb);
2846d386 1217 bool any_available = false;
dd99cd80 1218 int rc;
6148a742 1219
60808233
SF
1220 /* Having a null inode here (because mapping->host was set to zero by
1221 the VFS or MM) should not happen but we had reports of on oops (due to
1222 it being zero) during stress testcases so we need to check for it */
1223
fb8c4b14 1224 if (cifs_inode == NULL) {
b6b38f70 1225 cERROR(1, "Null inode passed to cifs_writeable_file");
60808233
SF
1226 dump_stack();
1227 return NULL;
1228 }
1229
6508d904
JL
1230 /* only filter by fsuid on multiuser mounts */
1231 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
1232 fsuid_only = false;
1233
6148a742 1234 read_lock(&GlobalSMBSeslock);
9b22b0b7 1235refind_writable:
6148a742 1236 list_for_each_entry(open_file, &cifs_inode->openFileList, flist) {
6508d904
JL
1237 if (open_file->closePend)
1238 continue;
1239 if (!any_available && open_file->pid != current->tgid)
1240 continue;
1241 if (fsuid_only && open_file->uid != current_fsuid())
6148a742 1242 continue;
2e396b83 1243 if (OPEN_FMODE(open_file->f_flags) & FMODE_WRITE) {
6ab409b5 1244 cifsFileInfo_get(open_file);
9b22b0b7
SF
1245
1246 if (!open_file->invalidHandle) {
1247 /* found a good writable file */
1248 read_unlock(&GlobalSMBSeslock);
1249 return open_file;
1250 }
8840dee9 1251
6148a742 1252 read_unlock(&GlobalSMBSeslock);
9b22b0b7 1253 /* Had to unlock since following call can block */
15886177 1254 rc = cifs_reopen_file(open_file, false);
8840dee9 1255 if (!rc) {
9b22b0b7
SF
1256 if (!open_file->closePend)
1257 return open_file;
1258 else { /* start over in case this was deleted */
1259 /* since the list could be modified */
37c0eb46 1260 read_lock(&GlobalSMBSeslock);
6ab409b5 1261 cifsFileInfo_put(open_file);
9b22b0b7 1262 goto refind_writable;
37c0eb46
SF
1263 }
1264 }
9b22b0b7
SF
1265
1266 /* if it fails, try another handle if possible -
1267 (we can not do this if closePending since
1268 loop could be modified - in which case we
1269 have to start at the beginning of the list
1270 again. Note that it would be bad
1271 to hold up writepages here (rather than
1272 in caller) with continuous retries */
b6b38f70 1273 cFYI(1, "wp failed on reopen file");
9b22b0b7
SF
1274 read_lock(&GlobalSMBSeslock);
1275 /* can not use this handle, no write
1276 pending on this one after all */
6ab409b5 1277 cifsFileInfo_put(open_file);
8840dee9 1278
9b22b0b7
SF
1279 if (open_file->closePend) /* list could have changed */
1280 goto refind_writable;
1281 /* else we simply continue to the next entry. Thus
1282 we do not loop on reopen errors. If we
1283 can not reopen the file, for example if we
1284 reconnected to a server with another client
1285 racing to delete or lock the file we would not
1286 make progress if we restarted before the beginning
1287 of the loop here. */
6148a742
SF
1288 }
1289 }
2846d386
JL
1290 /* couldn't find useable FH with same pid, try any available */
1291 if (!any_available) {
1292 any_available = true;
1293 goto refind_writable;
1294 }
6148a742
SF
1295 read_unlock(&GlobalSMBSeslock);
1296 return NULL;
1297}
1298
1da177e4
LT
1299static int cifs_partialpagewrite(struct page *page, unsigned from, unsigned to)
1300{
1301 struct address_space *mapping = page->mapping;
1302 loff_t offset = (loff_t)page->index << PAGE_CACHE_SHIFT;
1303 char *write_data;
1304 int rc = -EFAULT;
1305 int bytes_written = 0;
1306 struct cifs_sb_info *cifs_sb;
1da177e4 1307 struct inode *inode;
6148a742 1308 struct cifsFileInfo *open_file;
1da177e4
LT
1309
1310 if (!mapping || !mapping->host)
1311 return -EFAULT;
1312
1313 inode = page->mapping->host;
1314 cifs_sb = CIFS_SB(inode->i_sb);
1da177e4
LT
1315
1316 offset += (loff_t)from;
1317 write_data = kmap(page);
1318 write_data += from;
1319
1320 if ((to > PAGE_CACHE_SIZE) || (from > to)) {
1321 kunmap(page);
1322 return -EIO;
1323 }
1324
1325 /* racing with truncate? */
1326 if (offset > mapping->host->i_size) {
1327 kunmap(page);
1328 return 0; /* don't care */
1329 }
1330
1331 /* check to make sure that we are not extending the file */
1332 if (mapping->host->i_size - offset < (loff_t)to)
fb8c4b14 1333 to = (unsigned)(mapping->host->i_size - offset);
1da177e4 1334
6508d904 1335 open_file = find_writable_file(CIFS_I(mapping->host), false);
6148a742 1336 if (open_file) {
7da4b49a
JL
1337 bytes_written = cifs_write(open_file, write_data,
1338 to - from, &offset);
6ab409b5 1339 cifsFileInfo_put(open_file);
1da177e4 1340 /* Does mm or vfs already set times? */
6148a742 1341 inode->i_atime = inode->i_mtime = current_fs_time(inode->i_sb);
bb5a9a04 1342 if ((bytes_written > 0) && (offset))
6148a742 1343 rc = 0;
bb5a9a04
SF
1344 else if (bytes_written < 0)
1345 rc = bytes_written;
6148a742 1346 } else {
b6b38f70 1347 cFYI(1, "No writeable filehandles for inode");
1da177e4
LT
1348 rc = -EIO;
1349 }
1350
1351 kunmap(page);
1352 return rc;
1353}
1354
1da177e4 1355static int cifs_writepages(struct address_space *mapping,
37c0eb46 1356 struct writeback_control *wbc)
1da177e4 1357{
37c0eb46
SF
1358 struct backing_dev_info *bdi = mapping->backing_dev_info;
1359 unsigned int bytes_to_write;
1360 unsigned int bytes_written;
1361 struct cifs_sb_info *cifs_sb;
1362 int done = 0;
111ebb6e 1363 pgoff_t end;
37c0eb46 1364 pgoff_t index;
fb8c4b14
SF
1365 int range_whole = 0;
1366 struct kvec *iov;
84d2f07e 1367 int len;
37c0eb46
SF
1368 int n_iov = 0;
1369 pgoff_t next;
1370 int nr_pages;
1371 __u64 offset = 0;
23e7dd7d 1372 struct cifsFileInfo *open_file;
ba00ba64 1373 struct cifsTconInfo *tcon;
fbec9ab9 1374 struct cifsInodeInfo *cifsi = CIFS_I(mapping->host);
37c0eb46
SF
1375 struct page *page;
1376 struct pagevec pvec;
1377 int rc = 0;
1378 int scanned = 0;
fbec9ab9 1379 int xid, long_op;
1da177e4 1380
f3983c21
JL
1381 /*
1382 * BB: Is this meaningful for a non-block-device file system?
1383 * If it is, we should test it again after we do I/O
1384 */
1385 if (wbc->nonblocking && bdi_write_congested(bdi)) {
1386 wbc->encountered_congestion = 1;
1387 return 0;
1388 }
1389
37c0eb46 1390 cifs_sb = CIFS_SB(mapping->host->i_sb);
50c2f753 1391
37c0eb46
SF
1392 /*
1393 * If wsize is smaller that the page cache size, default to writing
1394 * one page at a time via cifs_writepage
1395 */
1396 if (cifs_sb->wsize < PAGE_CACHE_SIZE)
1397 return generic_writepages(mapping, wbc);
1398
9a0c8230 1399 iov = kmalloc(32 * sizeof(struct kvec), GFP_KERNEL);
fb8c4b14 1400 if (iov == NULL)
9a0c8230
SF
1401 return generic_writepages(mapping, wbc);
1402
37c0eb46 1403 /*
f3983c21
JL
1404 * if there's no open file, then this is likely to fail too,
1405 * but it'll at least handle the return. Maybe it should be
1406 * a BUG() instead?
37c0eb46 1407 */
6508d904 1408 open_file = find_writable_file(CIFS_I(mapping->host), false);
f3983c21 1409 if (!open_file) {
9a0c8230 1410 kfree(iov);
f3983c21
JL
1411 return generic_writepages(mapping, wbc);
1412 }
1413
13cfb733 1414 tcon = tlink_tcon(open_file->tlink);
f3983c21
JL
1415 if (!experimEnabled && tcon->ses->server->secMode &
1416 (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) {
1417 cifsFileInfo_put(open_file);
1418 return generic_writepages(mapping, wbc);
37c0eb46 1419 }
f3983c21 1420 cifsFileInfo_put(open_file);
37c0eb46 1421
1da177e4
LT
1422 xid = GetXid();
1423
37c0eb46 1424 pagevec_init(&pvec, 0);
111ebb6e 1425 if (wbc->range_cyclic) {
37c0eb46 1426 index = mapping->writeback_index; /* Start from prev offset */
111ebb6e
OH
1427 end = -1;
1428 } else {
1429 index = wbc->range_start >> PAGE_CACHE_SHIFT;
1430 end = wbc->range_end >> PAGE_CACHE_SHIFT;
1431 if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX)
1432 range_whole = 1;
37c0eb46
SF
1433 scanned = 1;
1434 }
1435retry:
1436 while (!done && (index <= end) &&
1437 (nr_pages = pagevec_lookup_tag(&pvec, mapping, &index,
1438 PAGECACHE_TAG_DIRTY,
1439 min(end - index, (pgoff_t)PAGEVEC_SIZE - 1) + 1))) {
1440 int first;
1441 unsigned int i;
1442
37c0eb46
SF
1443 first = -1;
1444 next = 0;
1445 n_iov = 0;
1446 bytes_to_write = 0;
1447
1448 for (i = 0; i < nr_pages; i++) {
1449 page = pvec.pages[i];
1450 /*
1451 * At this point we hold neither mapping->tree_lock nor
1452 * lock on the page itself: the page may be truncated or
1453 * invalidated (changing page->mapping to NULL), or even
1454 * swizzled back from swapper_space to tmpfs file
1455 * mapping
1456 */
1457
1458 if (first < 0)
1459 lock_page(page);
529ae9aa 1460 else if (!trylock_page(page))
37c0eb46
SF
1461 break;
1462
1463 if (unlikely(page->mapping != mapping)) {
1464 unlock_page(page);
1465 break;
1466 }
1467
111ebb6e 1468 if (!wbc->range_cyclic && page->index > end) {
37c0eb46
SF
1469 done = 1;
1470 unlock_page(page);
1471 break;
1472 }
1473
1474 if (next && (page->index != next)) {
1475 /* Not next consecutive page */
1476 unlock_page(page);
1477 break;
1478 }
1479
1480 if (wbc->sync_mode != WB_SYNC_NONE)
1481 wait_on_page_writeback(page);
1482
1483 if (PageWriteback(page) ||
cb876f45 1484 !clear_page_dirty_for_io(page)) {
37c0eb46
SF
1485 unlock_page(page);
1486 break;
1487 }
84d2f07e 1488
cb876f45
LT
1489 /*
1490 * This actually clears the dirty bit in the radix tree.
1491 * See cifs_writepage() for more commentary.
1492 */
1493 set_page_writeback(page);
1494
84d2f07e
SF
1495 if (page_offset(page) >= mapping->host->i_size) {
1496 done = 1;
1497 unlock_page(page);
cb876f45 1498 end_page_writeback(page);
84d2f07e
SF
1499 break;
1500 }
1501
37c0eb46
SF
1502 /*
1503 * BB can we get rid of this? pages are held by pvec
1504 */
1505 page_cache_get(page);
1506
84d2f07e
SF
1507 len = min(mapping->host->i_size - page_offset(page),
1508 (loff_t)PAGE_CACHE_SIZE);
1509
37c0eb46
SF
1510 /* reserve iov[0] for the smb header */
1511 n_iov++;
1512 iov[n_iov].iov_base = kmap(page);
84d2f07e
SF
1513 iov[n_iov].iov_len = len;
1514 bytes_to_write += len;
37c0eb46
SF
1515
1516 if (first < 0) {
1517 first = i;
1518 offset = page_offset(page);
1519 }
1520 next = page->index + 1;
1521 if (bytes_to_write + PAGE_CACHE_SIZE > cifs_sb->wsize)
1522 break;
1523 }
1524 if (n_iov) {
6508d904
JL
1525 open_file = find_writable_file(CIFS_I(mapping->host),
1526 false);
23e7dd7d 1527 if (!open_file) {
b6b38f70 1528 cERROR(1, "No writable handles for inode");
23e7dd7d 1529 rc = -EBADF;
1047abc1 1530 } else {
fbec9ab9 1531 long_op = cifs_write_timeout(cifsi, offset);
f3983c21 1532 rc = CIFSSMBWrite2(xid, tcon, open_file->netfid,
23e7dd7d
SF
1533 bytes_to_write, offset,
1534 &bytes_written, iov, n_iov,
fbec9ab9 1535 long_op);
6ab409b5 1536 cifsFileInfo_put(open_file);
fbec9ab9 1537 cifs_update_eof(cifsi, offset, bytes_written);
f3983c21 1538 }
fbec9ab9 1539
f3983c21
JL
1540 if (rc || bytes_written < bytes_to_write) {
1541 cERROR(1, "Write2 ret %d, wrote %d",
1542 rc, bytes_written);
1543 /* BB what if continued retry is
1544 requested via mount flags? */
1545 if (rc == -ENOSPC)
1546 set_bit(AS_ENOSPC, &mapping->flags);
1547 else
1548 set_bit(AS_EIO, &mapping->flags);
1549 } else {
1550 cifs_stats_bytes_written(tcon, bytes_written);
37c0eb46 1551 }
f3983c21 1552
37c0eb46
SF
1553 for (i = 0; i < n_iov; i++) {
1554 page = pvec.pages[first + i];
eb9bdaa3
SF
1555 /* Should we also set page error on
1556 success rc but too little data written? */
1557 /* BB investigate retry logic on temporary
1558 server crash cases and how recovery works
fb8c4b14
SF
1559 when page marked as error */
1560 if (rc)
eb9bdaa3 1561 SetPageError(page);
37c0eb46
SF
1562 kunmap(page);
1563 unlock_page(page);
cb876f45 1564 end_page_writeback(page);
37c0eb46
SF
1565 page_cache_release(page);
1566 }
1567 if ((wbc->nr_to_write -= n_iov) <= 0)
1568 done = 1;
1569 index = next;
b066a48c
DK
1570 } else
1571 /* Need to re-find the pages we skipped */
1572 index = pvec.pages[0]->index + 1;
1573
37c0eb46
SF
1574 pagevec_release(&pvec);
1575 }
1576 if (!scanned && !done) {
1577 /*
1578 * We hit the last page and there is more work to be done: wrap
1579 * back to the start of the file
1580 */
1581 scanned = 1;
1582 index = 0;
1583 goto retry;
1584 }
111ebb6e 1585 if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0))
37c0eb46
SF
1586 mapping->writeback_index = index;
1587
1da177e4 1588 FreeXid(xid);
9a0c8230 1589 kfree(iov);
1da177e4
LT
1590 return rc;
1591}
1da177e4 1592
fb8c4b14 1593static int cifs_writepage(struct page *page, struct writeback_control *wbc)
1da177e4
LT
1594{
1595 int rc = -EFAULT;
1596 int xid;
1597
1598 xid = GetXid();
1599/* BB add check for wbc flags */
1600 page_cache_get(page);
ad7a2926 1601 if (!PageUptodate(page))
b6b38f70 1602 cFYI(1, "ppw - page not up to date");
cb876f45
LT
1603
1604 /*
1605 * Set the "writeback" flag, and clear "dirty" in the radix tree.
1606 *
1607 * A writepage() implementation always needs to do either this,
1608 * or re-dirty the page with "redirty_page_for_writepage()" in
1609 * the case of a failure.
1610 *
1611 * Just unlocking the page will cause the radix tree tag-bits
1612 * to fail to update with the state of the page correctly.
1613 */
fb8c4b14 1614 set_page_writeback(page);
1da177e4
LT
1615 rc = cifs_partialpagewrite(page, 0, PAGE_CACHE_SIZE);
1616 SetPageUptodate(page); /* BB add check for error and Clearuptodate? */
1617 unlock_page(page);
cb876f45
LT
1618 end_page_writeback(page);
1619 page_cache_release(page);
1da177e4
LT
1620 FreeXid(xid);
1621 return rc;
1622}
1623
d9414774
NP
1624static int cifs_write_end(struct file *file, struct address_space *mapping,
1625 loff_t pos, unsigned len, unsigned copied,
1626 struct page *page, void *fsdata)
1da177e4 1627{
d9414774
NP
1628 int rc;
1629 struct inode *inode = mapping->host;
1da177e4 1630
b6b38f70
JP
1631 cFYI(1, "write_end for page %p from pos %lld with %d bytes",
1632 page, pos, copied);
d9414774 1633
a98ee8c1
JL
1634 if (PageChecked(page)) {
1635 if (copied == len)
1636 SetPageUptodate(page);
1637 ClearPageChecked(page);
1638 } else if (!PageUptodate(page) && copied == PAGE_CACHE_SIZE)
d9414774 1639 SetPageUptodate(page);
ad7a2926 1640
1da177e4 1641 if (!PageUptodate(page)) {
d9414774
NP
1642 char *page_data;
1643 unsigned offset = pos & (PAGE_CACHE_SIZE - 1);
1644 int xid;
1645
1646 xid = GetXid();
1da177e4
LT
1647 /* this is probably better than directly calling
1648 partialpage_write since in this function the file handle is
1649 known which we might as well leverage */
1650 /* BB check if anything else missing out of ppw
1651 such as updating last write time */
1652 page_data = kmap(page);
7da4b49a
JL
1653 rc = cifs_write(file->private_data, page_data + offset,
1654 copied, &pos);
d9414774 1655 /* if (rc < 0) should we set writebehind rc? */
1da177e4 1656 kunmap(page);
d9414774
NP
1657
1658 FreeXid(xid);
fb8c4b14 1659 } else {
d9414774
NP
1660 rc = copied;
1661 pos += copied;
1da177e4
LT
1662 set_page_dirty(page);
1663 }
1664
d9414774
NP
1665 if (rc > 0) {
1666 spin_lock(&inode->i_lock);
1667 if (pos > inode->i_size)
1668 i_size_write(inode, pos);
1669 spin_unlock(&inode->i_lock);
1670 }
1671
1672 unlock_page(page);
1673 page_cache_release(page);
1674
1da177e4
LT
1675 return rc;
1676}
1677
7ea80859 1678int cifs_fsync(struct file *file, int datasync)
1da177e4
LT
1679{
1680 int xid;
1681 int rc = 0;
b298f223 1682 struct cifsTconInfo *tcon;
c21dfb69 1683 struct cifsFileInfo *smbfile = file->private_data;
e6a00296 1684 struct inode *inode = file->f_path.dentry->d_inode;
1da177e4
LT
1685
1686 xid = GetXid();
1687
b6b38f70 1688 cFYI(1, "Sync file - name: %s datasync: 0x%x",
7ea80859 1689 file->f_path.dentry->d_name.name, datasync);
50c2f753 1690
cea21805
JL
1691 rc = filemap_write_and_wait(inode->i_mapping);
1692 if (rc == 0) {
1693 rc = CIFS_I(inode)->write_behind_rc;
1da177e4 1694 CIFS_I(inode)->write_behind_rc = 0;
13cfb733 1695 tcon = tlink_tcon(smbfile->tlink);
be652445 1696 if (!rc && tcon && smbfile &&
4717bed6 1697 !(CIFS_SB(inode->i_sb)->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC))
b298f223 1698 rc = CIFSSMBFlush(xid, tcon, smbfile->netfid);
cea21805 1699 }
b298f223 1700
1da177e4
LT
1701 FreeXid(xid);
1702 return rc;
1703}
1704
3978d717 1705/* static void cifs_sync_page(struct page *page)
1da177e4
LT
1706{
1707 struct address_space *mapping;
1708 struct inode *inode;
1709 unsigned long index = page->index;
1710 unsigned int rpages = 0;
1711 int rc = 0;
1712
f19159dc 1713 cFYI(1, "sync page %p", page);
1da177e4
LT
1714 mapping = page->mapping;
1715 if (!mapping)
1716 return 0;
1717 inode = mapping->host;
1718 if (!inode)
3978d717 1719 return; */
1da177e4 1720
fb8c4b14 1721/* fill in rpages then
1da177e4
LT
1722 result = cifs_pagein_inode(inode, index, rpages); */ /* BB finish */
1723
b6b38f70 1724/* cFYI(1, "rpages is %d for sync page of Index %ld", rpages, index);
1da177e4 1725
3978d717 1726#if 0
1da177e4
LT
1727 if (rc < 0)
1728 return rc;
1729 return 0;
3978d717 1730#endif
1da177e4
LT
1731} */
1732
1733/*
1734 * As file closes, flush all cached write data for this inode checking
1735 * for write behind errors.
1736 */
75e1fcc0 1737int cifs_flush(struct file *file, fl_owner_t id)
1da177e4 1738{
fb8c4b14 1739 struct inode *inode = file->f_path.dentry->d_inode;
1da177e4
LT
1740 int rc = 0;
1741
1742 /* Rather than do the steps manually:
1743 lock the inode for writing
1744 loop through pages looking for write behind data (dirty pages)
1745 coalesce into contiguous 16K (or smaller) chunks to write to server
1746 send to server (prefer in parallel)
1747 deal with writebehind errors
1748 unlock inode for writing
1749 filemapfdatawrite appears easier for the time being */
1750
1751 rc = filemap_fdatawrite(inode->i_mapping);
cea21805
JL
1752 /* reset wb rc if we were able to write out dirty pages */
1753 if (!rc) {
1754 rc = CIFS_I(inode)->write_behind_rc;
1da177e4 1755 CIFS_I(inode)->write_behind_rc = 0;
cea21805 1756 }
50c2f753 1757
b6b38f70 1758 cFYI(1, "Flush inode %p file %p rc %d", inode, file, rc);
1da177e4
LT
1759
1760 return rc;
1761}
1762
1763ssize_t cifs_user_read(struct file *file, char __user *read_data,
1764 size_t read_size, loff_t *poffset)
1765{
1766 int rc = -EACCES;
1767 unsigned int bytes_read = 0;
1768 unsigned int total_read = 0;
1769 unsigned int current_read_size;
1770 struct cifs_sb_info *cifs_sb;
1771 struct cifsTconInfo *pTcon;
1772 int xid;
1773 struct cifsFileInfo *open_file;
1774 char *smb_read_data;
1775 char __user *current_offset;
1776 struct smb_com_read_rsp *pSMBr;
1777
1778 xid = GetXid();
e6a00296 1779 cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
1da177e4
LT
1780
1781 if (file->private_data == NULL) {
0f3bc09e 1782 rc = -EBADF;
1da177e4 1783 FreeXid(xid);
0f3bc09e 1784 return rc;
1da177e4 1785 }
c21dfb69 1786 open_file = file->private_data;
13cfb733 1787 pTcon = tlink_tcon(open_file->tlink);
1da177e4 1788
ad7a2926 1789 if ((file->f_flags & O_ACCMODE) == O_WRONLY)
b6b38f70 1790 cFYI(1, "attempting read on write only file instance");
ad7a2926 1791
1da177e4
LT
1792 for (total_read = 0, current_offset = read_data;
1793 read_size > total_read;
1794 total_read += bytes_read, current_offset += bytes_read) {
fb8c4b14 1795 current_read_size = min_t(const int, read_size - total_read,
1da177e4
LT
1796 cifs_sb->rsize);
1797 rc = -EAGAIN;
1798 smb_read_data = NULL;
1799 while (rc == -EAGAIN) {
ec637e3f 1800 int buf_type = CIFS_NO_BUFFER;
fb8c4b14 1801 if ((open_file->invalidHandle) &&
1da177e4 1802 (!open_file->closePend)) {
15886177 1803 rc = cifs_reopen_file(open_file, true);
1da177e4
LT
1804 if (rc != 0)
1805 break;
1806 }
bfa0d75a 1807 rc = CIFSSMBRead(xid, pTcon,
ec637e3f
SF
1808 open_file->netfid,
1809 current_read_size, *poffset,
1810 &bytes_read, &smb_read_data,
1811 &buf_type);
1da177e4 1812 pSMBr = (struct smb_com_read_rsp *)smb_read_data;
1da177e4 1813 if (smb_read_data) {
93544cc6
SF
1814 if (copy_to_user(current_offset,
1815 smb_read_data +
1816 4 /* RFC1001 length field */ +
1817 le16_to_cpu(pSMBr->DataOffset),
ad7a2926 1818 bytes_read))
93544cc6 1819 rc = -EFAULT;
93544cc6 1820
fb8c4b14 1821 if (buf_type == CIFS_SMALL_BUFFER)
ec637e3f 1822 cifs_small_buf_release(smb_read_data);
fb8c4b14 1823 else if (buf_type == CIFS_LARGE_BUFFER)
ec637e3f 1824 cifs_buf_release(smb_read_data);
1da177e4
LT
1825 smb_read_data = NULL;
1826 }
1827 }
1828 if (rc || (bytes_read == 0)) {
1829 if (total_read) {
1830 break;
1831 } else {
1832 FreeXid(xid);
1833 return rc;
1834 }
1835 } else {
a4544347 1836 cifs_stats_bytes_read(pTcon, bytes_read);
1da177e4
LT
1837 *poffset += bytes_read;
1838 }
1839 }
1840 FreeXid(xid);
1841 return total_read;
1842}
1843
1844
1845static ssize_t cifs_read(struct file *file, char *read_data, size_t read_size,
1846 loff_t *poffset)
1847{
1848 int rc = -EACCES;
1849 unsigned int bytes_read = 0;
1850 unsigned int total_read;
1851 unsigned int current_read_size;
1852 struct cifs_sb_info *cifs_sb;
1853 struct cifsTconInfo *pTcon;
1854 int xid;
1855 char *current_offset;
1856 struct cifsFileInfo *open_file;
ec637e3f 1857 int buf_type = CIFS_NO_BUFFER;
1da177e4
LT
1858
1859 xid = GetXid();
e6a00296 1860 cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
1da177e4
LT
1861
1862 if (file->private_data == NULL) {
0f3bc09e 1863 rc = -EBADF;
1da177e4 1864 FreeXid(xid);
0f3bc09e 1865 return rc;
1da177e4 1866 }
c21dfb69 1867 open_file = file->private_data;
13cfb733 1868 pTcon = tlink_tcon(open_file->tlink);
1da177e4
LT
1869
1870 if ((file->f_flags & O_ACCMODE) == O_WRONLY)
b6b38f70 1871 cFYI(1, "attempting read on write only file instance");
1da177e4 1872
fb8c4b14 1873 for (total_read = 0, current_offset = read_data;
1da177e4
LT
1874 read_size > total_read;
1875 total_read += bytes_read, current_offset += bytes_read) {
1876 current_read_size = min_t(const int, read_size - total_read,
1877 cifs_sb->rsize);
f9f5c817
SF
1878 /* For windows me and 9x we do not want to request more
1879 than it negotiated since it will refuse the read then */
fb8c4b14 1880 if ((pTcon->ses) &&
f9f5c817
SF
1881 !(pTcon->ses->capabilities & CAP_LARGE_FILES)) {
1882 current_read_size = min_t(const int, current_read_size,
1883 pTcon->ses->server->maxBuf - 128);
1884 }
1da177e4
LT
1885 rc = -EAGAIN;
1886 while (rc == -EAGAIN) {
fb8c4b14 1887 if ((open_file->invalidHandle) &&
1da177e4 1888 (!open_file->closePend)) {
15886177 1889 rc = cifs_reopen_file(open_file, true);
1da177e4
LT
1890 if (rc != 0)
1891 break;
1892 }
bfa0d75a 1893 rc = CIFSSMBRead(xid, pTcon,
ec637e3f
SF
1894 open_file->netfid,
1895 current_read_size, *poffset,
1896 &bytes_read, &current_offset,
1897 &buf_type);
1da177e4
LT
1898 }
1899 if (rc || (bytes_read == 0)) {
1900 if (total_read) {
1901 break;
1902 } else {
1903 FreeXid(xid);
1904 return rc;
1905 }
1906 } else {
a4544347 1907 cifs_stats_bytes_read(pTcon, total_read);
1da177e4
LT
1908 *poffset += bytes_read;
1909 }
1910 }
1911 FreeXid(xid);
1912 return total_read;
1913}
1914
1915int cifs_file_mmap(struct file *file, struct vm_area_struct *vma)
1916{
1da177e4
LT
1917 int rc, xid;
1918
1919 xid = GetXid();
abab095d 1920 rc = cifs_revalidate_file(file);
1da177e4 1921 if (rc) {
b6b38f70 1922 cFYI(1, "Validation prior to mmap failed, error=%d", rc);
1da177e4
LT
1923 FreeXid(xid);
1924 return rc;
1925 }
1926 rc = generic_file_mmap(file, vma);
1927 FreeXid(xid);
1928 return rc;
1929}
1930
1931
fb8c4b14 1932static void cifs_copy_cache_pages(struct address_space *mapping,
315e995c 1933 struct list_head *pages, int bytes_read, char *data)
1da177e4
LT
1934{
1935 struct page *page;
1936 char *target;
1937
1938 while (bytes_read > 0) {
1939 if (list_empty(pages))
1940 break;
1941
1942 page = list_entry(pages->prev, struct page, lru);
1943 list_del(&page->lru);
1944
315e995c 1945 if (add_to_page_cache_lru(page, mapping, page->index,
1da177e4
LT
1946 GFP_KERNEL)) {
1947 page_cache_release(page);
b6b38f70 1948 cFYI(1, "Add page cache failed");
3079ca62
SF
1949 data += PAGE_CACHE_SIZE;
1950 bytes_read -= PAGE_CACHE_SIZE;
1da177e4
LT
1951 continue;
1952 }
06b43672 1953 page_cache_release(page);
1da177e4 1954
fb8c4b14 1955 target = kmap_atomic(page, KM_USER0);
1da177e4
LT
1956
1957 if (PAGE_CACHE_SIZE > bytes_read) {
1958 memcpy(target, data, bytes_read);
1959 /* zero the tail end of this partial page */
fb8c4b14 1960 memset(target + bytes_read, 0,
1da177e4
LT
1961 PAGE_CACHE_SIZE - bytes_read);
1962 bytes_read = 0;
1963 } else {
1964 memcpy(target, data, PAGE_CACHE_SIZE);
1965 bytes_read -= PAGE_CACHE_SIZE;
1966 }
1967 kunmap_atomic(target, KM_USER0);
1968
1969 flush_dcache_page(page);
1970 SetPageUptodate(page);
1971 unlock_page(page);
1da177e4 1972 data += PAGE_CACHE_SIZE;
9dc06558
SJ
1973
1974 /* add page to FS-Cache */
1975 cifs_readpage_to_fscache(mapping->host, page);
1da177e4
LT
1976 }
1977 return;
1978}
1979
1980static int cifs_readpages(struct file *file, struct address_space *mapping,
1981 struct list_head *page_list, unsigned num_pages)
1982{
1983 int rc = -EACCES;
1984 int xid;
1985 loff_t offset;
1986 struct page *page;
1987 struct cifs_sb_info *cifs_sb;
1988 struct cifsTconInfo *pTcon;
2c2130e1 1989 unsigned int bytes_read = 0;
fb8c4b14 1990 unsigned int read_size, i;
1da177e4
LT
1991 char *smb_read_data = NULL;
1992 struct smb_com_read_rsp *pSMBr;
1da177e4 1993 struct cifsFileInfo *open_file;
ec637e3f 1994 int buf_type = CIFS_NO_BUFFER;
1da177e4
LT
1995
1996 xid = GetXid();
1997 if (file->private_data == NULL) {
0f3bc09e 1998 rc = -EBADF;
1da177e4 1999 FreeXid(xid);
0f3bc09e 2000 return rc;
1da177e4 2001 }
c21dfb69 2002 open_file = file->private_data;
e6a00296 2003 cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
13cfb733 2004 pTcon = tlink_tcon(open_file->tlink);
bfa0d75a 2005
56698236
SJ
2006 /*
2007 * Reads as many pages as possible from fscache. Returns -ENOBUFS
2008 * immediately if the cookie is negative
2009 */
2010 rc = cifs_readpages_from_fscache(mapping->host, mapping, page_list,
2011 &num_pages);
2012 if (rc == 0)
2013 goto read_complete;
2014
f19159dc 2015 cFYI(DBG2, "rpages: num pages %d", num_pages);
1da177e4
LT
2016 for (i = 0; i < num_pages; ) {
2017 unsigned contig_pages;
2018 struct page *tmp_page;
2019 unsigned long expected_index;
2020
2021 if (list_empty(page_list))
2022 break;
2023
2024 page = list_entry(page_list->prev, struct page, lru);
2025 offset = (loff_t)page->index << PAGE_CACHE_SHIFT;
2026
2027 /* count adjacent pages that we will read into */
2028 contig_pages = 0;
fb8c4b14 2029 expected_index =
1da177e4 2030 list_entry(page_list->prev, struct page, lru)->index;
fb8c4b14 2031 list_for_each_entry_reverse(tmp_page, page_list, lru) {
1da177e4
LT
2032 if (tmp_page->index == expected_index) {
2033 contig_pages++;
2034 expected_index++;
2035 } else
fb8c4b14 2036 break;
1da177e4
LT
2037 }
2038 if (contig_pages + i > num_pages)
2039 contig_pages = num_pages - i;
2040
2041 /* for reads over a certain size could initiate async
2042 read ahead */
2043
2044 read_size = contig_pages * PAGE_CACHE_SIZE;
2045 /* Read size needs to be in multiples of one page */
2046 read_size = min_t(const unsigned int, read_size,
2047 cifs_sb->rsize & PAGE_CACHE_MASK);
b6b38f70
JP
2048 cFYI(DBG2, "rpages: read size 0x%x contiguous pages %d",
2049 read_size, contig_pages);
1da177e4
LT
2050 rc = -EAGAIN;
2051 while (rc == -EAGAIN) {
fb8c4b14 2052 if ((open_file->invalidHandle) &&
1da177e4 2053 (!open_file->closePend)) {
15886177 2054 rc = cifs_reopen_file(open_file, true);
1da177e4
LT
2055 if (rc != 0)
2056 break;
2057 }
2058
bfa0d75a 2059 rc = CIFSSMBRead(xid, pTcon,
ec637e3f
SF
2060 open_file->netfid,
2061 read_size, offset,
2062 &bytes_read, &smb_read_data,
2063 &buf_type);
a9d02ad4 2064 /* BB more RC checks ? */
fb8c4b14 2065 if (rc == -EAGAIN) {
1da177e4 2066 if (smb_read_data) {
fb8c4b14 2067 if (buf_type == CIFS_SMALL_BUFFER)
ec637e3f 2068 cifs_small_buf_release(smb_read_data);
fb8c4b14 2069 else if (buf_type == CIFS_LARGE_BUFFER)
ec637e3f 2070 cifs_buf_release(smb_read_data);
1da177e4
LT
2071 smb_read_data = NULL;
2072 }
2073 }
2074 }
2075 if ((rc < 0) || (smb_read_data == NULL)) {
b6b38f70 2076 cFYI(1, "Read error in readpages: %d", rc);
1da177e4
LT
2077 break;
2078 } else if (bytes_read > 0) {
6f88cc2e 2079 task_io_account_read(bytes_read);
1da177e4
LT
2080 pSMBr = (struct smb_com_read_rsp *)smb_read_data;
2081 cifs_copy_cache_pages(mapping, page_list, bytes_read,
2082 smb_read_data + 4 /* RFC1001 hdr */ +
315e995c 2083 le16_to_cpu(pSMBr->DataOffset));
1da177e4
LT
2084
2085 i += bytes_read >> PAGE_CACHE_SHIFT;
a4544347 2086 cifs_stats_bytes_read(pTcon, bytes_read);
2c2130e1 2087 if ((bytes_read & PAGE_CACHE_MASK) != bytes_read) {
1da177e4
LT
2088 i++; /* account for partial page */
2089
fb8c4b14 2090 /* server copy of file can have smaller size
1da177e4 2091 than client */
fb8c4b14
SF
2092 /* BB do we need to verify this common case ?
2093 this case is ok - if we are at server EOF
1da177e4
LT
2094 we will hit it on next read */
2095
05ac9d4b 2096 /* break; */
1da177e4
LT
2097 }
2098 } else {
b6b38f70 2099 cFYI(1, "No bytes read (%d) at offset %lld . "
f19159dc 2100 "Cleaning remaining pages from readahead list",
b6b38f70 2101 bytes_read, offset);
fb8c4b14 2102 /* BB turn off caching and do new lookup on
1da177e4 2103 file size at server? */
1da177e4
LT
2104 break;
2105 }
2106 if (smb_read_data) {
fb8c4b14 2107 if (buf_type == CIFS_SMALL_BUFFER)
ec637e3f 2108 cifs_small_buf_release(smb_read_data);
fb8c4b14 2109 else if (buf_type == CIFS_LARGE_BUFFER)
ec637e3f 2110 cifs_buf_release(smb_read_data);
1da177e4
LT
2111 smb_read_data = NULL;
2112 }
2113 bytes_read = 0;
2114 }
2115
1da177e4
LT
2116/* need to free smb_read_data buf before exit */
2117 if (smb_read_data) {
fb8c4b14 2118 if (buf_type == CIFS_SMALL_BUFFER)
47c886b3 2119 cifs_small_buf_release(smb_read_data);
fb8c4b14 2120 else if (buf_type == CIFS_LARGE_BUFFER)
47c886b3 2121 cifs_buf_release(smb_read_data);
1da177e4 2122 smb_read_data = NULL;
fb8c4b14 2123 }
1da177e4 2124
56698236 2125read_complete:
1da177e4
LT
2126 FreeXid(xid);
2127 return rc;
2128}
2129
2130static int cifs_readpage_worker(struct file *file, struct page *page,
2131 loff_t *poffset)
2132{
2133 char *read_data;
2134 int rc;
2135
56698236
SJ
2136 /* Is the page cached? */
2137 rc = cifs_readpage_from_fscache(file->f_path.dentry->d_inode, page);
2138 if (rc == 0)
2139 goto read_complete;
2140
1da177e4
LT
2141 page_cache_get(page);
2142 read_data = kmap(page);
2143 /* for reads over a certain size could initiate async read ahead */
fb8c4b14 2144
1da177e4 2145 rc = cifs_read(file, read_data, PAGE_CACHE_SIZE, poffset);
fb8c4b14 2146
1da177e4
LT
2147 if (rc < 0)
2148 goto io_error;
2149 else
b6b38f70 2150 cFYI(1, "Bytes read %d", rc);
fb8c4b14 2151
e6a00296
JJS
2152 file->f_path.dentry->d_inode->i_atime =
2153 current_fs_time(file->f_path.dentry->d_inode->i_sb);
fb8c4b14 2154
1da177e4
LT
2155 if (PAGE_CACHE_SIZE > rc)
2156 memset(read_data + rc, 0, PAGE_CACHE_SIZE - rc);
2157
2158 flush_dcache_page(page);
2159 SetPageUptodate(page);
9dc06558
SJ
2160
2161 /* send this page to the cache */
2162 cifs_readpage_to_fscache(file->f_path.dentry->d_inode, page);
2163
1da177e4 2164 rc = 0;
fb8c4b14 2165
1da177e4 2166io_error:
fb8c4b14 2167 kunmap(page);
1da177e4 2168 page_cache_release(page);
56698236
SJ
2169
2170read_complete:
1da177e4
LT
2171 return rc;
2172}
2173
2174static int cifs_readpage(struct file *file, struct page *page)
2175{
2176 loff_t offset = (loff_t)page->index << PAGE_CACHE_SHIFT;
2177 int rc = -EACCES;
2178 int xid;
2179
2180 xid = GetXid();
2181
2182 if (file->private_data == NULL) {
0f3bc09e 2183 rc = -EBADF;
1da177e4 2184 FreeXid(xid);
0f3bc09e 2185 return rc;
1da177e4
LT
2186 }
2187
b6b38f70
JP
2188 cFYI(1, "readpage %p at offset %d 0x%x\n",
2189 page, (int)offset, (int)offset);
1da177e4
LT
2190
2191 rc = cifs_readpage_worker(file, page, &offset);
2192
2193 unlock_page(page);
2194
2195 FreeXid(xid);
2196 return rc;
2197}
2198
a403a0a3
SF
2199static int is_inode_writable(struct cifsInodeInfo *cifs_inode)
2200{
2201 struct cifsFileInfo *open_file;
2202
2203 read_lock(&GlobalSMBSeslock);
2204 list_for_each_entry(open_file, &cifs_inode->openFileList, flist) {
2205 if (open_file->closePend)
2206 continue;
2e396b83 2207 if (OPEN_FMODE(open_file->f_flags) & FMODE_WRITE) {
a403a0a3
SF
2208 read_unlock(&GlobalSMBSeslock);
2209 return 1;
2210 }
2211 }
2212 read_unlock(&GlobalSMBSeslock);
2213 return 0;
2214}
2215
1da177e4
LT
2216/* We do not want to update the file size from server for inodes
2217 open for write - to avoid races with writepage extending
2218 the file - in the future we could consider allowing
fb8c4b14 2219 refreshing the inode only on increases in the file size
1da177e4
LT
2220 but this is tricky to do without racing with writebehind
2221 page caching in the current Linux kernel design */
4b18f2a9 2222bool is_size_safe_to_change(struct cifsInodeInfo *cifsInode, __u64 end_of_file)
1da177e4 2223{
a403a0a3 2224 if (!cifsInode)
4b18f2a9 2225 return true;
50c2f753 2226
a403a0a3
SF
2227 if (is_inode_writable(cifsInode)) {
2228 /* This inode is open for write at least once */
c32a0b68
SF
2229 struct cifs_sb_info *cifs_sb;
2230
c32a0b68 2231 cifs_sb = CIFS_SB(cifsInode->vfs_inode.i_sb);
ad7a2926 2232 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) {
fb8c4b14 2233 /* since no page cache to corrupt on directio
c32a0b68 2234 we can change size safely */
4b18f2a9 2235 return true;
c32a0b68
SF
2236 }
2237
fb8c4b14 2238 if (i_size_read(&cifsInode->vfs_inode) < end_of_file)
4b18f2a9 2239 return true;
7ba52631 2240
4b18f2a9 2241 return false;
23e7dd7d 2242 } else
4b18f2a9 2243 return true;
1da177e4
LT
2244}
2245
d9414774
NP
2246static int cifs_write_begin(struct file *file, struct address_space *mapping,
2247 loff_t pos, unsigned len, unsigned flags,
2248 struct page **pagep, void **fsdata)
1da177e4 2249{
d9414774
NP
2250 pgoff_t index = pos >> PAGE_CACHE_SHIFT;
2251 loff_t offset = pos & (PAGE_CACHE_SIZE - 1);
a98ee8c1
JL
2252 loff_t page_start = pos & PAGE_MASK;
2253 loff_t i_size;
2254 struct page *page;
2255 int rc = 0;
d9414774 2256
b6b38f70 2257 cFYI(1, "write_begin from %lld len %d", (long long)pos, len);
d9414774 2258
54566b2c 2259 page = grab_cache_page_write_begin(mapping, index, flags);
a98ee8c1
JL
2260 if (!page) {
2261 rc = -ENOMEM;
2262 goto out;
2263 }
8a236264 2264
a98ee8c1
JL
2265 if (PageUptodate(page))
2266 goto out;
8a236264 2267
a98ee8c1
JL
2268 /*
2269 * If we write a full page it will be up to date, no need to read from
2270 * the server. If the write is short, we'll end up doing a sync write
2271 * instead.
2272 */
2273 if (len == PAGE_CACHE_SIZE)
2274 goto out;
8a236264 2275
a98ee8c1
JL
2276 /*
2277 * optimize away the read when we have an oplock, and we're not
2278 * expecting to use any of the data we'd be reading in. That
2279 * is, when the page lies beyond the EOF, or straddles the EOF
2280 * and the write will cover all of the existing data.
2281 */
2282 if (CIFS_I(mapping->host)->clientCanCacheRead) {
2283 i_size = i_size_read(mapping->host);
2284 if (page_start >= i_size ||
2285 (offset == 0 && (pos + len) >= i_size)) {
2286 zero_user_segments(page, 0, offset,
2287 offset + len,
2288 PAGE_CACHE_SIZE);
2289 /*
2290 * PageChecked means that the parts of the page
2291 * to which we're not writing are considered up
2292 * to date. Once the data is copied to the
2293 * page, it can be set uptodate.
2294 */
2295 SetPageChecked(page);
2296 goto out;
2297 }
2298 }
d9414774 2299
a98ee8c1
JL
2300 if ((file->f_flags & O_ACCMODE) != O_WRONLY) {
2301 /*
2302 * might as well read a page, it is fast enough. If we get
2303 * an error, we don't need to return it. cifs_write_end will
2304 * do a sync write instead since PG_uptodate isn't set.
2305 */
2306 cifs_readpage_worker(file, page, &page_start);
8a236264
SF
2307 } else {
2308 /* we could try using another file handle if there is one -
2309 but how would we lock it to prevent close of that handle
2310 racing with this read? In any case
d9414774 2311 this will be written out by write_end so is fine */
1da177e4 2312 }
a98ee8c1
JL
2313out:
2314 *pagep = page;
2315 return rc;
1da177e4
LT
2316}
2317
85f2d6b4
SJ
2318static int cifs_release_page(struct page *page, gfp_t gfp)
2319{
2320 if (PagePrivate(page))
2321 return 0;
2322
2323 return cifs_fscache_release_page(page, gfp);
2324}
2325
2326static void cifs_invalidate_page(struct page *page, unsigned long offset)
2327{
2328 struct cifsInodeInfo *cifsi = CIFS_I(page->mapping->host);
2329
2330 if (offset == 0)
2331 cifs_fscache_invalidate_page(page, &cifsi->vfs_inode);
2332}
2333
9b646972 2334void cifs_oplock_break(struct work_struct *work)
3bc303c2
JL
2335{
2336 struct cifsFileInfo *cfile = container_of(work, struct cifsFileInfo,
2337 oplock_break);
a5e18bc3 2338 struct inode *inode = cfile->dentry->d_inode;
3bc303c2 2339 struct cifsInodeInfo *cinode = CIFS_I(inode);
3bc303c2
JL
2340 int rc, waitrc = 0;
2341
2342 if (inode && S_ISREG(inode->i_mode)) {
d54ff732 2343 if (cinode->clientCanCacheRead)
8737c930 2344 break_lease(inode, O_RDONLY);
d54ff732 2345 else
8737c930 2346 break_lease(inode, O_WRONLY);
3bc303c2
JL
2347 rc = filemap_fdatawrite(inode->i_mapping);
2348 if (cinode->clientCanCacheRead == 0) {
2349 waitrc = filemap_fdatawait(inode->i_mapping);
2350 invalidate_remote_inode(inode);
2351 }
2352 if (!rc)
2353 rc = waitrc;
2354 if (rc)
2355 cinode->write_behind_rc = rc;
b6b38f70 2356 cFYI(1, "Oplock flush inode %p rc %d", inode, rc);
3bc303c2
JL
2357 }
2358
2359 /*
2360 * releasing stale oplock after recent reconnect of smb session using
2361 * a now incorrect file handle is not a data integrity issue but do
2362 * not bother sending an oplock release if session to server still is
2363 * disconnected since oplock already released by the server
2364 */
2365 if (!cfile->closePend && !cfile->oplock_break_cancelled) {
13cfb733
JL
2366 rc = CIFSSMBLock(0, tlink_tcon(cfile->tlink), cfile->netfid, 0,
2367 0, 0, 0, LOCKING_ANDX_OPLOCK_RELEASE, false);
b6b38f70 2368 cFYI(1, "Oplock release rc = %d", rc);
3bc303c2 2369 }
9b646972
TH
2370
2371 /*
2372 * We might have kicked in before is_valid_oplock_break()
2373 * finished grabbing reference for us. Make sure it's done by
2374 * waiting for GlobalSMSSeslock.
2375 */
2376 write_lock(&GlobalSMBSeslock);
2377 write_unlock(&GlobalSMBSeslock);
2378
2379 cifs_oplock_break_put(cfile);
3bc303c2
JL
2380}
2381
9b646972 2382void cifs_oplock_break_get(struct cifsFileInfo *cfile)
3bc303c2 2383{
d7c86ff8 2384 cifs_sb_active(cfile->dentry->d_sb);
3bc303c2 2385 cifsFileInfo_get(cfile);
3bc303c2
JL
2386}
2387
9b646972 2388void cifs_oplock_break_put(struct cifsFileInfo *cfile)
3bc303c2 2389{
3bc303c2 2390 cifsFileInfo_put(cfile);
d7c86ff8 2391 cifs_sb_deactive(cfile->dentry->d_sb);
3bc303c2
JL
2392}
2393
f5e54d6e 2394const struct address_space_operations cifs_addr_ops = {
1da177e4
LT
2395 .readpage = cifs_readpage,
2396 .readpages = cifs_readpages,
2397 .writepage = cifs_writepage,
37c0eb46 2398 .writepages = cifs_writepages,
d9414774
NP
2399 .write_begin = cifs_write_begin,
2400 .write_end = cifs_write_end,
1da177e4 2401 .set_page_dirty = __set_page_dirty_nobuffers,
85f2d6b4
SJ
2402 .releasepage = cifs_release_page,
2403 .invalidatepage = cifs_invalidate_page,
1da177e4
LT
2404 /* .sync_page = cifs_sync_page, */
2405 /* .direct_IO = */
2406};
273d81d6
DK
2407
2408/*
2409 * cifs_readpages requires the server to support a buffer large enough to
2410 * contain the header plus one complete page of data. Otherwise, we need
2411 * to leave cifs_readpages out of the address space operations.
2412 */
f5e54d6e 2413const struct address_space_operations cifs_addr_ops_smallbuf = {
273d81d6
DK
2414 .readpage = cifs_readpage,
2415 .writepage = cifs_writepage,
2416 .writepages = cifs_writepages,
d9414774
NP
2417 .write_begin = cifs_write_begin,
2418 .write_end = cifs_write_end,
273d81d6 2419 .set_page_dirty = __set_page_dirty_nobuffers,
85f2d6b4
SJ
2420 .releasepage = cifs_release_page,
2421 .invalidatepage = cifs_invalidate_page,
273d81d6
DK
2422 /* .sync_page = cifs_sync_page, */
2423 /* .direct_IO = */
2424};
This page took 0.449945 seconds and 5 git commands to generate.