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