]> bbs.cooldavid.org Git - net-next-2.6.git/blame_incremental - fs/cifs/file.c
CIFS: Add cifs_set_oplock_level
[net-next-2.6.git] / fs / cifs / file.c
... / ...
CommitLineData
1/*
2 * fs/cifs/file.c
3 *
4 * vfs operations that deal with files
5 *
6 * Copyright (C) International Business Machines Corp., 2002,2010
7 * Author(s): Steve French (sfrench@us.ibm.com)
8 * Jeremy Allison (jra@samba.org)
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>
25#include <linux/backing-dev.h>
26#include <linux/stat.h>
27#include <linux/fcntl.h>
28#include <linux/pagemap.h>
29#include <linux/pagevec.h>
30#include <linux/writeback.h>
31#include <linux/task_io_accounting_ops.h>
32#include <linux/delay.h>
33#include <linux/mount.h>
34#include <linux/slab.h>
35#include <asm/div64.h>
36#include "cifsfs.h"
37#include "cifspdu.h"
38#include "cifsglob.h"
39#include "cifsproto.h"
40#include "cifs_unicode.h"
41#include "cifs_debug.h"
42#include "cifs_fs_sb.h"
43#include "fscache.h"
44
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
58 return (READ_CONTROL | FILE_WRITE_ATTRIBUTES | FILE_READ_ATTRIBUTES |
59 FILE_WRITE_EA | FILE_APPEND_DATA | FILE_WRITE_DATA |
60 FILE_READ_DATA);
61}
62
63static u32 cifs_posix_convert_flags(unsigned int flags)
64{
65 u32 posix_flags = 0;
66
67 if ((flags & O_ACCMODE) == O_RDONLY)
68 posix_flags = SMB_O_RDONLY;
69 else if ((flags & O_ACCMODE) == O_WRONLY)
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 */
81 if (flags & O_DSYNC)
82 posix_flags |= SMB_O_SYNC;
83 if (flags & O_DIRECTORY)
84 posix_flags |= SMB_O_DIRECTORY;
85 if (flags & O_NOFOLLOW)
86 posix_flags |= SMB_O_NOFOLLOW;
87 if (flags & O_DIRECT)
88 posix_flags |= SMB_O_DIRECT;
89
90 return posix_flags;
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;
101 else if ((flags & O_TRUNC) == O_TRUNC)
102 return FILE_OVERWRITE;
103 else
104 return FILE_OPEN;
105}
106
107static inline int cifs_open_inode_helper(struct inode *inode,
108 struct cifsTconInfo *pTcon, __u32 oplock, FILE_ALL_INFO *buf,
109 char *full_path, int xid)
110{
111 struct cifsInodeInfo *pCifsInode = CIFS_I(inode);
112 struct timespec temp;
113 int rc;
114
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 */
124 temp = cifs_NTtimeToUnix(buf->LastWriteTime);
125 if (timespec_equal(&inode->i_mtime, &temp) &&
126 (inode->i_size ==
127 (loff_t)le64_to_cpu(buf->EndOfFile))) {
128 cFYI(1, "inode unchanged on server");
129 } else {
130 if (inode->i_mapping) {
131 /* BB no need to lock inode until after invalidate
132 since namei code should already have it locked? */
133 rc = filemap_write_and_wait(inode->i_mapping);
134 mapping_set_error(inode->i_mapping, rc);
135 }
136 cFYI(1, "invalidating remote inode since open detected it "
137 "changed");
138 invalidate_remote_inode(inode);
139 }
140
141client_can_cache:
142 if (pTcon->unix_ext)
143 rc = cifs_get_inode_info_unix(&inode, full_path, inode->i_sb,
144 xid);
145 else
146 rc = cifs_get_inode_info(&inode, full_path, buf, inode->i_sb,
147 xid, NULL);
148
149 cifs_set_oplock_level(inode, oplock);
150
151 return rc;
152}
153
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
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
229 pCifsFile->count = 1;
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;
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);
240 INIT_WORK(&pCifsFile->oplock_break, cifs_oplock_break);
241
242 spin_lock(&cifs_file_list_lock);
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);
249 spin_unlock(&cifs_file_list_lock);
250
251 cifs_set_oplock_level(inode, oplock);
252
253 file->private_data = pCifsFile;
254 return pCifsFile;
255}
256
257/*
258 * Release a reference on the file private data. This may involve closing
259 * the filehandle out on the server. Must be called without holding
260 * cifs_file_list_lock.
261 */
262void cifsFileInfo_put(struct cifsFileInfo *cifs_file)
263{
264 struct inode *inode = cifs_file->dentry->d_inode;
265 struct cifsTconInfo *tcon = tlink_tcon(cifs_file->tlink);
266 struct cifsInodeInfo *cifsi = CIFS_I(inode);
267 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
268 struct cifsLockInfo *li, *tmp;
269
270 spin_lock(&cifs_file_list_lock);
271 if (--cifs_file->count > 0) {
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);
283 cifs_set_oplock_level(inode, 0);
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);
302 }
303 mutex_unlock(&cifs_file->lock_mutex);
304
305 cifs_put_tlink(cifs_file->tlink);
306 dput(cifs_file->dentry);
307 kfree(cifs_file);
308}
309
310int cifs_open(struct inode *inode, struct file *file)
311{
312 int rc = -EACCES;
313 int xid;
314 __u32 oplock;
315 struct cifs_sb_info *cifs_sb;
316 struct cifsTconInfo *tcon;
317 struct tcon_link *tlink;
318 struct cifsFileInfo *pCifsFile = NULL;
319 struct cifsInodeInfo *pCifsInode;
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);
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);
335
336 pCifsInode = CIFS_I(file->f_path.dentry->d_inode);
337
338 full_path = build_path_from_dentry(file->f_path.dentry);
339 if (full_path == NULL) {
340 rc = -ENOMEM;
341 goto out;
342 }
343
344 cFYI(1, "inode = 0x%p file flags are 0x%x for %s",
345 inode, file->f_flags, full_path);
346
347 if (oplockEnabled)
348 oplock = REQ_OPLOCK;
349 else
350 oplock = 0;
351
352 if (!tcon->broken_posix_open && tcon->unix_ext &&
353 (tcon->ses->capabilities & CAP_UNIX) &&
354 (CIFS_UNIX_POSIX_PATH_OPS_CAP &
355 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
356 /* can not refresh inode info since size could be stale */
357 rc = cifs_posix_open(full_path, &inode, inode->i_sb,
358 cifs_sb->mnt_file_mode /* ignored */,
359 file->f_flags, &oplock, &netfid, xid);
360 if (rc == 0) {
361 cFYI(1, "posix open succeeded");
362
363 pCifsFile = cifs_new_fileinfo(netfid, file, tlink,
364 oplock);
365 if (pCifsFile == NULL) {
366 CIFSSMBClose(xid, tcon, netfid);
367 rc = -ENOMEM;
368 }
369
370 cifs_fscache_set_inode_cookie(inode, file);
371
372 goto out;
373 } else if ((rc == -EINVAL) || (rc == -EOPNOTSUPP)) {
374 if (tcon->ses->serverNOS)
375 cERROR(1, "server %s of type %s returned"
376 " unexpected error on SMB posix open"
377 ", disabling posix open support."
378 " Check if server update available.",
379 tcon->ses->serverName,
380 tcon->ses->serverNOS);
381 tcon->broken_posix_open = true;
382 } else if ((rc != -EIO) && (rc != -EREMOTE) &&
383 (rc != -EOPNOTSUPP)) /* path not found or net err */
384 goto out;
385 /* else fallthrough to retry open the old way on network i/o
386 or DFS errors */
387 }
388
389 desiredAccess = cifs_convert_flags(file->f_flags);
390
391/*********************************************************************
392 * open flag mapping table:
393 *
394 * POSIX Flag CIFS Disposition
395 * ---------- ----------------
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
403 * FILE_SUPERSEDE (ie create whether or not file exists although
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 *?
408 *? O_SYNC is a reasonable match to CIFS writethrough flag
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
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
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
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 }
431
432 if (tcon->ses->capabilities & CAP_NT_SMBS)
433 rc = CIFSSMBOpen(xid, tcon, full_path, disposition,
434 desiredAccess, CREATE_NOT_DIR, &netfid, &oplock, buf,
435 cifs_sb->local_nls, cifs_sb->mnt_cifs_flags
436 & CIFS_MOUNT_MAP_SPECIAL_CHR);
437 else
438 rc = -EIO; /* no NT SMB support fall into legacy open below */
439
440 if (rc == -EIO) {
441 /* Old server, try legacy style OpenX */
442 rc = SMBLegacyOpen(xid, tcon, full_path, disposition,
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 }
447 if (rc) {
448 cFYI(1, "cifs_open returned 0x%x", rc);
449 goto out;
450 }
451
452 rc = cifs_open_inode_helper(inode, tcon, oplock, buf, full_path, xid);
453 if (rc != 0)
454 goto out;
455
456 pCifsFile = cifs_new_fileinfo(netfid, file, tlink, oplock);
457 if (pCifsFile == NULL) {
458 rc = -ENOMEM;
459 goto out;
460 }
461
462 cifs_fscache_set_inode_cookie(inode, file);
463
464 if (oplock & CIFS_CREATE_ACTION) {
465 /* time to set mode which we can not set earlier due to
466 problems creating new read-only files */
467 if (tcon->unix_ext) {
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 };
477 CIFSSMBUnixSetPathInfo(xid, tcon, full_path, &args,
478 cifs_sb->local_nls,
479 cifs_sb->mnt_cifs_flags &
480 CIFS_MOUNT_MAP_SPECIAL_CHR);
481 }
482 }
483
484out:
485 kfree(buf);
486 kfree(full_path);
487 FreeXid(xid);
488 cifs_put_tlink(tlink);
489 return rc;
490}
491
492/* Try to reacquire byte range locks that were released when session */
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
503static int cifs_reopen_file(struct cifsFileInfo *pCifsFile, bool can_flush)
504{
505 int rc = -EACCES;
506 int xid;
507 __u32 oplock;
508 struct cifs_sb_info *cifs_sb;
509 struct cifsTconInfo *tcon;
510 struct cifsInodeInfo *pCifsInode;
511 struct inode *inode;
512 char *full_path = NULL;
513 int desiredAccess;
514 int disposition = FILE_OPEN;
515 __u16 netfid;
516
517 xid = GetXid();
518 mutex_lock(&pCifsFile->fh_mutex);
519 if (!pCifsFile->invalidHandle) {
520 mutex_unlock(&pCifsFile->fh_mutex);
521 rc = 0;
522 FreeXid(xid);
523 return rc;
524 }
525
526 inode = pCifsFile->dentry->d_inode;
527 cifs_sb = CIFS_SB(inode->i_sb);
528 tcon = tlink_tcon(pCifsFile->tlink);
529
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 */
534 full_path = build_path_from_dentry(pCifsFile->dentry);
535 if (full_path == NULL) {
536 rc = -ENOMEM;
537 mutex_unlock(&pCifsFile->fh_mutex);
538 FreeXid(xid);
539 return rc;
540 }
541
542 cFYI(1, "inode = 0x%p file flags 0x%x for %s",
543 inode, pCifsFile->f_flags, full_path);
544
545 if (oplockEnabled)
546 oplock = REQ_OPLOCK;
547 else
548 oplock = 0;
549
550 if (tcon->unix_ext && (tcon->ses->capabilities & CAP_UNIX) &&
551 (CIFS_UNIX_POSIX_PATH_OPS_CAP &
552 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
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 */
558 unsigned int oflags = pCifsFile->f_flags &
559 ~(O_CREAT | O_EXCL | O_TRUNC);
560
561 rc = cifs_posix_open(full_path, NULL, inode->i_sb,
562 cifs_sb->mnt_file_mode /* ignored */,
563 oflags, &oplock, &netfid, xid);
564 if (rc == 0) {
565 cFYI(1, "posix reopen succeeded");
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
572 desiredAccess = cifs_convert_flags(pCifsFile->f_flags);
573
574 /* Can not refresh inode by passing in file_info buf to be returned
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
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
580 rc = CIFSSMBOpen(xid, tcon, full_path, disposition, desiredAccess,
581 CREATE_NOT_DIR, &netfid, &oplock, NULL,
582 cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
583 CIFS_MOUNT_MAP_SPECIAL_CHR);
584 if (rc) {
585 mutex_unlock(&pCifsFile->fh_mutex);
586 cFYI(1, "cifs_open returned 0x%x", rc);
587 cFYI(1, "oplock: %d", oplock);
588 goto reopen_error_exit;
589 }
590
591reopen_success:
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);
599 mapping_set_error(inode->i_mapping, rc);
600
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 */
614
615 cifs_set_oplock_level(inode, oplock);
616
617 cifs_relock_file(pCifsFile);
618
619reopen_error_exit:
620 kfree(full_path);
621 FreeXid(xid);
622 return rc;
623}
624
625int cifs_close(struct inode *inode, struct file *file)
626{
627 cifsFileInfo_put(file->private_data);
628 file->private_data = NULL;
629
630 /* return code from the ->release op is always ignored */
631 return 0;
632}
633
634int cifs_closedir(struct inode *inode, struct file *file)
635{
636 int rc = 0;
637 int xid;
638 struct cifsFileInfo *pCFileStruct = file->private_data;
639 char *ptmp;
640
641 cFYI(1, "Closedir inode = 0x%p", inode);
642
643 xid = GetXid();
644
645 if (pCFileStruct) {
646 struct cifsTconInfo *pTcon = tlink_tcon(pCFileStruct->tlink);
647
648 cFYI(1, "Freeing private data in close dir");
649 spin_lock(&cifs_file_list_lock);
650 if (!pCFileStruct->srch_inf.endOfSearch &&
651 !pCFileStruct->invalidHandle) {
652 pCFileStruct->invalidHandle = true;
653 spin_unlock(&cifs_file_list_lock);
654 rc = CIFSFindClose(xid, pTcon, pCFileStruct->netfid);
655 cFYI(1, "Closing uncompleted readdir with rc %d",
656 rc);
657 /* not much we can do if it fails anyway, ignore rc */
658 rc = 0;
659 } else
660 spin_unlock(&cifs_file_list_lock);
661 ptmp = pCFileStruct->srch_inf.ntwrk_buf_start;
662 if (ptmp) {
663 cFYI(1, "closedir free smb buf in srch struct");
664 pCFileStruct->srch_inf.ntwrk_buf_start = NULL;
665 if (pCFileStruct->srch_inf.smallBuf)
666 cifs_small_buf_release(ptmp);
667 else
668 cifs_buf_release(ptmp);
669 }
670 cifs_put_tlink(pCFileStruct->tlink);
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
679static int store_file_lock(struct cifsFileInfo *fid, __u64 len,
680 __u64 offset, __u8 lockType)
681{
682 struct cifsLockInfo *li =
683 kmalloc(sizeof(struct cifsLockInfo), GFP_KERNEL);
684 if (li == NULL)
685 return -ENOMEM;
686 li->offset = offset;
687 li->length = len;
688 li->type = lockType;
689 mutex_lock(&fid->lock_mutex);
690 list_add(&li->llist, &fid->llist);
691 mutex_unlock(&fid->lock_mutex);
692 return 0;
693}
694
695int cifs_lock(struct file *file, int cmd, struct file_lock *pfLock)
696{
697 int rc, xid;
698 __u32 numLock = 0;
699 __u32 numUnlock = 0;
700 __u64 length;
701 bool wait_flag = false;
702 struct cifs_sb_info *cifs_sb;
703 struct cifsTconInfo *tcon;
704 __u16 netfid;
705 __u8 lockType = LOCKING_ANDX_LARGE_FILES;
706 bool posix_locking = 0;
707
708 length = 1 + pfLock->fl_end - pfLock->fl_start;
709 rc = -EACCES;
710 xid = GetXid();
711
712 cFYI(1, "Lock parm: 0x%x flockflags: "
713 "0x%x flocktype: 0x%x start: %lld end: %lld",
714 cmd, pfLock->fl_flags, pfLock->fl_type, pfLock->fl_start,
715 pfLock->fl_end);
716
717 if (pfLock->fl_flags & FL_POSIX)
718 cFYI(1, "Posix");
719 if (pfLock->fl_flags & FL_FLOCK)
720 cFYI(1, "Flock");
721 if (pfLock->fl_flags & FL_SLEEP) {
722 cFYI(1, "Blocking lock");
723 wait_flag = true;
724 }
725 if (pfLock->fl_flags & FL_ACCESS)
726 cFYI(1, "Process suspended by mandatory locking - "
727 "not implemented yet");
728 if (pfLock->fl_flags & FL_LEASE)
729 cFYI(1, "Lease on file - not implemented yet");
730 if (pfLock->fl_flags &
731 (~(FL_POSIX | FL_FLOCK | FL_SLEEP | FL_ACCESS | FL_LEASE)))
732 cFYI(1, "Unknown lock flags 0x%x", pfLock->fl_flags);
733
734 if (pfLock->fl_type == F_WRLCK) {
735 cFYI(1, "F_WRLCK ");
736 numLock = 1;
737 } else if (pfLock->fl_type == F_UNLCK) {
738 cFYI(1, "F_UNLCK");
739 numUnlock = 1;
740 /* Check if unlock includes more than
741 one lock range */
742 } else if (pfLock->fl_type == F_RDLCK) {
743 cFYI(1, "F_RDLCK");
744 lockType |= LOCKING_ANDX_SHARED_LOCK;
745 numLock = 1;
746 } else if (pfLock->fl_type == F_EXLCK) {
747 cFYI(1, "F_EXLCK");
748 numLock = 1;
749 } else if (pfLock->fl_type == F_SHLCK) {
750 cFYI(1, "F_SHLCK");
751 lockType |= LOCKING_ANDX_SHARED_LOCK;
752 numLock = 1;
753 } else
754 cFYI(1, "Unknown type of lock");
755
756 cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
757 tcon = tlink_tcon(((struct cifsFileInfo *)file->private_data)->tlink);
758
759 if (file->private_data == NULL) {
760 rc = -EBADF;
761 FreeXid(xid);
762 return rc;
763 }
764 netfid = ((struct cifsFileInfo *)file->private_data)->netfid;
765
766 if ((tcon->ses->capabilities & CAP_UNIX) &&
767 (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) &&
768 ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0))
769 posix_locking = 1;
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 */
773 if (IS_GETLK(cmd)) {
774 if (posix_locking) {
775 int posix_lock_type;
776 if (lockType & LOCKING_ANDX_SHARED_LOCK)
777 posix_lock_type = CIFS_RDLCK;
778 else
779 posix_lock_type = CIFS_WRLCK;
780 rc = CIFSSMBPosixLock(xid, tcon, netfid, 1 /* get */,
781 length, pfLock,
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 */
788 rc = CIFSSMBLock(xid, tcon, netfid, length, pfLock->fl_start,
789 0, 1, lockType, 0 /* wait flag */ );
790 if (rc == 0) {
791 rc = CIFSSMBLock(xid, tcon, netfid, length,
792 pfLock->fl_start, 1 /* numUnlock */ ,
793 0 /* numLock */ , lockType,
794 0 /* wait flag */ );
795 pfLock->fl_type = F_UNLCK;
796 if (rc != 0)
797 cERROR(1, "Error unlocking previously locked "
798 "range %d during test of lock", rc);
799 rc = 0;
800
801 } else {
802 /* if rc == ERR_SHARING_VIOLATION ? */
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)
820 cERROR(1, "Error unlocking "
821 "previously locked range %d "
822 "during test of lock", rc);
823 rc = 0;
824 } else {
825 pfLock->fl_type = F_WRLCK;
826 rc = 0;
827 }
828 }
829 }
830
831 FreeXid(xid);
832 return rc;
833 }
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) {
843 int posix_lock_type;
844 if (lockType & LOCKING_ANDX_SHARED_LOCK)
845 posix_lock_type = CIFS_RDLCK;
846 else
847 posix_lock_type = CIFS_WRLCK;
848
849 if (numUnlock == 1)
850 posix_lock_type = CIFS_UNLCK;
851
852 rc = CIFSSMBPosixLock(xid, tcon, netfid, 0 /* set */,
853 length, pfLock,
854 posix_lock_type, wait_flag);
855 } else {
856 struct cifsFileInfo *fid = file->private_data;
857
858 if (numLock) {
859 rc = CIFSSMBLock(xid, tcon, netfid, length,
860 pfLock->fl_start,
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
874 rc = 0;
875 mutex_lock(&fid->lock_mutex);
876 list_for_each_entry_safe(li, tmp, &fid->llist, llist) {
877 if (pfLock->fl_start <= li->offset &&
878 (pfLock->fl_start + length) >=
879 (li->offset + li->length)) {
880 stored_rc = CIFSSMBLock(xid, tcon,
881 netfid,
882 li->length, li->offset,
883 1, 0, li->type, false);
884 if (stored_rc)
885 rc = stored_rc;
886 else {
887 list_del(&li->llist);
888 kfree(li);
889 }
890 }
891 }
892 mutex_unlock(&fid->lock_mutex);
893 }
894 }
895
896 if (pfLock->fl_flags & FL_POSIX)
897 posix_lock_file_wait(file, pfLock);
898 FreeXid(xid);
899 return rc;
900}
901
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
936ssize_t cifs_user_write(struct file *file, const char __user *write_data,
937 size_t write_size, loff_t *poffset)
938{
939 struct inode *inode = file->f_path.dentry->d_inode;
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;
947 struct cifsInodeInfo *cifsi = CIFS_I(inode);
948
949 cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
950
951 /* cFYI(1, " write %d bytes to offset %lld of %s", write_size,
952 *poffset, file->f_path.dentry->d_name.name); */
953
954 if (file->private_data == NULL)
955 return -EBADF;
956
957 open_file = file->private_data;
958 pTcon = tlink_tcon(open_file->tlink);
959
960 rc = generic_write_checks(file, poffset, &write_size, 0);
961 if (rc)
962 return rc;
963
964 xid = GetXid();
965
966 long_op = cifs_write_timeout(cifsi, *poffset);
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;
978 }
979 if (open_file->invalidHandle) {
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 */
984 rc = cifs_reopen_file(open_file, false);
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 }
1003 } else {
1004 cifs_update_eof(cifsi, *poffset, bytes_written);
1005 *poffset += bytes_written;
1006 }
1007 long_op = CIFS_STD_OP; /* subsequent writes fast -
1008 15 seconds is plenty */
1009 }
1010
1011 cifs_stats_bytes_written(pTcon, total_written);
1012
1013/* Do not update local mtime - server will set its actual value on write
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);
1021 }
1022 mark_inode_dirty_sync(inode);
1023
1024 FreeXid(xid);
1025 return total_written;
1026}
1027
1028static ssize_t cifs_write(struct cifsFileInfo *open_file,
1029 const char *write_data, size_t write_size,
1030 loff_t *poffset)
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;
1038 struct dentry *dentry = open_file->dentry;
1039 struct cifsInodeInfo *cifsi = CIFS_I(dentry->d_inode);
1040
1041 cifs_sb = CIFS_SB(dentry->d_sb);
1042
1043 cFYI(1, "write %zd bytes to offset %lld of %s", write_size,
1044 *poffset, dentry->d_name.name);
1045
1046 pTcon = tlink_tcon(open_file->tlink);
1047
1048 xid = GetXid();
1049
1050 long_op = cifs_write_timeout(cifsi, *poffset);
1051 for (total_written = 0; write_size > total_written;
1052 total_written += bytes_written) {
1053 rc = -EAGAIN;
1054 while (rc == -EAGAIN) {
1055 if (open_file->invalidHandle) {
1056 /* we could deadlock if we called
1057 filemap_fdatawait from here so tell
1058 reopen_file not to flush data to
1059 server now */
1060 rc = cifs_reopen_file(open_file, false);
1061 if (rc != 0)
1062 break;
1063 }
1064 if (experimEnabled || (pTcon->ses->server &&
1065 ((pTcon->ses->server->secMode &
1066 (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
1067 == 0))) {
1068 struct kvec iov[2];
1069 unsigned int len;
1070
1071 len = min((size_t)cifs_sb->wsize,
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;
1077 rc = CIFSSMBWrite2(xid, pTcon,
1078 open_file->netfid, len,
1079 *poffset, &bytes_written,
1080 iov, 1, long_op);
1081 } else
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);
1089 }
1090 if (rc || (bytes_written == 0)) {
1091 if (total_written)
1092 break;
1093 else {
1094 FreeXid(xid);
1095 return rc;
1096 }
1097 } else {
1098 cifs_update_eof(cifsi, *poffset, bytes_written);
1099 *poffset += bytes_written;
1100 }
1101 long_op = CIFS_STD_OP; /* subsequent writes fast -
1102 15 seconds is plenty */
1103 }
1104
1105 cifs_stats_bytes_written(pTcon, total_written);
1106
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);
1112 }
1113 mark_inode_dirty_sync(dentry->d_inode);
1114 FreeXid(xid);
1115 return total_written;
1116}
1117
1118#ifdef CONFIG_CIFS_EXPERIMENTAL
1119struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *cifs_inode,
1120 bool fsuid_only)
1121{
1122 struct cifsFileInfo *open_file = NULL;
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;
1128
1129 spin_lock(&cifs_file_list_lock);
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) {
1134 if (fsuid_only && open_file->uid != current_fsuid())
1135 continue;
1136 if (OPEN_FMODE(open_file->f_flags) & FMODE_READ) {
1137 if (!open_file->invalidHandle) {
1138 /* found a good file */
1139 /* lock it so it will not be closed on us */
1140 cifsFileInfo_get(open_file);
1141 spin_unlock(&cifs_file_list_lock);
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 }
1149 spin_unlock(&cifs_file_list_lock);
1150 return NULL;
1151}
1152#endif
1153
1154struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *cifs_inode,
1155 bool fsuid_only)
1156{
1157 struct cifsFileInfo *open_file;
1158 struct cifs_sb_info *cifs_sb = CIFS_SB(cifs_inode->vfs_inode.i_sb);
1159 bool any_available = false;
1160 int rc;
1161
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
1166 if (cifs_inode == NULL) {
1167 cERROR(1, "Null inode passed to cifs_writeable_file");
1168 dump_stack();
1169 return NULL;
1170 }
1171
1172 /* only filter by fsuid on multiuser mounts */
1173 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
1174 fsuid_only = false;
1175
1176 spin_lock(&cifs_file_list_lock);
1177refind_writable:
1178 list_for_each_entry(open_file, &cifs_inode->openFileList, flist) {
1179 if (!any_available && open_file->pid != current->tgid)
1180 continue;
1181 if (fsuid_only && open_file->uid != current_fsuid())
1182 continue;
1183 if (OPEN_FMODE(open_file->f_flags) & FMODE_WRITE) {
1184 cifsFileInfo_get(open_file);
1185
1186 if (!open_file->invalidHandle) {
1187 /* found a good writable file */
1188 spin_unlock(&cifs_file_list_lock);
1189 return open_file;
1190 }
1191
1192 spin_unlock(&cifs_file_list_lock);
1193
1194 /* Had to unlock since following call can block */
1195 rc = cifs_reopen_file(open_file, false);
1196 if (!rc)
1197 return open_file;
1198
1199 /* if it fails, try another handle if possible */
1200 cFYI(1, "wp failed on reopen file");
1201 cifsFileInfo_put(open_file);
1202
1203 spin_lock(&cifs_file_list_lock);
1204
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. */
1212 }
1213 }
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 }
1219 spin_unlock(&cifs_file_list_lock);
1220 return NULL;
1221}
1222
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;
1231 struct inode *inode;
1232 struct cifsFileInfo *open_file;
1233
1234 if (!mapping || !mapping->host)
1235 return -EFAULT;
1236
1237 inode = page->mapping->host;
1238 cifs_sb = CIFS_SB(inode->i_sb);
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)
1257 to = (unsigned)(mapping->host->i_size - offset);
1258
1259 open_file = find_writable_file(CIFS_I(mapping->host), false);
1260 if (open_file) {
1261 bytes_written = cifs_write(open_file, write_data,
1262 to - from, &offset);
1263 cifsFileInfo_put(open_file);
1264 /* Does mm or vfs already set times? */
1265 inode->i_atime = inode->i_mtime = current_fs_time(inode->i_sb);
1266 if ((bytes_written > 0) && (offset))
1267 rc = 0;
1268 else if (bytes_written < 0)
1269 rc = bytes_written;
1270 } else {
1271 cFYI(1, "No writeable filehandles for inode");
1272 rc = -EIO;
1273 }
1274
1275 kunmap(page);
1276 return rc;
1277}
1278
1279static int cifs_writepages(struct address_space *mapping,
1280 struct writeback_control *wbc)
1281{
1282 unsigned int bytes_to_write;
1283 unsigned int bytes_written;
1284 struct cifs_sb_info *cifs_sb;
1285 int done = 0;
1286 pgoff_t end;
1287 pgoff_t index;
1288 int range_whole = 0;
1289 struct kvec *iov;
1290 int len;
1291 int n_iov = 0;
1292 pgoff_t next;
1293 int nr_pages;
1294 __u64 offset = 0;
1295 struct cifsFileInfo *open_file;
1296 struct cifsTconInfo *tcon;
1297 struct cifsInodeInfo *cifsi = CIFS_I(mapping->host);
1298 struct page *page;
1299 struct pagevec pvec;
1300 int rc = 0;
1301 int scanned = 0;
1302 int xid, long_op;
1303
1304 cifs_sb = CIFS_SB(mapping->host->i_sb);
1305
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
1313 iov = kmalloc(32 * sizeof(struct kvec), GFP_KERNEL);
1314 if (iov == NULL)
1315 return generic_writepages(mapping, wbc);
1316
1317 /*
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?
1321 */
1322 open_file = find_writable_file(CIFS_I(mapping->host), false);
1323 if (!open_file) {
1324 kfree(iov);
1325 return generic_writepages(mapping, wbc);
1326 }
1327
1328 tcon = tlink_tcon(open_file->tlink);
1329 if (!experimEnabled && tcon->ses->server->secMode &
1330 (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) {
1331 cifsFileInfo_put(open_file);
1332 kfree(iov);
1333 return generic_writepages(mapping, wbc);
1334 }
1335 cifsFileInfo_put(open_file);
1336
1337 xid = GetXid();
1338
1339 pagevec_init(&pvec, 0);
1340 if (wbc->range_cyclic) {
1341 index = mapping->writeback_index; /* Start from prev offset */
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;
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
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);
1375 else if (!trylock_page(page))
1376 break;
1377
1378 if (unlikely(page->mapping != mapping)) {
1379 unlock_page(page);
1380 break;
1381 }
1382
1383 if (!wbc->range_cyclic && page->index > end) {
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) ||
1399 !clear_page_dirty_for_io(page)) {
1400 unlock_page(page);
1401 break;
1402 }
1403
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
1410 if (page_offset(page) >= mapping->host->i_size) {
1411 done = 1;
1412 unlock_page(page);
1413 end_page_writeback(page);
1414 break;
1415 }
1416
1417 /*
1418 * BB can we get rid of this? pages are held by pvec
1419 */
1420 page_cache_get(page);
1421
1422 len = min(mapping->host->i_size - page_offset(page),
1423 (loff_t)PAGE_CACHE_SIZE);
1424
1425 /* reserve iov[0] for the smb header */
1426 n_iov++;
1427 iov[n_iov].iov_base = kmap(page);
1428 iov[n_iov].iov_len = len;
1429 bytes_to_write += len;
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) {
1440 open_file = find_writable_file(CIFS_I(mapping->host),
1441 false);
1442 if (!open_file) {
1443 cERROR(1, "No writable handles for inode");
1444 rc = -EBADF;
1445 } else {
1446 long_op = cifs_write_timeout(cifsi, offset);
1447 rc = CIFSSMBWrite2(xid, tcon, open_file->netfid,
1448 bytes_to_write, offset,
1449 &bytes_written, iov, n_iov,
1450 long_op);
1451 cifsFileInfo_put(open_file);
1452 cifs_update_eof(cifsi, offset, bytes_written);
1453 }
1454
1455 if (rc || bytes_written < bytes_to_write) {
1456 cERROR(1, "Write2 ret %d, wrote %d",
1457 rc, bytes_written);
1458 mapping_set_error(mapping, rc);
1459 } else {
1460 cifs_stats_bytes_written(tcon, bytes_written);
1461 }
1462
1463 for (i = 0; i < n_iov; i++) {
1464 page = pvec.pages[first + i];
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
1469 when page marked as error */
1470 if (rc)
1471 SetPageError(page);
1472 kunmap(page);
1473 unlock_page(page);
1474 end_page_writeback(page);
1475 page_cache_release(page);
1476 }
1477 if ((wbc->nr_to_write -= n_iov) <= 0)
1478 done = 1;
1479 index = next;
1480 } else
1481 /* Need to re-find the pages we skipped */
1482 index = pvec.pages[0]->index + 1;
1483
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 }
1495 if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0))
1496 mapping->writeback_index = index;
1497
1498 FreeXid(xid);
1499 kfree(iov);
1500 return rc;
1501}
1502
1503static int cifs_writepage(struct page *page, struct writeback_control *wbc)
1504{
1505 int rc = -EFAULT;
1506 int xid;
1507
1508 xid = GetXid();
1509/* BB add check for wbc flags */
1510 page_cache_get(page);
1511 if (!PageUptodate(page))
1512 cFYI(1, "ppw - page not up to date");
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 */
1524 set_page_writeback(page);
1525 rc = cifs_partialpagewrite(page, 0, PAGE_CACHE_SIZE);
1526 SetPageUptodate(page); /* BB add check for error and Clearuptodate? */
1527 unlock_page(page);
1528 end_page_writeback(page);
1529 page_cache_release(page);
1530 FreeXid(xid);
1531 return rc;
1532}
1533
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)
1537{
1538 int rc;
1539 struct inode *inode = mapping->host;
1540
1541 cFYI(1, "write_end for page %p from pos %lld with %d bytes",
1542 page, pos, copied);
1543
1544 if (PageChecked(page)) {
1545 if (copied == len)
1546 SetPageUptodate(page);
1547 ClearPageChecked(page);
1548 } else if (!PageUptodate(page) && copied == PAGE_CACHE_SIZE)
1549 SetPageUptodate(page);
1550
1551 if (!PageUptodate(page)) {
1552 char *page_data;
1553 unsigned offset = pos & (PAGE_CACHE_SIZE - 1);
1554 int xid;
1555
1556 xid = GetXid();
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);
1563 rc = cifs_write(file->private_data, page_data + offset,
1564 copied, &pos);
1565 /* if (rc < 0) should we set writebehind rc? */
1566 kunmap(page);
1567
1568 FreeXid(xid);
1569 } else {
1570 rc = copied;
1571 pos += copied;
1572 set_page_dirty(page);
1573 }
1574
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
1585 return rc;
1586}
1587
1588int cifs_fsync(struct file *file, int datasync)
1589{
1590 int xid;
1591 int rc = 0;
1592 struct cifsTconInfo *tcon;
1593 struct cifsFileInfo *smbfile = file->private_data;
1594 struct inode *inode = file->f_path.dentry->d_inode;
1595
1596 xid = GetXid();
1597
1598 cFYI(1, "Sync file - name: %s datasync: 0x%x",
1599 file->f_path.dentry->d_name.name, datasync);
1600
1601 rc = filemap_write_and_wait(inode->i_mapping);
1602 if (rc == 0) {
1603 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
1604
1605 tcon = tlink_tcon(smbfile->tlink);
1606 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC))
1607 rc = CIFSSMBFlush(xid, tcon, smbfile->netfid);
1608 }
1609
1610 FreeXid(xid);
1611 return rc;
1612}
1613
1614/* static void cifs_sync_page(struct page *page)
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
1622 cFYI(1, "sync page %p", page);
1623 mapping = page->mapping;
1624 if (!mapping)
1625 return 0;
1626 inode = mapping->host;
1627 if (!inode)
1628 return; */
1629
1630/* fill in rpages then
1631 result = cifs_pagein_inode(inode, index, rpages); */ /* BB finish */
1632
1633/* cFYI(1, "rpages is %d for sync page of Index %ld", rpages, index);
1634
1635#if 0
1636 if (rc < 0)
1637 return rc;
1638 return 0;
1639#endif
1640} */
1641
1642/*
1643 * As file closes, flush all cached write data for this inode checking
1644 * for write behind errors.
1645 */
1646int cifs_flush(struct file *file, fl_owner_t id)
1647{
1648 struct inode *inode = file->f_path.dentry->d_inode;
1649 int rc = 0;
1650
1651 if (file->f_mode & FMODE_WRITE)
1652 rc = filemap_write_and_wait(inode->i_mapping);
1653
1654 cFYI(1, "Flush inode %p file %p rc %d", inode, file, rc);
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();
1675 cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
1676
1677 if (file->private_data == NULL) {
1678 rc = -EBADF;
1679 FreeXid(xid);
1680 return rc;
1681 }
1682 open_file = file->private_data;
1683 pTcon = tlink_tcon(open_file->tlink);
1684
1685 if ((file->f_flags & O_ACCMODE) == O_WRONLY)
1686 cFYI(1, "attempting read on write only file instance");
1687
1688 for (total_read = 0, current_offset = read_data;
1689 read_size > total_read;
1690 total_read += bytes_read, current_offset += bytes_read) {
1691 current_read_size = min_t(const int, read_size - total_read,
1692 cifs_sb->rsize);
1693 rc = -EAGAIN;
1694 smb_read_data = NULL;
1695 while (rc == -EAGAIN) {
1696 int buf_type = CIFS_NO_BUFFER;
1697 if (open_file->invalidHandle) {
1698 rc = cifs_reopen_file(open_file, true);
1699 if (rc != 0)
1700 break;
1701 }
1702 rc = CIFSSMBRead(xid, pTcon,
1703 open_file->netfid,
1704 current_read_size, *poffset,
1705 &bytes_read, &smb_read_data,
1706 &buf_type);
1707 pSMBr = (struct smb_com_read_rsp *)smb_read_data;
1708 if (smb_read_data) {
1709 if (copy_to_user(current_offset,
1710 smb_read_data +
1711 4 /* RFC1001 length field */ +
1712 le16_to_cpu(pSMBr->DataOffset),
1713 bytes_read))
1714 rc = -EFAULT;
1715
1716 if (buf_type == CIFS_SMALL_BUFFER)
1717 cifs_small_buf_release(smb_read_data);
1718 else if (buf_type == CIFS_LARGE_BUFFER)
1719 cifs_buf_release(smb_read_data);
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 {
1731 cifs_stats_bytes_read(pTcon, bytes_read);
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;
1752 int buf_type = CIFS_NO_BUFFER;
1753
1754 xid = GetXid();
1755 cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
1756
1757 if (file->private_data == NULL) {
1758 rc = -EBADF;
1759 FreeXid(xid);
1760 return rc;
1761 }
1762 open_file = file->private_data;
1763 pTcon = tlink_tcon(open_file->tlink);
1764
1765 if ((file->f_flags & O_ACCMODE) == O_WRONLY)
1766 cFYI(1, "attempting read on write only file instance");
1767
1768 for (total_read = 0, current_offset = read_data;
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);
1773 /* For windows me and 9x we do not want to request more
1774 than it negotiated since it will refuse the read then */
1775 if ((pTcon->ses) &&
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 }
1780 rc = -EAGAIN;
1781 while (rc == -EAGAIN) {
1782 if (open_file->invalidHandle) {
1783 rc = cifs_reopen_file(open_file, true);
1784 if (rc != 0)
1785 break;
1786 }
1787 rc = CIFSSMBRead(xid, pTcon,
1788 open_file->netfid,
1789 current_read_size, *poffset,
1790 &bytes_read, &current_offset,
1791 &buf_type);
1792 }
1793 if (rc || (bytes_read == 0)) {
1794 if (total_read) {
1795 break;
1796 } else {
1797 FreeXid(xid);
1798 return rc;
1799 }
1800 } else {
1801 cifs_stats_bytes_read(pTcon, total_read);
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{
1811 int rc, xid;
1812
1813 xid = GetXid();
1814 rc = cifs_revalidate_file(file);
1815 if (rc) {
1816 cFYI(1, "Validation prior to mmap failed, error=%d", rc);
1817 FreeXid(xid);
1818 return rc;
1819 }
1820 rc = generic_file_mmap(file, vma);
1821 FreeXid(xid);
1822 return rc;
1823}
1824
1825
1826static void cifs_copy_cache_pages(struct address_space *mapping,
1827 struct list_head *pages, int bytes_read, char *data)
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
1839 if (add_to_page_cache_lru(page, mapping, page->index,
1840 GFP_KERNEL)) {
1841 page_cache_release(page);
1842 cFYI(1, "Add page cache failed");
1843 data += PAGE_CACHE_SIZE;
1844 bytes_read -= PAGE_CACHE_SIZE;
1845 continue;
1846 }
1847 page_cache_release(page);
1848
1849 target = kmap_atomic(page, KM_USER0);
1850
1851 if (PAGE_CACHE_SIZE > bytes_read) {
1852 memcpy(target, data, bytes_read);
1853 /* zero the tail end of this partial page */
1854 memset(target + bytes_read, 0,
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);
1866 data += PAGE_CACHE_SIZE;
1867
1868 /* add page to FS-Cache */
1869 cifs_readpage_to_fscache(mapping->host, page);
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;
1883 unsigned int bytes_read = 0;
1884 unsigned int read_size, i;
1885 char *smb_read_data = NULL;
1886 struct smb_com_read_rsp *pSMBr;
1887 struct cifsFileInfo *open_file;
1888 int buf_type = CIFS_NO_BUFFER;
1889
1890 xid = GetXid();
1891 if (file->private_data == NULL) {
1892 rc = -EBADF;
1893 FreeXid(xid);
1894 return rc;
1895 }
1896 open_file = file->private_data;
1897 cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
1898 pTcon = tlink_tcon(open_file->tlink);
1899
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
1909 cFYI(DBG2, "rpages: num pages %d", num_pages);
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;
1923 expected_index =
1924 list_entry(page_list->prev, struct page, lru)->index;
1925 list_for_each_entry_reverse(tmp_page, page_list, lru) {
1926 if (tmp_page->index == expected_index) {
1927 contig_pages++;
1928 expected_index++;
1929 } else
1930 break;
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);
1942 cFYI(DBG2, "rpages: read size 0x%x contiguous pages %d",
1943 read_size, contig_pages);
1944 rc = -EAGAIN;
1945 while (rc == -EAGAIN) {
1946 if (open_file->invalidHandle) {
1947 rc = cifs_reopen_file(open_file, true);
1948 if (rc != 0)
1949 break;
1950 }
1951
1952 rc = CIFSSMBRead(xid, pTcon,
1953 open_file->netfid,
1954 read_size, offset,
1955 &bytes_read, &smb_read_data,
1956 &buf_type);
1957 /* BB more RC checks ? */
1958 if (rc == -EAGAIN) {
1959 if (smb_read_data) {
1960 if (buf_type == CIFS_SMALL_BUFFER)
1961 cifs_small_buf_release(smb_read_data);
1962 else if (buf_type == CIFS_LARGE_BUFFER)
1963 cifs_buf_release(smb_read_data);
1964 smb_read_data = NULL;
1965 }
1966 }
1967 }
1968 if ((rc < 0) || (smb_read_data == NULL)) {
1969 cFYI(1, "Read error in readpages: %d", rc);
1970 break;
1971 } else if (bytes_read > 0) {
1972 task_io_account_read(bytes_read);
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 */ +
1976 le16_to_cpu(pSMBr->DataOffset));
1977
1978 i += bytes_read >> PAGE_CACHE_SHIFT;
1979 cifs_stats_bytes_read(pTcon, bytes_read);
1980 if ((bytes_read & PAGE_CACHE_MASK) != bytes_read) {
1981 i++; /* account for partial page */
1982
1983 /* server copy of file can have smaller size
1984 than client */
1985 /* BB do we need to verify this common case ?
1986 this case is ok - if we are at server EOF
1987 we will hit it on next read */
1988
1989 /* break; */
1990 }
1991 } else {
1992 cFYI(1, "No bytes read (%d) at offset %lld . "
1993 "Cleaning remaining pages from readahead list",
1994 bytes_read, offset);
1995 /* BB turn off caching and do new lookup on
1996 file size at server? */
1997 break;
1998 }
1999 if (smb_read_data) {
2000 if (buf_type == CIFS_SMALL_BUFFER)
2001 cifs_small_buf_release(smb_read_data);
2002 else if (buf_type == CIFS_LARGE_BUFFER)
2003 cifs_buf_release(smb_read_data);
2004 smb_read_data = NULL;
2005 }
2006 bytes_read = 0;
2007 }
2008
2009/* need to free smb_read_data buf before exit */
2010 if (smb_read_data) {
2011 if (buf_type == CIFS_SMALL_BUFFER)
2012 cifs_small_buf_release(smb_read_data);
2013 else if (buf_type == CIFS_LARGE_BUFFER)
2014 cifs_buf_release(smb_read_data);
2015 smb_read_data = NULL;
2016 }
2017
2018read_complete:
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
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
2034 page_cache_get(page);
2035 read_data = kmap(page);
2036 /* for reads over a certain size could initiate async read ahead */
2037
2038 rc = cifs_read(file, read_data, PAGE_CACHE_SIZE, poffset);
2039
2040 if (rc < 0)
2041 goto io_error;
2042 else
2043 cFYI(1, "Bytes read %d", rc);
2044
2045 file->f_path.dentry->d_inode->i_atime =
2046 current_fs_time(file->f_path.dentry->d_inode->i_sb);
2047
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);
2053
2054 /* send this page to the cache */
2055 cifs_readpage_to_fscache(file->f_path.dentry->d_inode, page);
2056
2057 rc = 0;
2058
2059io_error:
2060 kunmap(page);
2061 page_cache_release(page);
2062
2063read_complete:
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) {
2076 rc = -EBADF;
2077 FreeXid(xid);
2078 return rc;
2079 }
2080
2081 cFYI(1, "readpage %p at offset %d 0x%x\n",
2082 page, (int)offset, (int)offset);
2083
2084 rc = cifs_readpage_worker(file, page, &offset);
2085
2086 unlock_page(page);
2087
2088 FreeXid(xid);
2089 return rc;
2090}
2091
2092static int is_inode_writable(struct cifsInodeInfo *cifs_inode)
2093{
2094 struct cifsFileInfo *open_file;
2095
2096 spin_lock(&cifs_file_list_lock);
2097 list_for_each_entry(open_file, &cifs_inode->openFileList, flist) {
2098 if (OPEN_FMODE(open_file->f_flags) & FMODE_WRITE) {
2099 spin_unlock(&cifs_file_list_lock);
2100 return 1;
2101 }
2102 }
2103 spin_unlock(&cifs_file_list_lock);
2104 return 0;
2105}
2106
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
2110 refreshing the inode only on increases in the file size
2111 but this is tricky to do without racing with writebehind
2112 page caching in the current Linux kernel design */
2113bool is_size_safe_to_change(struct cifsInodeInfo *cifsInode, __u64 end_of_file)
2114{
2115 if (!cifsInode)
2116 return true;
2117
2118 if (is_inode_writable(cifsInode)) {
2119 /* This inode is open for write at least once */
2120 struct cifs_sb_info *cifs_sb;
2121
2122 cifs_sb = CIFS_SB(cifsInode->vfs_inode.i_sb);
2123 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) {
2124 /* since no page cache to corrupt on directio
2125 we can change size safely */
2126 return true;
2127 }
2128
2129 if (i_size_read(&cifsInode->vfs_inode) < end_of_file)
2130 return true;
2131
2132 return false;
2133 } else
2134 return true;
2135}
2136
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)
2140{
2141 pgoff_t index = pos >> PAGE_CACHE_SHIFT;
2142 loff_t offset = pos & (PAGE_CACHE_SIZE - 1);
2143 loff_t page_start = pos & PAGE_MASK;
2144 loff_t i_size;
2145 struct page *page;
2146 int rc = 0;
2147
2148 cFYI(1, "write_begin from %lld len %d", (long long)pos, len);
2149
2150 page = grab_cache_page_write_begin(mapping, index, flags);
2151 if (!page) {
2152 rc = -ENOMEM;
2153 goto out;
2154 }
2155
2156 if (PageUptodate(page))
2157 goto out;
2158
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;
2166
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 }
2190
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);
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
2202 this will be written out by write_end so is fine */
2203 }
2204out:
2205 *pagep = page;
2206 return rc;
2207}
2208
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
2225void cifs_oplock_break(struct work_struct *work)
2226{
2227 struct cifsFileInfo *cfile = container_of(work, struct cifsFileInfo,
2228 oplock_break);
2229 struct inode *inode = cfile->dentry->d_inode;
2230 struct cifsInodeInfo *cinode = CIFS_I(inode);
2231 int rc = 0;
2232
2233 if (inode && S_ISREG(inode->i_mode)) {
2234 if (cinode->clientCanCacheRead)
2235 break_lease(inode, O_RDONLY);
2236 else
2237 break_lease(inode, O_WRONLY);
2238 rc = filemap_fdatawrite(inode->i_mapping);
2239 if (cinode->clientCanCacheRead == 0) {
2240 rc = filemap_fdatawait(inode->i_mapping);
2241 mapping_set_error(inode->i_mapping, rc);
2242 invalidate_remote_inode(inode);
2243 }
2244 cFYI(1, "Oplock flush inode %p rc %d", inode, rc);
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 */
2253 if (!cfile->oplock_break_cancelled) {
2254 rc = CIFSSMBLock(0, tlink_tcon(cfile->tlink), cfile->netfid, 0,
2255 0, 0, 0, LOCKING_ANDX_OPLOCK_RELEASE, false);
2256 cFYI(1, "Oplock release rc = %d", rc);
2257 }
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
2262 * waiting for cifs_file_list_lock.
2263 */
2264 spin_lock(&cifs_file_list_lock);
2265 spin_unlock(&cifs_file_list_lock);
2266
2267 cifs_oplock_break_put(cfile);
2268}
2269
2270/* must be called while holding cifs_file_list_lock */
2271void cifs_oplock_break_get(struct cifsFileInfo *cfile)
2272{
2273 cifs_sb_active(cfile->dentry->d_sb);
2274 cifsFileInfo_get(cfile);
2275}
2276
2277void cifs_oplock_break_put(struct cifsFileInfo *cfile)
2278{
2279 cifsFileInfo_put(cfile);
2280 cifs_sb_deactive(cfile->dentry->d_sb);
2281}
2282
2283const struct address_space_operations cifs_addr_ops = {
2284 .readpage = cifs_readpage,
2285 .readpages = cifs_readpages,
2286 .writepage = cifs_writepage,
2287 .writepages = cifs_writepages,
2288 .write_begin = cifs_write_begin,
2289 .write_end = cifs_write_end,
2290 .set_page_dirty = __set_page_dirty_nobuffers,
2291 .releasepage = cifs_release_page,
2292 .invalidatepage = cifs_invalidate_page,
2293 /* .sync_page = cifs_sync_page, */
2294 /* .direct_IO = */
2295};
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 */
2302const struct address_space_operations cifs_addr_ops_smallbuf = {
2303 .readpage = cifs_readpage,
2304 .writepage = cifs_writepage,
2305 .writepages = cifs_writepages,
2306 .write_begin = cifs_write_begin,
2307 .write_end = cifs_write_end,
2308 .set_page_dirty = __set_page_dirty_nobuffers,
2309 .releasepage = cifs_release_page,
2310 .invalidatepage = cifs_invalidate_page,
2311 /* .sync_page = cifs_sync_page, */
2312 /* .direct_IO = */
2313};