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