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