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