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