]> bbs.cooldavid.org Git - net-next-2.6.git/blame - fs/cifs/file.c
Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/kyle/parisc-2.6
[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);
eb4b756b 134 mapping_set_error(inode->i_mapping, rc);
1da177e4 135 }
b6b38f70
JP
136 cFYI(1, "invalidating remote inode since open detected it "
137 "changed");
db460242 138 invalidate_remote_inode(inode);
1da177e4
LT
139 }
140
141client_can_cache:
c18c842b 142 if (pTcon->unix_ext)
db460242
JL
143 rc = cifs_get_inode_info_unix(&inode, full_path, inode->i_sb,
144 xid);
1da177e4 145 else
db460242
JL
146 rc = cifs_get_inode_info(&inode, full_path, buf, inode->i_sb,
147 xid, NULL);
1da177e4 148
a347ecb2 149 if ((oplock & 0xF) == OPLOCK_EXCLUSIVE) {
4b18f2a9
SF
150 pCifsInode->clientCanCacheAll = true;
151 pCifsInode->clientCanCacheRead = true;
db460242 152 cFYI(1, "Exclusive Oplock granted on inode %p", inode);
a347ecb2 153 } else if ((oplock & 0xF) == OPLOCK_READ)
4b18f2a9 154 pCifsInode->clientCanCacheRead = true;
1da177e4
LT
155
156 return rc;
157}
158
608712fe
JL
159int cifs_posix_open(char *full_path, struct inode **pinode,
160 struct super_block *sb, int mode, unsigned int f_flags,
161 __u32 *poplock, __u16 *pnetfid, int xid)
162{
163 int rc;
164 FILE_UNIX_BASIC_INFO *presp_data;
165 __u32 posix_flags = 0;
166 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
167 struct cifs_fattr fattr;
168 struct tcon_link *tlink;
169 struct cifsTconInfo *tcon;
170
171 cFYI(1, "posix open %s", full_path);
172
173 presp_data = kzalloc(sizeof(FILE_UNIX_BASIC_INFO), GFP_KERNEL);
174 if (presp_data == NULL)
175 return -ENOMEM;
176
177 tlink = cifs_sb_tlink(cifs_sb);
178 if (IS_ERR(tlink)) {
179 rc = PTR_ERR(tlink);
180 goto posix_open_ret;
181 }
182
183 tcon = tlink_tcon(tlink);
184 mode &= ~current_umask();
185
186 posix_flags = cifs_posix_convert_flags(f_flags);
187 rc = CIFSPOSIXCreate(xid, tcon, posix_flags, mode, pnetfid, presp_data,
188 poplock, full_path, cifs_sb->local_nls,
189 cifs_sb->mnt_cifs_flags &
190 CIFS_MOUNT_MAP_SPECIAL_CHR);
191 cifs_put_tlink(tlink);
192
193 if (rc)
194 goto posix_open_ret;
195
196 if (presp_data->Type == cpu_to_le32(-1))
197 goto posix_open_ret; /* open ok, caller does qpathinfo */
198
199 if (!pinode)
200 goto posix_open_ret; /* caller does not need info */
201
202 cifs_unix_basic_to_fattr(&fattr, presp_data, cifs_sb);
203
204 /* get new inode and set it up */
205 if (*pinode == NULL) {
206 cifs_fill_uniqueid(sb, &fattr);
207 *pinode = cifs_iget(sb, &fattr);
208 if (!*pinode) {
209 rc = -ENOMEM;
210 goto posix_open_ret;
211 }
212 } else {
213 cifs_fattr_to_inode(*pinode, &fattr);
214 }
215
216posix_open_ret:
217 kfree(presp_data);
218 return rc;
219}
220
15ecb436
JL
221struct cifsFileInfo *
222cifs_new_fileinfo(__u16 fileHandle, struct file *file,
223 struct tcon_link *tlink, __u32 oplock)
224{
225 struct dentry *dentry = file->f_path.dentry;
226 struct inode *inode = dentry->d_inode;
227 struct cifsInodeInfo *pCifsInode = CIFS_I(inode);
228 struct cifsFileInfo *pCifsFile;
229
230 pCifsFile = kzalloc(sizeof(struct cifsFileInfo), GFP_KERNEL);
231 if (pCifsFile == NULL)
232 return pCifsFile;
233
5f6dbc9e 234 pCifsFile->count = 1;
15ecb436
JL
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);
15ecb436
JL
245 INIT_WORK(&pCifsFile->oplock_break, cifs_oplock_break);
246
4477288a 247 spin_lock(&cifs_file_list_lock);
15ecb436
JL
248 list_add(&pCifsFile->tlist, &(tlink_tcon(tlink)->openFileList));
249 /* if readable file instance put first in list*/
250 if (file->f_mode & FMODE_READ)
251 list_add(&pCifsFile->flist, &pCifsInode->openFileList);
252 else
253 list_add_tail(&pCifsFile->flist, &pCifsInode->openFileList);
4477288a 254 spin_unlock(&cifs_file_list_lock);
15ecb436
JL
255
256 if ((oplock & 0xF) == OPLOCK_EXCLUSIVE) {
257 pCifsInode->clientCanCacheAll = true;
258 pCifsInode->clientCanCacheRead = true;
259 cFYI(1, "Exclusive Oplock inode %p", inode);
260 } else if ((oplock & 0xF) == OPLOCK_READ)
261 pCifsInode->clientCanCacheRead = true;
262
263 file->private_data = pCifsFile;
264 return pCifsFile;
265}
266
cdff08e7
SF
267/*
268 * Release a reference on the file private data. This may involve closing
5f6dbc9e
JL
269 * the filehandle out on the server. Must be called without holding
270 * cifs_file_list_lock.
cdff08e7 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);
5f6dbc9e 279 if (--cifs_file->count > 0) {
cdff08e7
SF
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);
eb4b756b 608 mapping_set_error(inode->i_mapping, rc);
15886177
JL
609
610 pCifsInode->clientCanCacheAll = false;
611 pCifsInode->clientCanCacheRead = false;
612 if (tcon->unix_ext)
613 rc = cifs_get_inode_info_unix(&inode,
614 full_path, inode->i_sb, xid);
615 else
616 rc = cifs_get_inode_info(&inode,
617 full_path, NULL, inode->i_sb,
618 xid, NULL);
619 } /* else we are writing out data to server already
620 and could deadlock if we tried to flush data, and
621 since we do not know if we have data that would
622 invalidate the current end of file on the server
623 we can not go to the server to get the new inod
624 info */
625 if ((oplock & 0xF) == OPLOCK_EXCLUSIVE) {
626 pCifsInode->clientCanCacheAll = true;
627 pCifsInode->clientCanCacheRead = true;
628 cFYI(1, "Exclusive Oplock granted on inode %p",
629 pCifsFile->dentry->d_inode);
630 } else if ((oplock & 0xF) == OPLOCK_READ) {
631 pCifsInode->clientCanCacheRead = true;
632 pCifsInode->clientCanCacheAll = false;
633 } else {
634 pCifsInode->clientCanCacheRead = false;
635 pCifsInode->clientCanCacheAll = false;
1da177e4 636 }
15886177
JL
637 cifs_relock_file(pCifsFile);
638
639reopen_error_exit:
1da177e4
LT
640 kfree(full_path);
641 FreeXid(xid);
642 return rc;
643}
644
645int cifs_close(struct inode *inode, struct file *file)
646{
cdff08e7
SF
647 cifsFileInfo_put(file->private_data);
648 file->private_data = NULL;
7ee1af76 649
cdff08e7
SF
650 /* return code from the ->release op is always ignored */
651 return 0;
1da177e4
LT
652}
653
654int cifs_closedir(struct inode *inode, struct file *file)
655{
656 int rc = 0;
657 int xid;
c21dfb69 658 struct cifsFileInfo *pCFileStruct = file->private_data;
1da177e4
LT
659 char *ptmp;
660
b6b38f70 661 cFYI(1, "Closedir inode = 0x%p", inode);
1da177e4
LT
662
663 xid = GetXid();
664
665 if (pCFileStruct) {
13cfb733 666 struct cifsTconInfo *pTcon = tlink_tcon(pCFileStruct->tlink);
1da177e4 667
b6b38f70 668 cFYI(1, "Freeing private data in close dir");
4477288a 669 spin_lock(&cifs_file_list_lock);
4b18f2a9
SF
670 if (!pCFileStruct->srch_inf.endOfSearch &&
671 !pCFileStruct->invalidHandle) {
672 pCFileStruct->invalidHandle = true;
4477288a 673 spin_unlock(&cifs_file_list_lock);
1da177e4 674 rc = CIFSFindClose(xid, pTcon, pCFileStruct->netfid);
b6b38f70
JP
675 cFYI(1, "Closing uncompleted readdir with rc %d",
676 rc);
1da177e4
LT
677 /* not much we can do if it fails anyway, ignore rc */
678 rc = 0;
ddb4cbfc 679 } else
4477288a 680 spin_unlock(&cifs_file_list_lock);
1da177e4
LT
681 ptmp = pCFileStruct->srch_inf.ntwrk_buf_start;
682 if (ptmp) {
b6b38f70 683 cFYI(1, "closedir free smb buf in srch struct");
1da177e4 684 pCFileStruct->srch_inf.ntwrk_buf_start = NULL;
fb8c4b14 685 if (pCFileStruct->srch_inf.smallBuf)
d47d7c1a
SF
686 cifs_small_buf_release(ptmp);
687 else
688 cifs_buf_release(ptmp);
1da177e4 689 }
13cfb733 690 cifs_put_tlink(pCFileStruct->tlink);
1da177e4
LT
691 kfree(file->private_data);
692 file->private_data = NULL;
693 }
694 /* BB can we lock the filestruct while this is going on? */
695 FreeXid(xid);
696 return rc;
697}
698
7ee1af76
JA
699static int store_file_lock(struct cifsFileInfo *fid, __u64 len,
700 __u64 offset, __u8 lockType)
701{
fb8c4b14
SF
702 struct cifsLockInfo *li =
703 kmalloc(sizeof(struct cifsLockInfo), GFP_KERNEL);
7ee1af76
JA
704 if (li == NULL)
705 return -ENOMEM;
706 li->offset = offset;
707 li->length = len;
708 li->type = lockType;
796e5661 709 mutex_lock(&fid->lock_mutex);
7ee1af76 710 list_add(&li->llist, &fid->llist);
796e5661 711 mutex_unlock(&fid->lock_mutex);
7ee1af76
JA
712 return 0;
713}
714
1da177e4
LT
715int cifs_lock(struct file *file, int cmd, struct file_lock *pfLock)
716{
717 int rc, xid;
1da177e4
LT
718 __u32 numLock = 0;
719 __u32 numUnlock = 0;
720 __u64 length;
4b18f2a9 721 bool wait_flag = false;
1da177e4 722 struct cifs_sb_info *cifs_sb;
13a6e42a 723 struct cifsTconInfo *tcon;
08547b03
SF
724 __u16 netfid;
725 __u8 lockType = LOCKING_ANDX_LARGE_FILES;
13a6e42a 726 bool posix_locking = 0;
1da177e4
LT
727
728 length = 1 + pfLock->fl_end - pfLock->fl_start;
729 rc = -EACCES;
730 xid = GetXid();
731
b6b38f70 732 cFYI(1, "Lock parm: 0x%x flockflags: "
1da177e4 733 "0x%x flocktype: 0x%x start: %lld end: %lld",
fb8c4b14 734 cmd, pfLock->fl_flags, pfLock->fl_type, pfLock->fl_start,
b6b38f70 735 pfLock->fl_end);
1da177e4
LT
736
737 if (pfLock->fl_flags & FL_POSIX)
b6b38f70 738 cFYI(1, "Posix");
1da177e4 739 if (pfLock->fl_flags & FL_FLOCK)
b6b38f70 740 cFYI(1, "Flock");
1da177e4 741 if (pfLock->fl_flags & FL_SLEEP) {
b6b38f70 742 cFYI(1, "Blocking lock");
4b18f2a9 743 wait_flag = true;
1da177e4
LT
744 }
745 if (pfLock->fl_flags & FL_ACCESS)
b6b38f70
JP
746 cFYI(1, "Process suspended by mandatory locking - "
747 "not implemented yet");
1da177e4 748 if (pfLock->fl_flags & FL_LEASE)
b6b38f70 749 cFYI(1, "Lease on file - not implemented yet");
fb8c4b14 750 if (pfLock->fl_flags &
1da177e4 751 (~(FL_POSIX | FL_FLOCK | FL_SLEEP | FL_ACCESS | FL_LEASE)))
b6b38f70 752 cFYI(1, "Unknown lock flags 0x%x", pfLock->fl_flags);
1da177e4
LT
753
754 if (pfLock->fl_type == F_WRLCK) {
b6b38f70 755 cFYI(1, "F_WRLCK ");
1da177e4
LT
756 numLock = 1;
757 } else if (pfLock->fl_type == F_UNLCK) {
b6b38f70 758 cFYI(1, "F_UNLCK");
1da177e4 759 numUnlock = 1;
d47d7c1a
SF
760 /* Check if unlock includes more than
761 one lock range */
1da177e4 762 } else if (pfLock->fl_type == F_RDLCK) {
b6b38f70 763 cFYI(1, "F_RDLCK");
1da177e4
LT
764 lockType |= LOCKING_ANDX_SHARED_LOCK;
765 numLock = 1;
766 } else if (pfLock->fl_type == F_EXLCK) {
b6b38f70 767 cFYI(1, "F_EXLCK");
1da177e4
LT
768 numLock = 1;
769 } else if (pfLock->fl_type == F_SHLCK) {
b6b38f70 770 cFYI(1, "F_SHLCK");
1da177e4
LT
771 lockType |= LOCKING_ANDX_SHARED_LOCK;
772 numLock = 1;
773 } else
b6b38f70 774 cFYI(1, "Unknown type of lock");
1da177e4 775
e6a00296 776 cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
13cfb733 777 tcon = tlink_tcon(((struct cifsFileInfo *)file->private_data)->tlink);
1da177e4
LT
778
779 if (file->private_data == NULL) {
0f3bc09e 780 rc = -EBADF;
1da177e4 781 FreeXid(xid);
0f3bc09e 782 return rc;
1da177e4 783 }
08547b03
SF
784 netfid = ((struct cifsFileInfo *)file->private_data)->netfid;
785
13a6e42a
SF
786 if ((tcon->ses->capabilities & CAP_UNIX) &&
787 (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) &&
acc18aa1 788 ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0))
13a6e42a 789 posix_locking = 1;
08547b03
SF
790 /* BB add code here to normalize offset and length to
791 account for negative length which we can not accept over the
792 wire */
1da177e4 793 if (IS_GETLK(cmd)) {
fb8c4b14 794 if (posix_locking) {
08547b03 795 int posix_lock_type;
fb8c4b14 796 if (lockType & LOCKING_ANDX_SHARED_LOCK)
08547b03
SF
797 posix_lock_type = CIFS_RDLCK;
798 else
799 posix_lock_type = CIFS_WRLCK;
13a6e42a 800 rc = CIFSSMBPosixLock(xid, tcon, netfid, 1 /* get */,
fc94cdb9 801 length, pfLock,
08547b03
SF
802 posix_lock_type, wait_flag);
803 FreeXid(xid);
804 return rc;
805 }
806
807 /* BB we could chain these into one lock request BB */
13a6e42a 808 rc = CIFSSMBLock(xid, tcon, netfid, length, pfLock->fl_start,
08547b03 809 0, 1, lockType, 0 /* wait flag */ );
1da177e4 810 if (rc == 0) {
13a6e42a 811 rc = CIFSSMBLock(xid, tcon, netfid, length,
1da177e4
LT
812 pfLock->fl_start, 1 /* numUnlock */ ,
813 0 /* numLock */ , lockType,
814 0 /* wait flag */ );
815 pfLock->fl_type = F_UNLCK;
816 if (rc != 0)
b6b38f70
JP
817 cERROR(1, "Error unlocking previously locked "
818 "range %d during test of lock", rc);
1da177e4
LT
819 rc = 0;
820
821 } else {
822 /* if rc == ERR_SHARING_VIOLATION ? */
f05337c6
PS
823 rc = 0;
824
825 if (lockType & LOCKING_ANDX_SHARED_LOCK) {
826 pfLock->fl_type = F_WRLCK;
827 } else {
828 rc = CIFSSMBLock(xid, tcon, netfid, length,
829 pfLock->fl_start, 0, 1,
830 lockType | LOCKING_ANDX_SHARED_LOCK,
831 0 /* wait flag */);
832 if (rc == 0) {
833 rc = CIFSSMBLock(xid, tcon, netfid,
834 length, pfLock->fl_start, 1, 0,
835 lockType |
836 LOCKING_ANDX_SHARED_LOCK,
837 0 /* wait flag */);
838 pfLock->fl_type = F_RDLCK;
839 if (rc != 0)
f19159dc 840 cERROR(1, "Error unlocking "
f05337c6 841 "previously locked range %d "
f19159dc 842 "during test of lock", rc);
f05337c6
PS
843 rc = 0;
844 } else {
845 pfLock->fl_type = F_WRLCK;
846 rc = 0;
847 }
848 }
1da177e4
LT
849 }
850
851 FreeXid(xid);
852 return rc;
853 }
7ee1af76
JA
854
855 if (!numLock && !numUnlock) {
856 /* if no lock or unlock then nothing
857 to do since we do not know what it is */
858 FreeXid(xid);
859 return -EOPNOTSUPP;
860 }
861
862 if (posix_locking) {
08547b03 863 int posix_lock_type;
fb8c4b14 864 if (lockType & LOCKING_ANDX_SHARED_LOCK)
08547b03
SF
865 posix_lock_type = CIFS_RDLCK;
866 else
867 posix_lock_type = CIFS_WRLCK;
50c2f753 868
fb8c4b14 869 if (numUnlock == 1)
beb84dc8 870 posix_lock_type = CIFS_UNLCK;
7ee1af76 871
13a6e42a 872 rc = CIFSSMBPosixLock(xid, tcon, netfid, 0 /* set */,
fc94cdb9 873 length, pfLock,
08547b03 874 posix_lock_type, wait_flag);
7ee1af76 875 } else {
c21dfb69 876 struct cifsFileInfo *fid = file->private_data;
7ee1af76
JA
877
878 if (numLock) {
13a6e42a 879 rc = CIFSSMBLock(xid, tcon, netfid, length,
fb8c4b14 880 pfLock->fl_start,
7ee1af76
JA
881 0, numLock, lockType, wait_flag);
882
883 if (rc == 0) {
884 /* For Windows locks we must store them. */
885 rc = store_file_lock(fid, length,
886 pfLock->fl_start, lockType);
887 }
888 } else if (numUnlock) {
889 /* For each stored lock that this unlock overlaps
890 completely, unlock it. */
891 int stored_rc = 0;
892 struct cifsLockInfo *li, *tmp;
893
6b70c955 894 rc = 0;
796e5661 895 mutex_lock(&fid->lock_mutex);
7ee1af76
JA
896 list_for_each_entry_safe(li, tmp, &fid->llist, llist) {
897 if (pfLock->fl_start <= li->offset &&
c19eb710 898 (pfLock->fl_start + length) >=
39db810c 899 (li->offset + li->length)) {
13a6e42a 900 stored_rc = CIFSSMBLock(xid, tcon,
fb8c4b14 901 netfid,
7ee1af76 902 li->length, li->offset,
4b18f2a9 903 1, 0, li->type, false);
7ee1af76
JA
904 if (stored_rc)
905 rc = stored_rc;
2c964d1f
PS
906 else {
907 list_del(&li->llist);
908 kfree(li);
909 }
7ee1af76
JA
910 }
911 }
796e5661 912 mutex_unlock(&fid->lock_mutex);
7ee1af76
JA
913 }
914 }
915
d634cc15 916 if (pfLock->fl_flags & FL_POSIX)
1da177e4
LT
917 posix_lock_file_wait(file, pfLock);
918 FreeXid(xid);
919 return rc;
920}
921
fbec9ab9
JL
922/*
923 * Set the timeout on write requests past EOF. For some servers (Windows)
924 * these calls can be very long.
925 *
926 * If we're writing >10M past the EOF we give a 180s timeout. Anything less
927 * than that gets a 45s timeout. Writes not past EOF get 15s timeouts.
928 * The 10M cutoff is totally arbitrary. A better scheme for this would be
929 * welcome if someone wants to suggest one.
930 *
931 * We may be able to do a better job with this if there were some way to
932 * declare that a file should be sparse.
933 */
934static int
935cifs_write_timeout(struct cifsInodeInfo *cifsi, loff_t offset)
936{
937 if (offset <= cifsi->server_eof)
938 return CIFS_STD_OP;
939 else if (offset > (cifsi->server_eof + (10 * 1024 * 1024)))
940 return CIFS_VLONG_OP;
941 else
942 return CIFS_LONG_OP;
943}
944
945/* update the file size (if needed) after a write */
946static void
947cifs_update_eof(struct cifsInodeInfo *cifsi, loff_t offset,
948 unsigned int bytes_written)
949{
950 loff_t end_of_write = offset + bytes_written;
951
952 if (end_of_write > cifsi->server_eof)
953 cifsi->server_eof = end_of_write;
954}
955
1da177e4
LT
956ssize_t cifs_user_write(struct file *file, const char __user *write_data,
957 size_t write_size, loff_t *poffset)
958{
959 int rc = 0;
960 unsigned int bytes_written = 0;
961 unsigned int total_written;
962 struct cifs_sb_info *cifs_sb;
963 struct cifsTconInfo *pTcon;
964 int xid, long_op;
965 struct cifsFileInfo *open_file;
fbec9ab9 966 struct cifsInodeInfo *cifsi = CIFS_I(file->f_path.dentry->d_inode);
1da177e4 967
e6a00296 968 cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
1da177e4 969
b6b38f70
JP
970 /* cFYI(1, " write %d bytes to offset %lld of %s", write_size,
971 *poffset, file->f_path.dentry->d_name.name); */
1da177e4
LT
972
973 if (file->private_data == NULL)
974 return -EBADF;
ba00ba64 975
c21dfb69 976 open_file = file->private_data;
13cfb733 977 pTcon = tlink_tcon(open_file->tlink);
50c2f753 978
838726c4
JL
979 rc = generic_write_checks(file, poffset, &write_size, 0);
980 if (rc)
981 return rc;
982
1da177e4 983 xid = GetXid();
1da177e4 984
fbec9ab9 985 long_op = cifs_write_timeout(cifsi, *poffset);
1da177e4
LT
986 for (total_written = 0; write_size > total_written;
987 total_written += bytes_written) {
988 rc = -EAGAIN;
989 while (rc == -EAGAIN) {
990 if (file->private_data == NULL) {
991 /* file has been closed on us */
992 FreeXid(xid);
993 /* if we have gotten here we have written some data
994 and blocked, and the file has been freed on us while
995 we blocked so return what we managed to write */
996 return total_written;
fb8c4b14 997 }
1da177e4 998 if (open_file->invalidHandle) {
1da177e4
LT
999 /* we could deadlock if we called
1000 filemap_fdatawait from here so tell
1001 reopen_file not to flush data to server
1002 now */
15886177 1003 rc = cifs_reopen_file(open_file, false);
1da177e4
LT
1004 if (rc != 0)
1005 break;
1006 }
1007
1008 rc = CIFSSMBWrite(xid, pTcon,
1009 open_file->netfid,
1010 min_t(const int, cifs_sb->wsize,
1011 write_size - total_written),
1012 *poffset, &bytes_written,
1013 NULL, write_data + total_written, long_op);
1014 }
1015 if (rc || (bytes_written == 0)) {
1016 if (total_written)
1017 break;
1018 else {
1019 FreeXid(xid);
1020 return rc;
1021 }
fbec9ab9
JL
1022 } else {
1023 cifs_update_eof(cifsi, *poffset, bytes_written);
1da177e4 1024 *poffset += bytes_written;
fbec9ab9 1025 }
133672ef 1026 long_op = CIFS_STD_OP; /* subsequent writes fast -
1da177e4
LT
1027 15 seconds is plenty */
1028 }
1029
a4544347 1030 cifs_stats_bytes_written(pTcon, total_written);
1da177e4
LT
1031
1032 /* since the write may have blocked check these pointers again */
3677db10
SF
1033 if ((file->f_path.dentry) && (file->f_path.dentry->d_inode)) {
1034 struct inode *inode = file->f_path.dentry->d_inode;
fb8c4b14
SF
1035/* Do not update local mtime - server will set its actual value on write
1036 * inode->i_ctime = inode->i_mtime =
3677db10
SF
1037 * current_fs_time(inode->i_sb);*/
1038 if (total_written > 0) {
1039 spin_lock(&inode->i_lock);
1040 if (*poffset > file->f_path.dentry->d_inode->i_size)
1041 i_size_write(file->f_path.dentry->d_inode,
1da177e4 1042 *poffset);
3677db10 1043 spin_unlock(&inode->i_lock);
1da177e4 1044 }
fb8c4b14 1045 mark_inode_dirty_sync(file->f_path.dentry->d_inode);
1da177e4
LT
1046 }
1047 FreeXid(xid);
1048 return total_written;
1049}
1050
7da4b49a
JL
1051static ssize_t cifs_write(struct cifsFileInfo *open_file,
1052 const char *write_data, size_t write_size,
1053 loff_t *poffset)
1da177e4
LT
1054{
1055 int rc = 0;
1056 unsigned int bytes_written = 0;
1057 unsigned int total_written;
1058 struct cifs_sb_info *cifs_sb;
1059 struct cifsTconInfo *pTcon;
1060 int xid, long_op;
7da4b49a
JL
1061 struct dentry *dentry = open_file->dentry;
1062 struct cifsInodeInfo *cifsi = CIFS_I(dentry->d_inode);
1da177e4 1063
7da4b49a 1064 cifs_sb = CIFS_SB(dentry->d_sb);
1da177e4 1065
b6b38f70 1066 cFYI(1, "write %zd bytes to offset %lld of %s", write_size,
7da4b49a 1067 *poffset, dentry->d_name.name);
1da177e4 1068
13cfb733 1069 pTcon = tlink_tcon(open_file->tlink);
50c2f753 1070
1da177e4 1071 xid = GetXid();
1da177e4 1072
fbec9ab9 1073 long_op = cifs_write_timeout(cifsi, *poffset);
1da177e4
LT
1074 for (total_written = 0; write_size > total_written;
1075 total_written += bytes_written) {
1076 rc = -EAGAIN;
1077 while (rc == -EAGAIN) {
1da177e4 1078 if (open_file->invalidHandle) {
1da177e4
LT
1079 /* we could deadlock if we called
1080 filemap_fdatawait from here so tell
fb8c4b14 1081 reopen_file not to flush data to
1da177e4 1082 server now */
15886177 1083 rc = cifs_reopen_file(open_file, false);
1da177e4
LT
1084 if (rc != 0)
1085 break;
1086 }
fb8c4b14
SF
1087 if (experimEnabled || (pTcon->ses->server &&
1088 ((pTcon->ses->server->secMode &
08775834 1089 (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
c01f36a8 1090 == 0))) {
3e84469d
SF
1091 struct kvec iov[2];
1092 unsigned int len;
1093
0ae0efad 1094 len = min((size_t)cifs_sb->wsize,
3e84469d
SF
1095 write_size - total_written);
1096 /* iov[0] is reserved for smb header */
1097 iov[1].iov_base = (char *)write_data +
1098 total_written;
1099 iov[1].iov_len = len;
d6e04ae6 1100 rc = CIFSSMBWrite2(xid, pTcon,
3e84469d 1101 open_file->netfid, len,
d6e04ae6 1102 *poffset, &bytes_written,
3e84469d 1103 iov, 1, long_op);
d6e04ae6 1104 } else
60808233
SF
1105 rc = CIFSSMBWrite(xid, pTcon,
1106 open_file->netfid,
1107 min_t(const int, cifs_sb->wsize,
1108 write_size - total_written),
1109 *poffset, &bytes_written,
1110 write_data + total_written,
1111 NULL, long_op);
1da177e4
LT
1112 }
1113 if (rc || (bytes_written == 0)) {
1114 if (total_written)
1115 break;
1116 else {
1117 FreeXid(xid);
1118 return rc;
1119 }
fbec9ab9
JL
1120 } else {
1121 cifs_update_eof(cifsi, *poffset, bytes_written);
1da177e4 1122 *poffset += bytes_written;
fbec9ab9 1123 }
133672ef 1124 long_op = CIFS_STD_OP; /* subsequent writes fast -
1da177e4
LT
1125 15 seconds is plenty */
1126 }
1127
a4544347 1128 cifs_stats_bytes_written(pTcon, total_written);
1da177e4 1129
7da4b49a
JL
1130 if (total_written > 0) {
1131 spin_lock(&dentry->d_inode->i_lock);
1132 if (*poffset > dentry->d_inode->i_size)
1133 i_size_write(dentry->d_inode, *poffset);
1134 spin_unlock(&dentry->d_inode->i_lock);
1da177e4 1135 }
7da4b49a 1136 mark_inode_dirty_sync(dentry->d_inode);
1da177e4
LT
1137 FreeXid(xid);
1138 return total_written;
1139}
1140
630f3f0c 1141#ifdef CONFIG_CIFS_EXPERIMENTAL
6508d904
JL
1142struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *cifs_inode,
1143 bool fsuid_only)
630f3f0c
SF
1144{
1145 struct cifsFileInfo *open_file = NULL;
6508d904
JL
1146 struct cifs_sb_info *cifs_sb = CIFS_SB(cifs_inode->vfs_inode.i_sb);
1147
1148 /* only filter by fsuid on multiuser mounts */
1149 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
1150 fsuid_only = false;
630f3f0c 1151
4477288a 1152 spin_lock(&cifs_file_list_lock);
630f3f0c
SF
1153 /* we could simply get the first_list_entry since write-only entries
1154 are always at the end of the list but since the first entry might
1155 have a close pending, we go through the whole list */
1156 list_for_each_entry(open_file, &cifs_inode->openFileList, flist) {
6508d904
JL
1157 if (fsuid_only && open_file->uid != current_fsuid())
1158 continue;
2e396b83 1159 if (OPEN_FMODE(open_file->f_flags) & FMODE_READ) {
630f3f0c
SF
1160 if (!open_file->invalidHandle) {
1161 /* found a good file */
1162 /* lock it so it will not be closed on us */
6ab409b5 1163 cifsFileInfo_get(open_file);
4477288a 1164 spin_unlock(&cifs_file_list_lock);
630f3f0c
SF
1165 return open_file;
1166 } /* else might as well continue, and look for
1167 another, or simply have the caller reopen it
1168 again rather than trying to fix this handle */
1169 } else /* write only file */
1170 break; /* write only files are last so must be done */
1171 }
4477288a 1172 spin_unlock(&cifs_file_list_lock);
630f3f0c
SF
1173 return NULL;
1174}
1175#endif
1176
6508d904
JL
1177struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *cifs_inode,
1178 bool fsuid_only)
6148a742
SF
1179{
1180 struct cifsFileInfo *open_file;
6508d904 1181 struct cifs_sb_info *cifs_sb = CIFS_SB(cifs_inode->vfs_inode.i_sb);
2846d386 1182 bool any_available = false;
dd99cd80 1183 int rc;
6148a742 1184
60808233
SF
1185 /* Having a null inode here (because mapping->host was set to zero by
1186 the VFS or MM) should not happen but we had reports of on oops (due to
1187 it being zero) during stress testcases so we need to check for it */
1188
fb8c4b14 1189 if (cifs_inode == NULL) {
b6b38f70 1190 cERROR(1, "Null inode passed to cifs_writeable_file");
60808233
SF
1191 dump_stack();
1192 return NULL;
1193 }
1194
6508d904
JL
1195 /* only filter by fsuid on multiuser mounts */
1196 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
1197 fsuid_only = false;
1198
4477288a 1199 spin_lock(&cifs_file_list_lock);
9b22b0b7 1200refind_writable:
6148a742 1201 list_for_each_entry(open_file, &cifs_inode->openFileList, flist) {
6508d904
JL
1202 if (!any_available && open_file->pid != current->tgid)
1203 continue;
1204 if (fsuid_only && open_file->uid != current_fsuid())
6148a742 1205 continue;
2e396b83 1206 if (OPEN_FMODE(open_file->f_flags) & FMODE_WRITE) {
6ab409b5 1207 cifsFileInfo_get(open_file);
9b22b0b7
SF
1208
1209 if (!open_file->invalidHandle) {
1210 /* found a good writable file */
4477288a 1211 spin_unlock(&cifs_file_list_lock);
9b22b0b7
SF
1212 return open_file;
1213 }
8840dee9 1214
4477288a 1215 spin_unlock(&cifs_file_list_lock);
cdff08e7 1216
9b22b0b7 1217 /* Had to unlock since following call can block */
15886177 1218 rc = cifs_reopen_file(open_file, false);
cdff08e7
SF
1219 if (!rc)
1220 return open_file;
9b22b0b7 1221
cdff08e7 1222 /* if it fails, try another handle if possible */
b6b38f70 1223 cFYI(1, "wp failed on reopen file");
6ab409b5 1224 cifsFileInfo_put(open_file);
8840dee9 1225
cdff08e7
SF
1226 spin_lock(&cifs_file_list_lock);
1227
9b22b0b7
SF
1228 /* else we simply continue to the next entry. Thus
1229 we do not loop on reopen errors. If we
1230 can not reopen the file, for example if we
1231 reconnected to a server with another client
1232 racing to delete or lock the file we would not
1233 make progress if we restarted before the beginning
1234 of the loop here. */
6148a742
SF
1235 }
1236 }
2846d386
JL
1237 /* couldn't find useable FH with same pid, try any available */
1238 if (!any_available) {
1239 any_available = true;
1240 goto refind_writable;
1241 }
4477288a 1242 spin_unlock(&cifs_file_list_lock);
6148a742
SF
1243 return NULL;
1244}
1245
1da177e4
LT
1246static int cifs_partialpagewrite(struct page *page, unsigned from, unsigned to)
1247{
1248 struct address_space *mapping = page->mapping;
1249 loff_t offset = (loff_t)page->index << PAGE_CACHE_SHIFT;
1250 char *write_data;
1251 int rc = -EFAULT;
1252 int bytes_written = 0;
1253 struct cifs_sb_info *cifs_sb;
1da177e4 1254 struct inode *inode;
6148a742 1255 struct cifsFileInfo *open_file;
1da177e4
LT
1256
1257 if (!mapping || !mapping->host)
1258 return -EFAULT;
1259
1260 inode = page->mapping->host;
1261 cifs_sb = CIFS_SB(inode->i_sb);
1da177e4
LT
1262
1263 offset += (loff_t)from;
1264 write_data = kmap(page);
1265 write_data += from;
1266
1267 if ((to > PAGE_CACHE_SIZE) || (from > to)) {
1268 kunmap(page);
1269 return -EIO;
1270 }
1271
1272 /* racing with truncate? */
1273 if (offset > mapping->host->i_size) {
1274 kunmap(page);
1275 return 0; /* don't care */
1276 }
1277
1278 /* check to make sure that we are not extending the file */
1279 if (mapping->host->i_size - offset < (loff_t)to)
fb8c4b14 1280 to = (unsigned)(mapping->host->i_size - offset);
1da177e4 1281
6508d904 1282 open_file = find_writable_file(CIFS_I(mapping->host), false);
6148a742 1283 if (open_file) {
7da4b49a
JL
1284 bytes_written = cifs_write(open_file, write_data,
1285 to - from, &offset);
6ab409b5 1286 cifsFileInfo_put(open_file);
1da177e4 1287 /* Does mm or vfs already set times? */
6148a742 1288 inode->i_atime = inode->i_mtime = current_fs_time(inode->i_sb);
bb5a9a04 1289 if ((bytes_written > 0) && (offset))
6148a742 1290 rc = 0;
bb5a9a04
SF
1291 else if (bytes_written < 0)
1292 rc = bytes_written;
6148a742 1293 } else {
b6b38f70 1294 cFYI(1, "No writeable filehandles for inode");
1da177e4
LT
1295 rc = -EIO;
1296 }
1297
1298 kunmap(page);
1299 return rc;
1300}
1301
1da177e4 1302static int cifs_writepages(struct address_space *mapping,
37c0eb46 1303 struct writeback_control *wbc)
1da177e4 1304{
37c0eb46
SF
1305 unsigned int bytes_to_write;
1306 unsigned int bytes_written;
1307 struct cifs_sb_info *cifs_sb;
1308 int done = 0;
111ebb6e 1309 pgoff_t end;
37c0eb46 1310 pgoff_t index;
fb8c4b14
SF
1311 int range_whole = 0;
1312 struct kvec *iov;
84d2f07e 1313 int len;
37c0eb46
SF
1314 int n_iov = 0;
1315 pgoff_t next;
1316 int nr_pages;
1317 __u64 offset = 0;
23e7dd7d 1318 struct cifsFileInfo *open_file;
ba00ba64 1319 struct cifsTconInfo *tcon;
fbec9ab9 1320 struct cifsInodeInfo *cifsi = CIFS_I(mapping->host);
37c0eb46
SF
1321 struct page *page;
1322 struct pagevec pvec;
1323 int rc = 0;
1324 int scanned = 0;
fbec9ab9 1325 int xid, long_op;
1da177e4 1326
37c0eb46 1327 cifs_sb = CIFS_SB(mapping->host->i_sb);
50c2f753 1328
37c0eb46
SF
1329 /*
1330 * If wsize is smaller that the page cache size, default to writing
1331 * one page at a time via cifs_writepage
1332 */
1333 if (cifs_sb->wsize < PAGE_CACHE_SIZE)
1334 return generic_writepages(mapping, wbc);
1335
9a0c8230 1336 iov = kmalloc(32 * sizeof(struct kvec), GFP_KERNEL);
fb8c4b14 1337 if (iov == NULL)
9a0c8230
SF
1338 return generic_writepages(mapping, wbc);
1339
37c0eb46 1340 /*
f3983c21
JL
1341 * if there's no open file, then this is likely to fail too,
1342 * but it'll at least handle the return. Maybe it should be
1343 * a BUG() instead?
37c0eb46 1344 */
6508d904 1345 open_file = find_writable_file(CIFS_I(mapping->host), false);
f3983c21 1346 if (!open_file) {
9a0c8230 1347 kfree(iov);
f3983c21
JL
1348 return generic_writepages(mapping, wbc);
1349 }
1350
13cfb733 1351 tcon = tlink_tcon(open_file->tlink);
f3983c21
JL
1352 if (!experimEnabled && tcon->ses->server->secMode &
1353 (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) {
1354 cifsFileInfo_put(open_file);
6b035904 1355 kfree(iov);
f3983c21 1356 return generic_writepages(mapping, wbc);
37c0eb46 1357 }
f3983c21 1358 cifsFileInfo_put(open_file);
37c0eb46 1359
1da177e4
LT
1360 xid = GetXid();
1361
37c0eb46 1362 pagevec_init(&pvec, 0);
111ebb6e 1363 if (wbc->range_cyclic) {
37c0eb46 1364 index = mapping->writeback_index; /* Start from prev offset */
111ebb6e
OH
1365 end = -1;
1366 } else {
1367 index = wbc->range_start >> PAGE_CACHE_SHIFT;
1368 end = wbc->range_end >> PAGE_CACHE_SHIFT;
1369 if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX)
1370 range_whole = 1;
37c0eb46
SF
1371 scanned = 1;
1372 }
1373retry:
1374 while (!done && (index <= end) &&
1375 (nr_pages = pagevec_lookup_tag(&pvec, mapping, &index,
1376 PAGECACHE_TAG_DIRTY,
1377 min(end - index, (pgoff_t)PAGEVEC_SIZE - 1) + 1))) {
1378 int first;
1379 unsigned int i;
1380
37c0eb46
SF
1381 first = -1;
1382 next = 0;
1383 n_iov = 0;
1384 bytes_to_write = 0;
1385
1386 for (i = 0; i < nr_pages; i++) {
1387 page = pvec.pages[i];
1388 /*
1389 * At this point we hold neither mapping->tree_lock nor
1390 * lock on the page itself: the page may be truncated or
1391 * invalidated (changing page->mapping to NULL), or even
1392 * swizzled back from swapper_space to tmpfs file
1393 * mapping
1394 */
1395
1396 if (first < 0)
1397 lock_page(page);
529ae9aa 1398 else if (!trylock_page(page))
37c0eb46
SF
1399 break;
1400
1401 if (unlikely(page->mapping != mapping)) {
1402 unlock_page(page);
1403 break;
1404 }
1405
111ebb6e 1406 if (!wbc->range_cyclic && page->index > end) {
37c0eb46
SF
1407 done = 1;
1408 unlock_page(page);
1409 break;
1410 }
1411
1412 if (next && (page->index != next)) {
1413 /* Not next consecutive page */
1414 unlock_page(page);
1415 break;
1416 }
1417
1418 if (wbc->sync_mode != WB_SYNC_NONE)
1419 wait_on_page_writeback(page);
1420
1421 if (PageWriteback(page) ||
cb876f45 1422 !clear_page_dirty_for_io(page)) {
37c0eb46
SF
1423 unlock_page(page);
1424 break;
1425 }
84d2f07e 1426
cb876f45
LT
1427 /*
1428 * This actually clears the dirty bit in the radix tree.
1429 * See cifs_writepage() for more commentary.
1430 */
1431 set_page_writeback(page);
1432
84d2f07e
SF
1433 if (page_offset(page) >= mapping->host->i_size) {
1434 done = 1;
1435 unlock_page(page);
cb876f45 1436 end_page_writeback(page);
84d2f07e
SF
1437 break;
1438 }
1439
37c0eb46
SF
1440 /*
1441 * BB can we get rid of this? pages are held by pvec
1442 */
1443 page_cache_get(page);
1444
84d2f07e
SF
1445 len = min(mapping->host->i_size - page_offset(page),
1446 (loff_t)PAGE_CACHE_SIZE);
1447
37c0eb46
SF
1448 /* reserve iov[0] for the smb header */
1449 n_iov++;
1450 iov[n_iov].iov_base = kmap(page);
84d2f07e
SF
1451 iov[n_iov].iov_len = len;
1452 bytes_to_write += len;
37c0eb46
SF
1453
1454 if (first < 0) {
1455 first = i;
1456 offset = page_offset(page);
1457 }
1458 next = page->index + 1;
1459 if (bytes_to_write + PAGE_CACHE_SIZE > cifs_sb->wsize)
1460 break;
1461 }
1462 if (n_iov) {
6508d904
JL
1463 open_file = find_writable_file(CIFS_I(mapping->host),
1464 false);
23e7dd7d 1465 if (!open_file) {
b6b38f70 1466 cERROR(1, "No writable handles for inode");
23e7dd7d 1467 rc = -EBADF;
1047abc1 1468 } else {
fbec9ab9 1469 long_op = cifs_write_timeout(cifsi, offset);
f3983c21 1470 rc = CIFSSMBWrite2(xid, tcon, open_file->netfid,
23e7dd7d
SF
1471 bytes_to_write, offset,
1472 &bytes_written, iov, n_iov,
fbec9ab9 1473 long_op);
6ab409b5 1474 cifsFileInfo_put(open_file);
fbec9ab9 1475 cifs_update_eof(cifsi, offset, bytes_written);
f3983c21 1476 }
fbec9ab9 1477
f3983c21
JL
1478 if (rc || bytes_written < bytes_to_write) {
1479 cERROR(1, "Write2 ret %d, wrote %d",
1480 rc, bytes_written);
eb4b756b 1481 mapping_set_error(mapping, rc);
f3983c21
JL
1482 } else {
1483 cifs_stats_bytes_written(tcon, bytes_written);
37c0eb46 1484 }
f3983c21 1485
37c0eb46
SF
1486 for (i = 0; i < n_iov; i++) {
1487 page = pvec.pages[first + i];
eb9bdaa3
SF
1488 /* Should we also set page error on
1489 success rc but too little data written? */
1490 /* BB investigate retry logic on temporary
1491 server crash cases and how recovery works
fb8c4b14
SF
1492 when page marked as error */
1493 if (rc)
eb9bdaa3 1494 SetPageError(page);
37c0eb46
SF
1495 kunmap(page);
1496 unlock_page(page);
cb876f45 1497 end_page_writeback(page);
37c0eb46
SF
1498 page_cache_release(page);
1499 }
1500 if ((wbc->nr_to_write -= n_iov) <= 0)
1501 done = 1;
1502 index = next;
b066a48c
DK
1503 } else
1504 /* Need to re-find the pages we skipped */
1505 index = pvec.pages[0]->index + 1;
1506
37c0eb46
SF
1507 pagevec_release(&pvec);
1508 }
1509 if (!scanned && !done) {
1510 /*
1511 * We hit the last page and there is more work to be done: wrap
1512 * back to the start of the file
1513 */
1514 scanned = 1;
1515 index = 0;
1516 goto retry;
1517 }
111ebb6e 1518 if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0))
37c0eb46
SF
1519 mapping->writeback_index = index;
1520
1da177e4 1521 FreeXid(xid);
9a0c8230 1522 kfree(iov);
1da177e4
LT
1523 return rc;
1524}
1da177e4 1525
fb8c4b14 1526static int cifs_writepage(struct page *page, struct writeback_control *wbc)
1da177e4
LT
1527{
1528 int rc = -EFAULT;
1529 int xid;
1530
1531 xid = GetXid();
1532/* BB add check for wbc flags */
1533 page_cache_get(page);
ad7a2926 1534 if (!PageUptodate(page))
b6b38f70 1535 cFYI(1, "ppw - page not up to date");
cb876f45
LT
1536
1537 /*
1538 * Set the "writeback" flag, and clear "dirty" in the radix tree.
1539 *
1540 * A writepage() implementation always needs to do either this,
1541 * or re-dirty the page with "redirty_page_for_writepage()" in
1542 * the case of a failure.
1543 *
1544 * Just unlocking the page will cause the radix tree tag-bits
1545 * to fail to update with the state of the page correctly.
1546 */
fb8c4b14 1547 set_page_writeback(page);
1da177e4
LT
1548 rc = cifs_partialpagewrite(page, 0, PAGE_CACHE_SIZE);
1549 SetPageUptodate(page); /* BB add check for error and Clearuptodate? */
1550 unlock_page(page);
cb876f45
LT
1551 end_page_writeback(page);
1552 page_cache_release(page);
1da177e4
LT
1553 FreeXid(xid);
1554 return rc;
1555}
1556
d9414774
NP
1557static int cifs_write_end(struct file *file, struct address_space *mapping,
1558 loff_t pos, unsigned len, unsigned copied,
1559 struct page *page, void *fsdata)
1da177e4 1560{
d9414774
NP
1561 int rc;
1562 struct inode *inode = mapping->host;
1da177e4 1563
b6b38f70
JP
1564 cFYI(1, "write_end for page %p from pos %lld with %d bytes",
1565 page, pos, copied);
d9414774 1566
a98ee8c1
JL
1567 if (PageChecked(page)) {
1568 if (copied == len)
1569 SetPageUptodate(page);
1570 ClearPageChecked(page);
1571 } else if (!PageUptodate(page) && copied == PAGE_CACHE_SIZE)
d9414774 1572 SetPageUptodate(page);
ad7a2926 1573
1da177e4 1574 if (!PageUptodate(page)) {
d9414774
NP
1575 char *page_data;
1576 unsigned offset = pos & (PAGE_CACHE_SIZE - 1);
1577 int xid;
1578
1579 xid = GetXid();
1da177e4
LT
1580 /* this is probably better than directly calling
1581 partialpage_write since in this function the file handle is
1582 known which we might as well leverage */
1583 /* BB check if anything else missing out of ppw
1584 such as updating last write time */
1585 page_data = kmap(page);
7da4b49a
JL
1586 rc = cifs_write(file->private_data, page_data + offset,
1587 copied, &pos);
d9414774 1588 /* if (rc < 0) should we set writebehind rc? */
1da177e4 1589 kunmap(page);
d9414774
NP
1590
1591 FreeXid(xid);
fb8c4b14 1592 } else {
d9414774
NP
1593 rc = copied;
1594 pos += copied;
1da177e4
LT
1595 set_page_dirty(page);
1596 }
1597
d9414774
NP
1598 if (rc > 0) {
1599 spin_lock(&inode->i_lock);
1600 if (pos > inode->i_size)
1601 i_size_write(inode, pos);
1602 spin_unlock(&inode->i_lock);
1603 }
1604
1605 unlock_page(page);
1606 page_cache_release(page);
1607
1da177e4
LT
1608 return rc;
1609}
1610
7ea80859 1611int cifs_fsync(struct file *file, int datasync)
1da177e4
LT
1612{
1613 int xid;
1614 int rc = 0;
b298f223 1615 struct cifsTconInfo *tcon;
c21dfb69 1616 struct cifsFileInfo *smbfile = file->private_data;
e6a00296 1617 struct inode *inode = file->f_path.dentry->d_inode;
1da177e4
LT
1618
1619 xid = GetXid();
1620
b6b38f70 1621 cFYI(1, "Sync file - name: %s datasync: 0x%x",
7ea80859 1622 file->f_path.dentry->d_name.name, datasync);
50c2f753 1623
cea21805
JL
1624 rc = filemap_write_and_wait(inode->i_mapping);
1625 if (rc == 0) {
eb4b756b
JL
1626 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1627
13cfb733 1628 tcon = tlink_tcon(smbfile->tlink);
eb4b756b 1629 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC))
b298f223 1630 rc = CIFSSMBFlush(xid, tcon, smbfile->netfid);
cea21805 1631 }
b298f223 1632
1da177e4
LT
1633 FreeXid(xid);
1634 return rc;
1635}
1636
3978d717 1637/* static void cifs_sync_page(struct page *page)
1da177e4
LT
1638{
1639 struct address_space *mapping;
1640 struct inode *inode;
1641 unsigned long index = page->index;
1642 unsigned int rpages = 0;
1643 int rc = 0;
1644
f19159dc 1645 cFYI(1, "sync page %p", page);
1da177e4
LT
1646 mapping = page->mapping;
1647 if (!mapping)
1648 return 0;
1649 inode = mapping->host;
1650 if (!inode)
3978d717 1651 return; */
1da177e4 1652
fb8c4b14 1653/* fill in rpages then
1da177e4
LT
1654 result = cifs_pagein_inode(inode, index, rpages); */ /* BB finish */
1655
b6b38f70 1656/* cFYI(1, "rpages is %d for sync page of Index %ld", rpages, index);
1da177e4 1657
3978d717 1658#if 0
1da177e4
LT
1659 if (rc < 0)
1660 return rc;
1661 return 0;
3978d717 1662#endif
1da177e4
LT
1663} */
1664
1665/*
1666 * As file closes, flush all cached write data for this inode checking
1667 * for write behind errors.
1668 */
75e1fcc0 1669int cifs_flush(struct file *file, fl_owner_t id)
1da177e4 1670{
fb8c4b14 1671 struct inode *inode = file->f_path.dentry->d_inode;
1da177e4
LT
1672 int rc = 0;
1673
eb4b756b 1674 if (file->f_mode & FMODE_WRITE)
d3f1322a 1675 rc = filemap_write_and_wait(inode->i_mapping);
50c2f753 1676
b6b38f70 1677 cFYI(1, "Flush inode %p file %p rc %d", inode, file, rc);
1da177e4
LT
1678
1679 return rc;
1680}
1681
1682ssize_t cifs_user_read(struct file *file, char __user *read_data,
1683 size_t read_size, loff_t *poffset)
1684{
1685 int rc = -EACCES;
1686 unsigned int bytes_read = 0;
1687 unsigned int total_read = 0;
1688 unsigned int current_read_size;
1689 struct cifs_sb_info *cifs_sb;
1690 struct cifsTconInfo *pTcon;
1691 int xid;
1692 struct cifsFileInfo *open_file;
1693 char *smb_read_data;
1694 char __user *current_offset;
1695 struct smb_com_read_rsp *pSMBr;
1696
1697 xid = GetXid();
e6a00296 1698 cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
1da177e4
LT
1699
1700 if (file->private_data == NULL) {
0f3bc09e 1701 rc = -EBADF;
1da177e4 1702 FreeXid(xid);
0f3bc09e 1703 return rc;
1da177e4 1704 }
c21dfb69 1705 open_file = file->private_data;
13cfb733 1706 pTcon = tlink_tcon(open_file->tlink);
1da177e4 1707
ad7a2926 1708 if ((file->f_flags & O_ACCMODE) == O_WRONLY)
b6b38f70 1709 cFYI(1, "attempting read on write only file instance");
ad7a2926 1710
1da177e4
LT
1711 for (total_read = 0, current_offset = read_data;
1712 read_size > total_read;
1713 total_read += bytes_read, current_offset += bytes_read) {
fb8c4b14 1714 current_read_size = min_t(const int, read_size - total_read,
1da177e4
LT
1715 cifs_sb->rsize);
1716 rc = -EAGAIN;
1717 smb_read_data = NULL;
1718 while (rc == -EAGAIN) {
ec637e3f 1719 int buf_type = CIFS_NO_BUFFER;
cdff08e7 1720 if (open_file->invalidHandle) {
15886177 1721 rc = cifs_reopen_file(open_file, true);
1da177e4
LT
1722 if (rc != 0)
1723 break;
1724 }
bfa0d75a 1725 rc = CIFSSMBRead(xid, pTcon,
ec637e3f
SF
1726 open_file->netfid,
1727 current_read_size, *poffset,
1728 &bytes_read, &smb_read_data,
1729 &buf_type);
1da177e4 1730 pSMBr = (struct smb_com_read_rsp *)smb_read_data;
1da177e4 1731 if (smb_read_data) {
93544cc6
SF
1732 if (copy_to_user(current_offset,
1733 smb_read_data +
1734 4 /* RFC1001 length field */ +
1735 le16_to_cpu(pSMBr->DataOffset),
ad7a2926 1736 bytes_read))
93544cc6 1737 rc = -EFAULT;
93544cc6 1738
fb8c4b14 1739 if (buf_type == CIFS_SMALL_BUFFER)
ec637e3f 1740 cifs_small_buf_release(smb_read_data);
fb8c4b14 1741 else if (buf_type == CIFS_LARGE_BUFFER)
ec637e3f 1742 cifs_buf_release(smb_read_data);
1da177e4
LT
1743 smb_read_data = NULL;
1744 }
1745 }
1746 if (rc || (bytes_read == 0)) {
1747 if (total_read) {
1748 break;
1749 } else {
1750 FreeXid(xid);
1751 return rc;
1752 }
1753 } else {
a4544347 1754 cifs_stats_bytes_read(pTcon, bytes_read);
1da177e4
LT
1755 *poffset += bytes_read;
1756 }
1757 }
1758 FreeXid(xid);
1759 return total_read;
1760}
1761
1762
1763static ssize_t cifs_read(struct file *file, char *read_data, size_t read_size,
1764 loff_t *poffset)
1765{
1766 int rc = -EACCES;
1767 unsigned int bytes_read = 0;
1768 unsigned int total_read;
1769 unsigned int current_read_size;
1770 struct cifs_sb_info *cifs_sb;
1771 struct cifsTconInfo *pTcon;
1772 int xid;
1773 char *current_offset;
1774 struct cifsFileInfo *open_file;
ec637e3f 1775 int buf_type = CIFS_NO_BUFFER;
1da177e4
LT
1776
1777 xid = GetXid();
e6a00296 1778 cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
1da177e4
LT
1779
1780 if (file->private_data == NULL) {
0f3bc09e 1781 rc = -EBADF;
1da177e4 1782 FreeXid(xid);
0f3bc09e 1783 return rc;
1da177e4 1784 }
c21dfb69 1785 open_file = file->private_data;
13cfb733 1786 pTcon = tlink_tcon(open_file->tlink);
1da177e4
LT
1787
1788 if ((file->f_flags & O_ACCMODE) == O_WRONLY)
b6b38f70 1789 cFYI(1, "attempting read on write only file instance");
1da177e4 1790
fb8c4b14 1791 for (total_read = 0, current_offset = read_data;
1da177e4
LT
1792 read_size > total_read;
1793 total_read += bytes_read, current_offset += bytes_read) {
1794 current_read_size = min_t(const int, read_size - total_read,
1795 cifs_sb->rsize);
f9f5c817
SF
1796 /* For windows me and 9x we do not want to request more
1797 than it negotiated since it will refuse the read then */
fb8c4b14 1798 if ((pTcon->ses) &&
f9f5c817
SF
1799 !(pTcon->ses->capabilities & CAP_LARGE_FILES)) {
1800 current_read_size = min_t(const int, current_read_size,
1801 pTcon->ses->server->maxBuf - 128);
1802 }
1da177e4
LT
1803 rc = -EAGAIN;
1804 while (rc == -EAGAIN) {
cdff08e7 1805 if (open_file->invalidHandle) {
15886177 1806 rc = cifs_reopen_file(open_file, true);
1da177e4
LT
1807 if (rc != 0)
1808 break;
1809 }
bfa0d75a 1810 rc = CIFSSMBRead(xid, pTcon,
ec637e3f
SF
1811 open_file->netfid,
1812 current_read_size, *poffset,
1813 &bytes_read, &current_offset,
1814 &buf_type);
1da177e4
LT
1815 }
1816 if (rc || (bytes_read == 0)) {
1817 if (total_read) {
1818 break;
1819 } else {
1820 FreeXid(xid);
1821 return rc;
1822 }
1823 } else {
a4544347 1824 cifs_stats_bytes_read(pTcon, total_read);
1da177e4
LT
1825 *poffset += bytes_read;
1826 }
1827 }
1828 FreeXid(xid);
1829 return total_read;
1830}
1831
1832int cifs_file_mmap(struct file *file, struct vm_area_struct *vma)
1833{
1da177e4
LT
1834 int rc, xid;
1835
1836 xid = GetXid();
abab095d 1837 rc = cifs_revalidate_file(file);
1da177e4 1838 if (rc) {
b6b38f70 1839 cFYI(1, "Validation prior to mmap failed, error=%d", rc);
1da177e4
LT
1840 FreeXid(xid);
1841 return rc;
1842 }
1843 rc = generic_file_mmap(file, vma);
1844 FreeXid(xid);
1845 return rc;
1846}
1847
1848
fb8c4b14 1849static void cifs_copy_cache_pages(struct address_space *mapping,
315e995c 1850 struct list_head *pages, int bytes_read, char *data)
1da177e4
LT
1851{
1852 struct page *page;
1853 char *target;
1854
1855 while (bytes_read > 0) {
1856 if (list_empty(pages))
1857 break;
1858
1859 page = list_entry(pages->prev, struct page, lru);
1860 list_del(&page->lru);
1861
315e995c 1862 if (add_to_page_cache_lru(page, mapping, page->index,
1da177e4
LT
1863 GFP_KERNEL)) {
1864 page_cache_release(page);
b6b38f70 1865 cFYI(1, "Add page cache failed");
3079ca62
SF
1866 data += PAGE_CACHE_SIZE;
1867 bytes_read -= PAGE_CACHE_SIZE;
1da177e4
LT
1868 continue;
1869 }
06b43672 1870 page_cache_release(page);
1da177e4 1871
fb8c4b14 1872 target = kmap_atomic(page, KM_USER0);
1da177e4
LT
1873
1874 if (PAGE_CACHE_SIZE > bytes_read) {
1875 memcpy(target, data, bytes_read);
1876 /* zero the tail end of this partial page */
fb8c4b14 1877 memset(target + bytes_read, 0,
1da177e4
LT
1878 PAGE_CACHE_SIZE - bytes_read);
1879 bytes_read = 0;
1880 } else {
1881 memcpy(target, data, PAGE_CACHE_SIZE);
1882 bytes_read -= PAGE_CACHE_SIZE;
1883 }
1884 kunmap_atomic(target, KM_USER0);
1885
1886 flush_dcache_page(page);
1887 SetPageUptodate(page);
1888 unlock_page(page);
1da177e4 1889 data += PAGE_CACHE_SIZE;
9dc06558
SJ
1890
1891 /* add page to FS-Cache */
1892 cifs_readpage_to_fscache(mapping->host, page);
1da177e4
LT
1893 }
1894 return;
1895}
1896
1897static int cifs_readpages(struct file *file, struct address_space *mapping,
1898 struct list_head *page_list, unsigned num_pages)
1899{
1900 int rc = -EACCES;
1901 int xid;
1902 loff_t offset;
1903 struct page *page;
1904 struct cifs_sb_info *cifs_sb;
1905 struct cifsTconInfo *pTcon;
2c2130e1 1906 unsigned int bytes_read = 0;
fb8c4b14 1907 unsigned int read_size, i;
1da177e4
LT
1908 char *smb_read_data = NULL;
1909 struct smb_com_read_rsp *pSMBr;
1da177e4 1910 struct cifsFileInfo *open_file;
ec637e3f 1911 int buf_type = CIFS_NO_BUFFER;
1da177e4
LT
1912
1913 xid = GetXid();
1914 if (file->private_data == NULL) {
0f3bc09e 1915 rc = -EBADF;
1da177e4 1916 FreeXid(xid);
0f3bc09e 1917 return rc;
1da177e4 1918 }
c21dfb69 1919 open_file = file->private_data;
e6a00296 1920 cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
13cfb733 1921 pTcon = tlink_tcon(open_file->tlink);
bfa0d75a 1922
56698236
SJ
1923 /*
1924 * Reads as many pages as possible from fscache. Returns -ENOBUFS
1925 * immediately if the cookie is negative
1926 */
1927 rc = cifs_readpages_from_fscache(mapping->host, mapping, page_list,
1928 &num_pages);
1929 if (rc == 0)
1930 goto read_complete;
1931
f19159dc 1932 cFYI(DBG2, "rpages: num pages %d", num_pages);
1da177e4
LT
1933 for (i = 0; i < num_pages; ) {
1934 unsigned contig_pages;
1935 struct page *tmp_page;
1936 unsigned long expected_index;
1937
1938 if (list_empty(page_list))
1939 break;
1940
1941 page = list_entry(page_list->prev, struct page, lru);
1942 offset = (loff_t)page->index << PAGE_CACHE_SHIFT;
1943
1944 /* count adjacent pages that we will read into */
1945 contig_pages = 0;
fb8c4b14 1946 expected_index =
1da177e4 1947 list_entry(page_list->prev, struct page, lru)->index;
fb8c4b14 1948 list_for_each_entry_reverse(tmp_page, page_list, lru) {
1da177e4
LT
1949 if (tmp_page->index == expected_index) {
1950 contig_pages++;
1951 expected_index++;
1952 } else
fb8c4b14 1953 break;
1da177e4
LT
1954 }
1955 if (contig_pages + i > num_pages)
1956 contig_pages = num_pages - i;
1957
1958 /* for reads over a certain size could initiate async
1959 read ahead */
1960
1961 read_size = contig_pages * PAGE_CACHE_SIZE;
1962 /* Read size needs to be in multiples of one page */
1963 read_size = min_t(const unsigned int, read_size,
1964 cifs_sb->rsize & PAGE_CACHE_MASK);
b6b38f70
JP
1965 cFYI(DBG2, "rpages: read size 0x%x contiguous pages %d",
1966 read_size, contig_pages);
1da177e4
LT
1967 rc = -EAGAIN;
1968 while (rc == -EAGAIN) {
cdff08e7 1969 if (open_file->invalidHandle) {
15886177 1970 rc = cifs_reopen_file(open_file, true);
1da177e4
LT
1971 if (rc != 0)
1972 break;
1973 }
1974
bfa0d75a 1975 rc = CIFSSMBRead(xid, pTcon,
ec637e3f
SF
1976 open_file->netfid,
1977 read_size, offset,
1978 &bytes_read, &smb_read_data,
1979 &buf_type);
a9d02ad4 1980 /* BB more RC checks ? */
fb8c4b14 1981 if (rc == -EAGAIN) {
1da177e4 1982 if (smb_read_data) {
fb8c4b14 1983 if (buf_type == CIFS_SMALL_BUFFER)
ec637e3f 1984 cifs_small_buf_release(smb_read_data);
fb8c4b14 1985 else if (buf_type == CIFS_LARGE_BUFFER)
ec637e3f 1986 cifs_buf_release(smb_read_data);
1da177e4
LT
1987 smb_read_data = NULL;
1988 }
1989 }
1990 }
1991 if ((rc < 0) || (smb_read_data == NULL)) {
b6b38f70 1992 cFYI(1, "Read error in readpages: %d", rc);
1da177e4
LT
1993 break;
1994 } else if (bytes_read > 0) {
6f88cc2e 1995 task_io_account_read(bytes_read);
1da177e4
LT
1996 pSMBr = (struct smb_com_read_rsp *)smb_read_data;
1997 cifs_copy_cache_pages(mapping, page_list, bytes_read,
1998 smb_read_data + 4 /* RFC1001 hdr */ +
315e995c 1999 le16_to_cpu(pSMBr->DataOffset));
1da177e4
LT
2000
2001 i += bytes_read >> PAGE_CACHE_SHIFT;
a4544347 2002 cifs_stats_bytes_read(pTcon, bytes_read);
2c2130e1 2003 if ((bytes_read & PAGE_CACHE_MASK) != bytes_read) {
1da177e4
LT
2004 i++; /* account for partial page */
2005
fb8c4b14 2006 /* server copy of file can have smaller size
1da177e4 2007 than client */
fb8c4b14
SF
2008 /* BB do we need to verify this common case ?
2009 this case is ok - if we are at server EOF
1da177e4
LT
2010 we will hit it on next read */
2011
05ac9d4b 2012 /* break; */
1da177e4
LT
2013 }
2014 } else {
b6b38f70 2015 cFYI(1, "No bytes read (%d) at offset %lld . "
f19159dc 2016 "Cleaning remaining pages from readahead list",
b6b38f70 2017 bytes_read, offset);
fb8c4b14 2018 /* BB turn off caching and do new lookup on
1da177e4 2019 file size at server? */
1da177e4
LT
2020 break;
2021 }
2022 if (smb_read_data) {
fb8c4b14 2023 if (buf_type == CIFS_SMALL_BUFFER)
ec637e3f 2024 cifs_small_buf_release(smb_read_data);
fb8c4b14 2025 else if (buf_type == CIFS_LARGE_BUFFER)
ec637e3f 2026 cifs_buf_release(smb_read_data);
1da177e4
LT
2027 smb_read_data = NULL;
2028 }
2029 bytes_read = 0;
2030 }
2031
1da177e4
LT
2032/* need to free smb_read_data buf before exit */
2033 if (smb_read_data) {
fb8c4b14 2034 if (buf_type == CIFS_SMALL_BUFFER)
47c886b3 2035 cifs_small_buf_release(smb_read_data);
fb8c4b14 2036 else if (buf_type == CIFS_LARGE_BUFFER)
47c886b3 2037 cifs_buf_release(smb_read_data);
1da177e4 2038 smb_read_data = NULL;
fb8c4b14 2039 }
1da177e4 2040
56698236 2041read_complete:
1da177e4
LT
2042 FreeXid(xid);
2043 return rc;
2044}
2045
2046static int cifs_readpage_worker(struct file *file, struct page *page,
2047 loff_t *poffset)
2048{
2049 char *read_data;
2050 int rc;
2051
56698236
SJ
2052 /* Is the page cached? */
2053 rc = cifs_readpage_from_fscache(file->f_path.dentry->d_inode, page);
2054 if (rc == 0)
2055 goto read_complete;
2056
1da177e4
LT
2057 page_cache_get(page);
2058 read_data = kmap(page);
2059 /* for reads over a certain size could initiate async read ahead */
fb8c4b14 2060
1da177e4 2061 rc = cifs_read(file, read_data, PAGE_CACHE_SIZE, poffset);
fb8c4b14 2062
1da177e4
LT
2063 if (rc < 0)
2064 goto io_error;
2065 else
b6b38f70 2066 cFYI(1, "Bytes read %d", rc);
fb8c4b14 2067
e6a00296
JJS
2068 file->f_path.dentry->d_inode->i_atime =
2069 current_fs_time(file->f_path.dentry->d_inode->i_sb);
fb8c4b14 2070
1da177e4
LT
2071 if (PAGE_CACHE_SIZE > rc)
2072 memset(read_data + rc, 0, PAGE_CACHE_SIZE - rc);
2073
2074 flush_dcache_page(page);
2075 SetPageUptodate(page);
9dc06558
SJ
2076
2077 /* send this page to the cache */
2078 cifs_readpage_to_fscache(file->f_path.dentry->d_inode, page);
2079
1da177e4 2080 rc = 0;
fb8c4b14 2081
1da177e4 2082io_error:
fb8c4b14 2083 kunmap(page);
1da177e4 2084 page_cache_release(page);
56698236
SJ
2085
2086read_complete:
1da177e4
LT
2087 return rc;
2088}
2089
2090static int cifs_readpage(struct file *file, struct page *page)
2091{
2092 loff_t offset = (loff_t)page->index << PAGE_CACHE_SHIFT;
2093 int rc = -EACCES;
2094 int xid;
2095
2096 xid = GetXid();
2097
2098 if (file->private_data == NULL) {
0f3bc09e 2099 rc = -EBADF;
1da177e4 2100 FreeXid(xid);
0f3bc09e 2101 return rc;
1da177e4
LT
2102 }
2103
b6b38f70
JP
2104 cFYI(1, "readpage %p at offset %d 0x%x\n",
2105 page, (int)offset, (int)offset);
1da177e4
LT
2106
2107 rc = cifs_readpage_worker(file, page, &offset);
2108
2109 unlock_page(page);
2110
2111 FreeXid(xid);
2112 return rc;
2113}
2114
a403a0a3
SF
2115static int is_inode_writable(struct cifsInodeInfo *cifs_inode)
2116{
2117 struct cifsFileInfo *open_file;
2118
4477288a 2119 spin_lock(&cifs_file_list_lock);
a403a0a3 2120 list_for_each_entry(open_file, &cifs_inode->openFileList, flist) {
2e396b83 2121 if (OPEN_FMODE(open_file->f_flags) & FMODE_WRITE) {
4477288a 2122 spin_unlock(&cifs_file_list_lock);
a403a0a3
SF
2123 return 1;
2124 }
2125 }
4477288a 2126 spin_unlock(&cifs_file_list_lock);
a403a0a3
SF
2127 return 0;
2128}
2129
1da177e4
LT
2130/* We do not want to update the file size from server for inodes
2131 open for write - to avoid races with writepage extending
2132 the file - in the future we could consider allowing
fb8c4b14 2133 refreshing the inode only on increases in the file size
1da177e4
LT
2134 but this is tricky to do without racing with writebehind
2135 page caching in the current Linux kernel design */
4b18f2a9 2136bool is_size_safe_to_change(struct cifsInodeInfo *cifsInode, __u64 end_of_file)
1da177e4 2137{
a403a0a3 2138 if (!cifsInode)
4b18f2a9 2139 return true;
50c2f753 2140
a403a0a3
SF
2141 if (is_inode_writable(cifsInode)) {
2142 /* This inode is open for write at least once */
c32a0b68
SF
2143 struct cifs_sb_info *cifs_sb;
2144
c32a0b68 2145 cifs_sb = CIFS_SB(cifsInode->vfs_inode.i_sb);
ad7a2926 2146 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) {
fb8c4b14 2147 /* since no page cache to corrupt on directio
c32a0b68 2148 we can change size safely */
4b18f2a9 2149 return true;
c32a0b68
SF
2150 }
2151
fb8c4b14 2152 if (i_size_read(&cifsInode->vfs_inode) < end_of_file)
4b18f2a9 2153 return true;
7ba52631 2154
4b18f2a9 2155 return false;
23e7dd7d 2156 } else
4b18f2a9 2157 return true;
1da177e4
LT
2158}
2159
d9414774
NP
2160static int cifs_write_begin(struct file *file, struct address_space *mapping,
2161 loff_t pos, unsigned len, unsigned flags,
2162 struct page **pagep, void **fsdata)
1da177e4 2163{
d9414774
NP
2164 pgoff_t index = pos >> PAGE_CACHE_SHIFT;
2165 loff_t offset = pos & (PAGE_CACHE_SIZE - 1);
a98ee8c1
JL
2166 loff_t page_start = pos & PAGE_MASK;
2167 loff_t i_size;
2168 struct page *page;
2169 int rc = 0;
d9414774 2170
b6b38f70 2171 cFYI(1, "write_begin from %lld len %d", (long long)pos, len);
d9414774 2172
54566b2c 2173 page = grab_cache_page_write_begin(mapping, index, flags);
a98ee8c1
JL
2174 if (!page) {
2175 rc = -ENOMEM;
2176 goto out;
2177 }
8a236264 2178
a98ee8c1
JL
2179 if (PageUptodate(page))
2180 goto out;
8a236264 2181
a98ee8c1
JL
2182 /*
2183 * If we write a full page it will be up to date, no need to read from
2184 * the server. If the write is short, we'll end up doing a sync write
2185 * instead.
2186 */
2187 if (len == PAGE_CACHE_SIZE)
2188 goto out;
8a236264 2189
a98ee8c1
JL
2190 /*
2191 * optimize away the read when we have an oplock, and we're not
2192 * expecting to use any of the data we'd be reading in. That
2193 * is, when the page lies beyond the EOF, or straddles the EOF
2194 * and the write will cover all of the existing data.
2195 */
2196 if (CIFS_I(mapping->host)->clientCanCacheRead) {
2197 i_size = i_size_read(mapping->host);
2198 if (page_start >= i_size ||
2199 (offset == 0 && (pos + len) >= i_size)) {
2200 zero_user_segments(page, 0, offset,
2201 offset + len,
2202 PAGE_CACHE_SIZE);
2203 /*
2204 * PageChecked means that the parts of the page
2205 * to which we're not writing are considered up
2206 * to date. Once the data is copied to the
2207 * page, it can be set uptodate.
2208 */
2209 SetPageChecked(page);
2210 goto out;
2211 }
2212 }
d9414774 2213
a98ee8c1
JL
2214 if ((file->f_flags & O_ACCMODE) != O_WRONLY) {
2215 /*
2216 * might as well read a page, it is fast enough. If we get
2217 * an error, we don't need to return it. cifs_write_end will
2218 * do a sync write instead since PG_uptodate isn't set.
2219 */
2220 cifs_readpage_worker(file, page, &page_start);
8a236264
SF
2221 } else {
2222 /* we could try using another file handle if there is one -
2223 but how would we lock it to prevent close of that handle
2224 racing with this read? In any case
d9414774 2225 this will be written out by write_end so is fine */
1da177e4 2226 }
a98ee8c1
JL
2227out:
2228 *pagep = page;
2229 return rc;
1da177e4
LT
2230}
2231
85f2d6b4
SJ
2232static int cifs_release_page(struct page *page, gfp_t gfp)
2233{
2234 if (PagePrivate(page))
2235 return 0;
2236
2237 return cifs_fscache_release_page(page, gfp);
2238}
2239
2240static void cifs_invalidate_page(struct page *page, unsigned long offset)
2241{
2242 struct cifsInodeInfo *cifsi = CIFS_I(page->mapping->host);
2243
2244 if (offset == 0)
2245 cifs_fscache_invalidate_page(page, &cifsi->vfs_inode);
2246}
2247
9b646972 2248void cifs_oplock_break(struct work_struct *work)
3bc303c2
JL
2249{
2250 struct cifsFileInfo *cfile = container_of(work, struct cifsFileInfo,
2251 oplock_break);
a5e18bc3 2252 struct inode *inode = cfile->dentry->d_inode;
3bc303c2 2253 struct cifsInodeInfo *cinode = CIFS_I(inode);
eb4b756b 2254 int rc = 0;
3bc303c2
JL
2255
2256 if (inode && S_ISREG(inode->i_mode)) {
d54ff732 2257 if (cinode->clientCanCacheRead)
8737c930 2258 break_lease(inode, O_RDONLY);
d54ff732 2259 else
8737c930 2260 break_lease(inode, O_WRONLY);
3bc303c2
JL
2261 rc = filemap_fdatawrite(inode->i_mapping);
2262 if (cinode->clientCanCacheRead == 0) {
eb4b756b
JL
2263 rc = filemap_fdatawait(inode->i_mapping);
2264 mapping_set_error(inode->i_mapping, rc);
3bc303c2
JL
2265 invalidate_remote_inode(inode);
2266 }
b6b38f70 2267 cFYI(1, "Oplock flush inode %p rc %d", inode, rc);
3bc303c2
JL
2268 }
2269
2270 /*
2271 * releasing stale oplock after recent reconnect of smb session using
2272 * a now incorrect file handle is not a data integrity issue but do
2273 * not bother sending an oplock release if session to server still is
2274 * disconnected since oplock already released by the server
2275 */
cdff08e7 2276 if (!cfile->oplock_break_cancelled) {
13cfb733
JL
2277 rc = CIFSSMBLock(0, tlink_tcon(cfile->tlink), cfile->netfid, 0,
2278 0, 0, 0, LOCKING_ANDX_OPLOCK_RELEASE, false);
b6b38f70 2279 cFYI(1, "Oplock release rc = %d", rc);
3bc303c2 2280 }
9b646972
TH
2281
2282 /*
2283 * We might have kicked in before is_valid_oplock_break()
2284 * finished grabbing reference for us. Make sure it's done by
6573e9b7 2285 * waiting for cifs_file_list_lock.
9b646972 2286 */
4477288a
JL
2287 spin_lock(&cifs_file_list_lock);
2288 spin_unlock(&cifs_file_list_lock);
9b646972
TH
2289
2290 cifs_oplock_break_put(cfile);
3bc303c2
JL
2291}
2292
5f6dbc9e 2293/* must be called while holding cifs_file_list_lock */
9b646972 2294void cifs_oplock_break_get(struct cifsFileInfo *cfile)
3bc303c2 2295{
d7c86ff8 2296 cifs_sb_active(cfile->dentry->d_sb);
3bc303c2 2297 cifsFileInfo_get(cfile);
3bc303c2
JL
2298}
2299
9b646972 2300void cifs_oplock_break_put(struct cifsFileInfo *cfile)
3bc303c2 2301{
3bc303c2 2302 cifsFileInfo_put(cfile);
d7c86ff8 2303 cifs_sb_deactive(cfile->dentry->d_sb);
3bc303c2
JL
2304}
2305
f5e54d6e 2306const struct address_space_operations cifs_addr_ops = {
1da177e4
LT
2307 .readpage = cifs_readpage,
2308 .readpages = cifs_readpages,
2309 .writepage = cifs_writepage,
37c0eb46 2310 .writepages = cifs_writepages,
d9414774
NP
2311 .write_begin = cifs_write_begin,
2312 .write_end = cifs_write_end,
1da177e4 2313 .set_page_dirty = __set_page_dirty_nobuffers,
85f2d6b4
SJ
2314 .releasepage = cifs_release_page,
2315 .invalidatepage = cifs_invalidate_page,
1da177e4
LT
2316 /* .sync_page = cifs_sync_page, */
2317 /* .direct_IO = */
2318};
273d81d6
DK
2319
2320/*
2321 * cifs_readpages requires the server to support a buffer large enough to
2322 * contain the header plus one complete page of data. Otherwise, we need
2323 * to leave cifs_readpages out of the address space operations.
2324 */
f5e54d6e 2325const struct address_space_operations cifs_addr_ops_smallbuf = {
273d81d6
DK
2326 .readpage = cifs_readpage,
2327 .writepage = cifs_writepage,
2328 .writepages = cifs_writepages,
d9414774
NP
2329 .write_begin = cifs_write_begin,
2330 .write_end = cifs_write_end,
273d81d6 2331 .set_page_dirty = __set_page_dirty_nobuffers,
85f2d6b4
SJ
2332 .releasepage = cifs_release_page,
2333 .invalidatepage = cifs_invalidate_page,
273d81d6
DK
2334 /* .sync_page = cifs_sync_page, */
2335 /* .direct_IO = */
2336};