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