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