ARM: 7747/1: pcpu: ensure __my_cpu_offset cannot be re-ordered across barrier()
[linux/fpc-iii.git] / fs / cifs / file.c
blob48b29d24c9f4d58e225d060b70da4fc2e5ea5e5e
1 /*
2 * fs/cifs/file.c
4 * vfs operations that deal with files
6 * Copyright (C) International Business Machines Corp., 2002,2010
7 * Author(s): Steve French (sfrench@us.ibm.com)
8 * Jeremy Allison (jra@samba.org)
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.
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.
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
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 <linux/swap.h>
36 #include <asm/div64.h>
37 #include "cifsfs.h"
38 #include "cifspdu.h"
39 #include "cifsglob.h"
40 #include "cifsproto.h"
41 #include "cifs_unicode.h"
42 #include "cifs_debug.h"
43 #include "cifs_fs_sb.h"
44 #include "fscache.h"
47 static inline int cifs_convert_flags(unsigned int flags)
49 if ((flags & O_ACCMODE) == O_RDONLY)
50 return GENERIC_READ;
51 else if ((flags & O_ACCMODE) == O_WRONLY)
52 return GENERIC_WRITE;
53 else if ((flags & O_ACCMODE) == O_RDWR) {
54 /* GENERIC_ALL is too much permission to request
55 can cause unnecessary access denied on create */
56 /* return GENERIC_ALL; */
57 return (GENERIC_READ | GENERIC_WRITE);
60 return (READ_CONTROL | FILE_WRITE_ATTRIBUTES | FILE_READ_ATTRIBUTES |
61 FILE_WRITE_EA | FILE_APPEND_DATA | FILE_WRITE_DATA |
62 FILE_READ_DATA);
65 static u32 cifs_posix_convert_flags(unsigned int flags)
67 u32 posix_flags = 0;
69 if ((flags & O_ACCMODE) == O_RDONLY)
70 posix_flags = SMB_O_RDONLY;
71 else if ((flags & O_ACCMODE) == O_WRONLY)
72 posix_flags = SMB_O_WRONLY;
73 else if ((flags & O_ACCMODE) == O_RDWR)
74 posix_flags = SMB_O_RDWR;
76 if (flags & O_CREAT) {
77 posix_flags |= SMB_O_CREAT;
78 if (flags & O_EXCL)
79 posix_flags |= SMB_O_EXCL;
80 } else if (flags & O_EXCL)
81 cifs_dbg(FYI, "Application %s pid %d has incorrectly set O_EXCL flag but not O_CREAT on file open. Ignoring O_EXCL\n",
82 current->comm, current->tgid);
84 if (flags & O_TRUNC)
85 posix_flags |= SMB_O_TRUNC;
86 /* be safe and imply O_SYNC for O_DSYNC */
87 if (flags & O_DSYNC)
88 posix_flags |= SMB_O_SYNC;
89 if (flags & O_DIRECTORY)
90 posix_flags |= SMB_O_DIRECTORY;
91 if (flags & O_NOFOLLOW)
92 posix_flags |= SMB_O_NOFOLLOW;
93 if (flags & O_DIRECT)
94 posix_flags |= SMB_O_DIRECT;
96 return posix_flags;
99 static inline int cifs_get_disposition(unsigned int flags)
101 if ((flags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL))
102 return FILE_CREATE;
103 else if ((flags & (O_CREAT | O_TRUNC)) == (O_CREAT | O_TRUNC))
104 return FILE_OVERWRITE_IF;
105 else if ((flags & O_CREAT) == O_CREAT)
106 return FILE_OPEN_IF;
107 else if ((flags & O_TRUNC) == O_TRUNC)
108 return FILE_OVERWRITE;
109 else
110 return FILE_OPEN;
113 int cifs_posix_open(char *full_path, struct inode **pinode,
114 struct super_block *sb, int mode, unsigned int f_flags,
115 __u32 *poplock, __u16 *pnetfid, unsigned int xid)
117 int rc;
118 FILE_UNIX_BASIC_INFO *presp_data;
119 __u32 posix_flags = 0;
120 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
121 struct cifs_fattr fattr;
122 struct tcon_link *tlink;
123 struct cifs_tcon *tcon;
125 cifs_dbg(FYI, "posix open %s\n", full_path);
127 presp_data = kzalloc(sizeof(FILE_UNIX_BASIC_INFO), GFP_KERNEL);
128 if (presp_data == NULL)
129 return -ENOMEM;
131 tlink = cifs_sb_tlink(cifs_sb);
132 if (IS_ERR(tlink)) {
133 rc = PTR_ERR(tlink);
134 goto posix_open_ret;
137 tcon = tlink_tcon(tlink);
138 mode &= ~current_umask();
140 posix_flags = cifs_posix_convert_flags(f_flags);
141 rc = CIFSPOSIXCreate(xid, tcon, posix_flags, mode, pnetfid, presp_data,
142 poplock, full_path, cifs_sb->local_nls,
143 cifs_sb->mnt_cifs_flags &
144 CIFS_MOUNT_MAP_SPECIAL_CHR);
145 cifs_put_tlink(tlink);
147 if (rc)
148 goto posix_open_ret;
150 if (presp_data->Type == cpu_to_le32(-1))
151 goto posix_open_ret; /* open ok, caller does qpathinfo */
153 if (!pinode)
154 goto posix_open_ret; /* caller does not need info */
156 cifs_unix_basic_to_fattr(&fattr, presp_data, cifs_sb);
158 /* get new inode and set it up */
159 if (*pinode == NULL) {
160 cifs_fill_uniqueid(sb, &fattr);
161 *pinode = cifs_iget(sb, &fattr);
162 if (!*pinode) {
163 rc = -ENOMEM;
164 goto posix_open_ret;
166 } else {
167 cifs_fattr_to_inode(*pinode, &fattr);
170 posix_open_ret:
171 kfree(presp_data);
172 return rc;
175 static int
176 cifs_nt_open(char *full_path, struct inode *inode, struct cifs_sb_info *cifs_sb,
177 struct cifs_tcon *tcon, unsigned int f_flags, __u32 *oplock,
178 struct cifs_fid *fid, unsigned int xid)
180 int rc;
181 int desired_access;
182 int disposition;
183 int create_options = CREATE_NOT_DIR;
184 FILE_ALL_INFO *buf;
185 struct TCP_Server_Info *server = tcon->ses->server;
187 if (!server->ops->open)
188 return -ENOSYS;
190 desired_access = cifs_convert_flags(f_flags);
192 /*********************************************************************
193 * open flag mapping table:
195 * POSIX Flag CIFS Disposition
196 * ---------- ----------------
197 * O_CREAT FILE_OPEN_IF
198 * O_CREAT | O_EXCL FILE_CREATE
199 * O_CREAT | O_TRUNC FILE_OVERWRITE_IF
200 * O_TRUNC FILE_OVERWRITE
201 * none of the above FILE_OPEN
203 * Note that there is not a direct match between disposition
204 * FILE_SUPERSEDE (ie create whether or not file exists although
205 * O_CREAT | O_TRUNC is similar but truncates the existing
206 * file rather than creating a new file as FILE_SUPERSEDE does
207 * (which uses the attributes / metadata passed in on open call)
209 *? O_SYNC is a reasonable match to CIFS writethrough flag
210 *? and the read write flags match reasonably. O_LARGEFILE
211 *? is irrelevant because largefile support is always used
212 *? by this client. Flags O_APPEND, O_DIRECT, O_DIRECTORY,
213 * O_FASYNC, O_NOFOLLOW, O_NONBLOCK need further investigation
214 *********************************************************************/
216 disposition = cifs_get_disposition(f_flags);
218 /* BB pass O_SYNC flag through on file attributes .. BB */
220 buf = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
221 if (!buf)
222 return -ENOMEM;
224 if (backup_cred(cifs_sb))
225 create_options |= CREATE_OPEN_BACKUP_INTENT;
227 rc = server->ops->open(xid, tcon, full_path, disposition,
228 desired_access, create_options, fid, oplock, buf,
229 cifs_sb);
231 if (rc)
232 goto out;
234 if (tcon->unix_ext)
235 rc = cifs_get_inode_info_unix(&inode, full_path, inode->i_sb,
236 xid);
237 else
238 rc = cifs_get_inode_info(&inode, full_path, buf, inode->i_sb,
239 xid, &fid->netfid);
241 out:
242 kfree(buf);
243 return rc;
246 static bool
247 cifs_has_mand_locks(struct cifsInodeInfo *cinode)
249 struct cifs_fid_locks *cur;
250 bool has_locks = false;
252 down_read(&cinode->lock_sem);
253 list_for_each_entry(cur, &cinode->llist, llist) {
254 if (!list_empty(&cur->locks)) {
255 has_locks = true;
256 break;
259 up_read(&cinode->lock_sem);
260 return has_locks;
263 struct cifsFileInfo *
264 cifs_new_fileinfo(struct cifs_fid *fid, struct file *file,
265 struct tcon_link *tlink, __u32 oplock)
267 struct dentry *dentry = file->f_path.dentry;
268 struct inode *inode = dentry->d_inode;
269 struct cifsInodeInfo *cinode = CIFS_I(inode);
270 struct cifsFileInfo *cfile;
271 struct cifs_fid_locks *fdlocks;
272 struct cifs_tcon *tcon = tlink_tcon(tlink);
273 struct TCP_Server_Info *server = tcon->ses->server;
275 cfile = kzalloc(sizeof(struct cifsFileInfo), GFP_KERNEL);
276 if (cfile == NULL)
277 return cfile;
279 fdlocks = kzalloc(sizeof(struct cifs_fid_locks), GFP_KERNEL);
280 if (!fdlocks) {
281 kfree(cfile);
282 return NULL;
285 INIT_LIST_HEAD(&fdlocks->locks);
286 fdlocks->cfile = cfile;
287 cfile->llist = fdlocks;
288 down_write(&cinode->lock_sem);
289 list_add(&fdlocks->llist, &cinode->llist);
290 up_write(&cinode->lock_sem);
292 cfile->count = 1;
293 cfile->pid = current->tgid;
294 cfile->uid = current_fsuid();
295 cfile->dentry = dget(dentry);
296 cfile->f_flags = file->f_flags;
297 cfile->invalidHandle = false;
298 cfile->tlink = cifs_get_tlink(tlink);
299 INIT_WORK(&cfile->oplock_break, cifs_oplock_break);
300 mutex_init(&cfile->fh_mutex);
302 cifs_sb_active(inode->i_sb);
305 * If the server returned a read oplock and we have mandatory brlocks,
306 * set oplock level to None.
308 if (oplock == server->vals->oplock_read &&
309 cifs_has_mand_locks(cinode)) {
310 cifs_dbg(FYI, "Reset oplock val from read to None due to mand locks\n");
311 oplock = 0;
314 spin_lock(&cifs_file_list_lock);
315 if (fid->pending_open->oplock != CIFS_OPLOCK_NO_CHANGE && oplock)
316 oplock = fid->pending_open->oplock;
317 list_del(&fid->pending_open->olist);
319 server->ops->set_fid(cfile, fid, oplock);
321 list_add(&cfile->tlist, &tcon->openFileList);
322 /* if readable file instance put first in list*/
323 if (file->f_mode & FMODE_READ)
324 list_add(&cfile->flist, &cinode->openFileList);
325 else
326 list_add_tail(&cfile->flist, &cinode->openFileList);
327 spin_unlock(&cifs_file_list_lock);
329 file->private_data = cfile;
330 return cfile;
333 struct cifsFileInfo *
334 cifsFileInfo_get(struct cifsFileInfo *cifs_file)
336 spin_lock(&cifs_file_list_lock);
337 cifsFileInfo_get_locked(cifs_file);
338 spin_unlock(&cifs_file_list_lock);
339 return cifs_file;
343 * Release a reference on the file private data. This may involve closing
344 * the filehandle out on the server. Must be called without holding
345 * cifs_file_list_lock.
347 void cifsFileInfo_put(struct cifsFileInfo *cifs_file)
349 struct inode *inode = cifs_file->dentry->d_inode;
350 struct cifs_tcon *tcon = tlink_tcon(cifs_file->tlink);
351 struct TCP_Server_Info *server = tcon->ses->server;
352 struct cifsInodeInfo *cifsi = CIFS_I(inode);
353 struct super_block *sb = inode->i_sb;
354 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
355 struct cifsLockInfo *li, *tmp;
356 struct cifs_fid fid;
357 struct cifs_pending_open open;
359 spin_lock(&cifs_file_list_lock);
360 if (--cifs_file->count > 0) {
361 spin_unlock(&cifs_file_list_lock);
362 return;
365 if (server->ops->get_lease_key)
366 server->ops->get_lease_key(inode, &fid);
368 /* store open in pending opens to make sure we don't miss lease break */
369 cifs_add_pending_open_locked(&fid, cifs_file->tlink, &open);
371 /* remove it from the lists */
372 list_del(&cifs_file->flist);
373 list_del(&cifs_file->tlist);
375 if (list_empty(&cifsi->openFileList)) {
376 cifs_dbg(FYI, "closing last open instance for inode %p\n",
377 cifs_file->dentry->d_inode);
379 * In strict cache mode we need invalidate mapping on the last
380 * close because it may cause a error when we open this file
381 * again and get at least level II oplock.
383 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO)
384 CIFS_I(inode)->invalid_mapping = true;
385 cifs_set_oplock_level(cifsi, 0);
387 spin_unlock(&cifs_file_list_lock);
389 cancel_work_sync(&cifs_file->oplock_break);
391 if (!tcon->need_reconnect && !cifs_file->invalidHandle) {
392 struct TCP_Server_Info *server = tcon->ses->server;
393 unsigned int xid;
395 xid = get_xid();
396 if (server->ops->close)
397 server->ops->close(xid, tcon, &cifs_file->fid);
398 _free_xid(xid);
401 cifs_del_pending_open(&open);
404 * Delete any outstanding lock records. We'll lose them when the file
405 * is closed anyway.
407 down_write(&cifsi->lock_sem);
408 list_for_each_entry_safe(li, tmp, &cifs_file->llist->locks, llist) {
409 list_del(&li->llist);
410 cifs_del_lock_waiters(li);
411 kfree(li);
413 list_del(&cifs_file->llist->llist);
414 kfree(cifs_file->llist);
415 up_write(&cifsi->lock_sem);
417 cifs_put_tlink(cifs_file->tlink);
418 dput(cifs_file->dentry);
419 cifs_sb_deactive(sb);
420 kfree(cifs_file);
423 int cifs_open(struct inode *inode, struct file *file)
426 int rc = -EACCES;
427 unsigned int xid;
428 __u32 oplock;
429 struct cifs_sb_info *cifs_sb;
430 struct TCP_Server_Info *server;
431 struct cifs_tcon *tcon;
432 struct tcon_link *tlink;
433 struct cifsFileInfo *cfile = NULL;
434 char *full_path = NULL;
435 bool posix_open_ok = false;
436 struct cifs_fid fid;
437 struct cifs_pending_open open;
439 xid = get_xid();
441 cifs_sb = CIFS_SB(inode->i_sb);
442 tlink = cifs_sb_tlink(cifs_sb);
443 if (IS_ERR(tlink)) {
444 free_xid(xid);
445 return PTR_ERR(tlink);
447 tcon = tlink_tcon(tlink);
448 server = tcon->ses->server;
450 full_path = build_path_from_dentry(file->f_path.dentry);
451 if (full_path == NULL) {
452 rc = -ENOMEM;
453 goto out;
456 cifs_dbg(FYI, "inode = 0x%p file flags are 0x%x for %s\n",
457 inode, file->f_flags, full_path);
459 if (server->oplocks)
460 oplock = REQ_OPLOCK;
461 else
462 oplock = 0;
464 if (!tcon->broken_posix_open && tcon->unix_ext &&
465 cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &
466 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
467 /* can not refresh inode info since size could be stale */
468 rc = cifs_posix_open(full_path, &inode, inode->i_sb,
469 cifs_sb->mnt_file_mode /* ignored */,
470 file->f_flags, &oplock, &fid.netfid, xid);
471 if (rc == 0) {
472 cifs_dbg(FYI, "posix open succeeded\n");
473 posix_open_ok = true;
474 } else if ((rc == -EINVAL) || (rc == -EOPNOTSUPP)) {
475 if (tcon->ses->serverNOS)
476 cifs_dbg(VFS, "server %s of type %s returned unexpected error on SMB posix open, disabling posix open support. Check if server update available.\n",
477 tcon->ses->serverName,
478 tcon->ses->serverNOS);
479 tcon->broken_posix_open = true;
480 } else if ((rc != -EIO) && (rc != -EREMOTE) &&
481 (rc != -EOPNOTSUPP)) /* path not found or net err */
482 goto out;
484 * Else fallthrough to retry open the old way on network i/o
485 * or DFS errors.
489 if (server->ops->get_lease_key)
490 server->ops->get_lease_key(inode, &fid);
492 cifs_add_pending_open(&fid, tlink, &open);
494 if (!posix_open_ok) {
495 if (server->ops->get_lease_key)
496 server->ops->get_lease_key(inode, &fid);
498 rc = cifs_nt_open(full_path, inode, cifs_sb, tcon,
499 file->f_flags, &oplock, &fid, xid);
500 if (rc) {
501 cifs_del_pending_open(&open);
502 goto out;
506 cfile = cifs_new_fileinfo(&fid, file, tlink, oplock);
507 if (cfile == NULL) {
508 if (server->ops->close)
509 server->ops->close(xid, tcon, &fid);
510 cifs_del_pending_open(&open);
511 rc = -ENOMEM;
512 goto out;
515 cifs_fscache_set_inode_cookie(inode, file);
517 if ((oplock & CIFS_CREATE_ACTION) && !posix_open_ok && tcon->unix_ext) {
519 * Time to set mode which we can not set earlier due to
520 * problems creating new read-only files.
522 struct cifs_unix_set_info_args args = {
523 .mode = inode->i_mode,
524 .uid = INVALID_UID, /* no change */
525 .gid = INVALID_GID, /* no change */
526 .ctime = NO_CHANGE_64,
527 .atime = NO_CHANGE_64,
528 .mtime = NO_CHANGE_64,
529 .device = 0,
531 CIFSSMBUnixSetFileInfo(xid, tcon, &args, fid.netfid,
532 cfile->pid);
535 out:
536 kfree(full_path);
537 free_xid(xid);
538 cifs_put_tlink(tlink);
539 return rc;
542 static int cifs_push_posix_locks(struct cifsFileInfo *cfile);
545 * Try to reacquire byte range locks that were released when session
546 * to server was lost.
548 static int
549 cifs_relock_file(struct cifsFileInfo *cfile)
551 struct cifs_sb_info *cifs_sb = CIFS_SB(cfile->dentry->d_sb);
552 struct cifsInodeInfo *cinode = CIFS_I(cfile->dentry->d_inode);
553 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
554 int rc = 0;
556 /* we are going to update can_cache_brlcks here - need a write access */
557 down_write(&cinode->lock_sem);
558 if (cinode->can_cache_brlcks) {
559 /* can cache locks - no need to push them */
560 up_write(&cinode->lock_sem);
561 return rc;
564 if (cap_unix(tcon->ses) &&
565 (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) &&
566 ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0))
567 rc = cifs_push_posix_locks(cfile);
568 else
569 rc = tcon->ses->server->ops->push_mand_locks(cfile);
571 up_write(&cinode->lock_sem);
572 return rc;
575 static int
576 cifs_reopen_file(struct cifsFileInfo *cfile, bool can_flush)
578 int rc = -EACCES;
579 unsigned int xid;
580 __u32 oplock;
581 struct cifs_sb_info *cifs_sb;
582 struct cifs_tcon *tcon;
583 struct TCP_Server_Info *server;
584 struct cifsInodeInfo *cinode;
585 struct inode *inode;
586 char *full_path = NULL;
587 int desired_access;
588 int disposition = FILE_OPEN;
589 int create_options = CREATE_NOT_DIR;
590 struct cifs_fid fid;
592 xid = get_xid();
593 mutex_lock(&cfile->fh_mutex);
594 if (!cfile->invalidHandle) {
595 mutex_unlock(&cfile->fh_mutex);
596 rc = 0;
597 free_xid(xid);
598 return rc;
601 inode = cfile->dentry->d_inode;
602 cifs_sb = CIFS_SB(inode->i_sb);
603 tcon = tlink_tcon(cfile->tlink);
604 server = tcon->ses->server;
607 * Can not grab rename sem here because various ops, including those
608 * that already have the rename sem can end up causing writepage to get
609 * called and if the server was down that means we end up here, and we
610 * can never tell if the caller already has the rename_sem.
612 full_path = build_path_from_dentry(cfile->dentry);
613 if (full_path == NULL) {
614 rc = -ENOMEM;
615 mutex_unlock(&cfile->fh_mutex);
616 free_xid(xid);
617 return rc;
620 cifs_dbg(FYI, "inode = 0x%p file flags 0x%x for %s\n",
621 inode, cfile->f_flags, full_path);
623 if (tcon->ses->server->oplocks)
624 oplock = REQ_OPLOCK;
625 else
626 oplock = 0;
628 if (tcon->unix_ext && cap_unix(tcon->ses) &&
629 (CIFS_UNIX_POSIX_PATH_OPS_CAP &
630 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
632 * O_CREAT, O_EXCL and O_TRUNC already had their effect on the
633 * original open. Must mask them off for a reopen.
635 unsigned int oflags = cfile->f_flags &
636 ~(O_CREAT | O_EXCL | O_TRUNC);
638 rc = cifs_posix_open(full_path, NULL, inode->i_sb,
639 cifs_sb->mnt_file_mode /* ignored */,
640 oflags, &oplock, &fid.netfid, xid);
641 if (rc == 0) {
642 cifs_dbg(FYI, "posix reopen succeeded\n");
643 goto reopen_success;
646 * fallthrough to retry open the old way on errors, especially
647 * in the reconnect path it is important to retry hard
651 desired_access = cifs_convert_flags(cfile->f_flags);
653 if (backup_cred(cifs_sb))
654 create_options |= CREATE_OPEN_BACKUP_INTENT;
656 if (server->ops->get_lease_key)
657 server->ops->get_lease_key(inode, &fid);
660 * Can not refresh inode by passing in file_info buf to be returned by
661 * CIFSSMBOpen and then calling get_inode_info with returned buf since
662 * file might have write behind data that needs to be flushed and server
663 * version of file size can be stale. If we knew for sure that inode was
664 * not dirty locally we could do this.
666 rc = server->ops->open(xid, tcon, full_path, disposition,
667 desired_access, create_options, &fid, &oplock,
668 NULL, cifs_sb);
669 if (rc) {
670 mutex_unlock(&cfile->fh_mutex);
671 cifs_dbg(FYI, "cifs_reopen returned 0x%x\n", rc);
672 cifs_dbg(FYI, "oplock: %d\n", oplock);
673 goto reopen_error_exit;
676 reopen_success:
677 cfile->invalidHandle = false;
678 mutex_unlock(&cfile->fh_mutex);
679 cinode = CIFS_I(inode);
681 if (can_flush) {
682 rc = filemap_write_and_wait(inode->i_mapping);
683 mapping_set_error(inode->i_mapping, rc);
685 if (tcon->unix_ext)
686 rc = cifs_get_inode_info_unix(&inode, full_path,
687 inode->i_sb, xid);
688 else
689 rc = cifs_get_inode_info(&inode, full_path, NULL,
690 inode->i_sb, xid, NULL);
693 * Else we are writing out data to server already and could deadlock if
694 * we tried to flush data, and since we do not know if we have data that
695 * would invalidate the current end of file on the server we can not go
696 * to the server to get the new inode info.
699 server->ops->set_fid(cfile, &fid, oplock);
700 cifs_relock_file(cfile);
702 reopen_error_exit:
703 kfree(full_path);
704 free_xid(xid);
705 return rc;
708 int cifs_close(struct inode *inode, struct file *file)
710 if (file->private_data != NULL) {
711 cifsFileInfo_put(file->private_data);
712 file->private_data = NULL;
715 /* return code from the ->release op is always ignored */
716 return 0;
719 int cifs_closedir(struct inode *inode, struct file *file)
721 int rc = 0;
722 unsigned int xid;
723 struct cifsFileInfo *cfile = file->private_data;
724 struct cifs_tcon *tcon;
725 struct TCP_Server_Info *server;
726 char *buf;
728 cifs_dbg(FYI, "Closedir inode = 0x%p\n", inode);
730 if (cfile == NULL)
731 return rc;
733 xid = get_xid();
734 tcon = tlink_tcon(cfile->tlink);
735 server = tcon->ses->server;
737 cifs_dbg(FYI, "Freeing private data in close dir\n");
738 spin_lock(&cifs_file_list_lock);
739 if (!cfile->srch_inf.endOfSearch && !cfile->invalidHandle) {
740 cfile->invalidHandle = true;
741 spin_unlock(&cifs_file_list_lock);
742 if (server->ops->close_dir)
743 rc = server->ops->close_dir(xid, tcon, &cfile->fid);
744 else
745 rc = -ENOSYS;
746 cifs_dbg(FYI, "Closing uncompleted readdir with rc %d\n", rc);
747 /* not much we can do if it fails anyway, ignore rc */
748 rc = 0;
749 } else
750 spin_unlock(&cifs_file_list_lock);
752 buf = cfile->srch_inf.ntwrk_buf_start;
753 if (buf) {
754 cifs_dbg(FYI, "closedir free smb buf in srch struct\n");
755 cfile->srch_inf.ntwrk_buf_start = NULL;
756 if (cfile->srch_inf.smallBuf)
757 cifs_small_buf_release(buf);
758 else
759 cifs_buf_release(buf);
762 cifs_put_tlink(cfile->tlink);
763 kfree(file->private_data);
764 file->private_data = NULL;
765 /* BB can we lock the filestruct while this is going on? */
766 free_xid(xid);
767 return rc;
770 static struct cifsLockInfo *
771 cifs_lock_init(__u64 offset, __u64 length, __u8 type)
773 struct cifsLockInfo *lock =
774 kmalloc(sizeof(struct cifsLockInfo), GFP_KERNEL);
775 if (!lock)
776 return lock;
777 lock->offset = offset;
778 lock->length = length;
779 lock->type = type;
780 lock->pid = current->tgid;
781 INIT_LIST_HEAD(&lock->blist);
782 init_waitqueue_head(&lock->block_q);
783 return lock;
786 void
787 cifs_del_lock_waiters(struct cifsLockInfo *lock)
789 struct cifsLockInfo *li, *tmp;
790 list_for_each_entry_safe(li, tmp, &lock->blist, blist) {
791 list_del_init(&li->blist);
792 wake_up(&li->block_q);
796 #define CIFS_LOCK_OP 0
797 #define CIFS_READ_OP 1
798 #define CIFS_WRITE_OP 2
800 /* @rw_check : 0 - no op, 1 - read, 2 - write */
801 static bool
802 cifs_find_fid_lock_conflict(struct cifs_fid_locks *fdlocks, __u64 offset,
803 __u64 length, __u8 type, struct cifsFileInfo *cfile,
804 struct cifsLockInfo **conf_lock, int rw_check)
806 struct cifsLockInfo *li;
807 struct cifsFileInfo *cur_cfile = fdlocks->cfile;
808 struct TCP_Server_Info *server = tlink_tcon(cfile->tlink)->ses->server;
810 list_for_each_entry(li, &fdlocks->locks, llist) {
811 if (offset + length <= li->offset ||
812 offset >= li->offset + li->length)
813 continue;
814 if (rw_check != CIFS_LOCK_OP && current->tgid == li->pid &&
815 server->ops->compare_fids(cfile, cur_cfile)) {
816 /* shared lock prevents write op through the same fid */
817 if (!(li->type & server->vals->shared_lock_type) ||
818 rw_check != CIFS_WRITE_OP)
819 continue;
821 if ((type & server->vals->shared_lock_type) &&
822 ((server->ops->compare_fids(cfile, cur_cfile) &&
823 current->tgid == li->pid) || type == li->type))
824 continue;
825 if (conf_lock)
826 *conf_lock = li;
827 return true;
829 return false;
832 bool
833 cifs_find_lock_conflict(struct cifsFileInfo *cfile, __u64 offset, __u64 length,
834 __u8 type, struct cifsLockInfo **conf_lock,
835 int rw_check)
837 bool rc = false;
838 struct cifs_fid_locks *cur;
839 struct cifsInodeInfo *cinode = CIFS_I(cfile->dentry->d_inode);
841 list_for_each_entry(cur, &cinode->llist, llist) {
842 rc = cifs_find_fid_lock_conflict(cur, offset, length, type,
843 cfile, conf_lock, rw_check);
844 if (rc)
845 break;
848 return rc;
852 * Check if there is another lock that prevents us to set the lock (mandatory
853 * style). If such a lock exists, update the flock structure with its
854 * properties. Otherwise, set the flock type to F_UNLCK if we can cache brlocks
855 * or leave it the same if we can't. Returns 0 if we don't need to request to
856 * the server or 1 otherwise.
858 static int
859 cifs_lock_test(struct cifsFileInfo *cfile, __u64 offset, __u64 length,
860 __u8 type, struct file_lock *flock)
862 int rc = 0;
863 struct cifsLockInfo *conf_lock;
864 struct cifsInodeInfo *cinode = CIFS_I(cfile->dentry->d_inode);
865 struct TCP_Server_Info *server = tlink_tcon(cfile->tlink)->ses->server;
866 bool exist;
868 down_read(&cinode->lock_sem);
870 exist = cifs_find_lock_conflict(cfile, offset, length, type,
871 &conf_lock, CIFS_LOCK_OP);
872 if (exist) {
873 flock->fl_start = conf_lock->offset;
874 flock->fl_end = conf_lock->offset + conf_lock->length - 1;
875 flock->fl_pid = conf_lock->pid;
876 if (conf_lock->type & server->vals->shared_lock_type)
877 flock->fl_type = F_RDLCK;
878 else
879 flock->fl_type = F_WRLCK;
880 } else if (!cinode->can_cache_brlcks)
881 rc = 1;
882 else
883 flock->fl_type = F_UNLCK;
885 up_read(&cinode->lock_sem);
886 return rc;
889 static void
890 cifs_lock_add(struct cifsFileInfo *cfile, struct cifsLockInfo *lock)
892 struct cifsInodeInfo *cinode = CIFS_I(cfile->dentry->d_inode);
893 down_write(&cinode->lock_sem);
894 list_add_tail(&lock->llist, &cfile->llist->locks);
895 up_write(&cinode->lock_sem);
899 * Set the byte-range lock (mandatory style). Returns:
900 * 1) 0, if we set the lock and don't need to request to the server;
901 * 2) 1, if no locks prevent us but we need to request to the server;
902 * 3) -EACCESS, if there is a lock that prevents us and wait is false.
904 static int
905 cifs_lock_add_if(struct cifsFileInfo *cfile, struct cifsLockInfo *lock,
906 bool wait)
908 struct cifsLockInfo *conf_lock;
909 struct cifsInodeInfo *cinode = CIFS_I(cfile->dentry->d_inode);
910 bool exist;
911 int rc = 0;
913 try_again:
914 exist = false;
915 down_write(&cinode->lock_sem);
917 exist = cifs_find_lock_conflict(cfile, lock->offset, lock->length,
918 lock->type, &conf_lock, CIFS_LOCK_OP);
919 if (!exist && cinode->can_cache_brlcks) {
920 list_add_tail(&lock->llist, &cfile->llist->locks);
921 up_write(&cinode->lock_sem);
922 return rc;
925 if (!exist)
926 rc = 1;
927 else if (!wait)
928 rc = -EACCES;
929 else {
930 list_add_tail(&lock->blist, &conf_lock->blist);
931 up_write(&cinode->lock_sem);
932 rc = wait_event_interruptible(lock->block_q,
933 (lock->blist.prev == &lock->blist) &&
934 (lock->blist.next == &lock->blist));
935 if (!rc)
936 goto try_again;
937 down_write(&cinode->lock_sem);
938 list_del_init(&lock->blist);
941 up_write(&cinode->lock_sem);
942 return rc;
946 * Check if there is another lock that prevents us to set the lock (posix
947 * style). If such a lock exists, update the flock structure with its
948 * properties. Otherwise, set the flock type to F_UNLCK if we can cache brlocks
949 * or leave it the same if we can't. Returns 0 if we don't need to request to
950 * the server or 1 otherwise.
952 static int
953 cifs_posix_lock_test(struct file *file, struct file_lock *flock)
955 int rc = 0;
956 struct cifsInodeInfo *cinode = CIFS_I(file_inode(file));
957 unsigned char saved_type = flock->fl_type;
959 if ((flock->fl_flags & FL_POSIX) == 0)
960 return 1;
962 down_read(&cinode->lock_sem);
963 posix_test_lock(file, flock);
965 if (flock->fl_type == F_UNLCK && !cinode->can_cache_brlcks) {
966 flock->fl_type = saved_type;
967 rc = 1;
970 up_read(&cinode->lock_sem);
971 return rc;
975 * Set the byte-range lock (posix style). Returns:
976 * 1) 0, if we set the lock and don't need to request to the server;
977 * 2) 1, if we need to request to the server;
978 * 3) <0, if the error occurs while setting the lock.
980 static int
981 cifs_posix_lock_set(struct file *file, struct file_lock *flock)
983 struct cifsInodeInfo *cinode = CIFS_I(file_inode(file));
984 int rc = 1;
986 if ((flock->fl_flags & FL_POSIX) == 0)
987 return rc;
989 try_again:
990 down_write(&cinode->lock_sem);
991 if (!cinode->can_cache_brlcks) {
992 up_write(&cinode->lock_sem);
993 return rc;
996 rc = posix_lock_file(file, flock, NULL);
997 up_write(&cinode->lock_sem);
998 if (rc == FILE_LOCK_DEFERRED) {
999 rc = wait_event_interruptible(flock->fl_wait, !flock->fl_next);
1000 if (!rc)
1001 goto try_again;
1002 locks_delete_block(flock);
1004 return rc;
1008 cifs_push_mandatory_locks(struct cifsFileInfo *cfile)
1010 unsigned int xid;
1011 int rc = 0, stored_rc;
1012 struct cifsLockInfo *li, *tmp;
1013 struct cifs_tcon *tcon;
1014 unsigned int num, max_num, max_buf;
1015 LOCKING_ANDX_RANGE *buf, *cur;
1016 int types[] = {LOCKING_ANDX_LARGE_FILES,
1017 LOCKING_ANDX_SHARED_LOCK | LOCKING_ANDX_LARGE_FILES};
1018 int i;
1020 xid = get_xid();
1021 tcon = tlink_tcon(cfile->tlink);
1024 * Accessing maxBuf is racy with cifs_reconnect - need to store value
1025 * and check it for zero before using.
1027 max_buf = tcon->ses->server->maxBuf;
1028 if (!max_buf) {
1029 free_xid(xid);
1030 return -EINVAL;
1033 max_num = (max_buf - sizeof(struct smb_hdr)) /
1034 sizeof(LOCKING_ANDX_RANGE);
1035 buf = kzalloc(max_num * sizeof(LOCKING_ANDX_RANGE), GFP_KERNEL);
1036 if (!buf) {
1037 free_xid(xid);
1038 return -ENOMEM;
1041 for (i = 0; i < 2; i++) {
1042 cur = buf;
1043 num = 0;
1044 list_for_each_entry_safe(li, tmp, &cfile->llist->locks, llist) {
1045 if (li->type != types[i])
1046 continue;
1047 cur->Pid = cpu_to_le16(li->pid);
1048 cur->LengthLow = cpu_to_le32((u32)li->length);
1049 cur->LengthHigh = cpu_to_le32((u32)(li->length>>32));
1050 cur->OffsetLow = cpu_to_le32((u32)li->offset);
1051 cur->OffsetHigh = cpu_to_le32((u32)(li->offset>>32));
1052 if (++num == max_num) {
1053 stored_rc = cifs_lockv(xid, tcon,
1054 cfile->fid.netfid,
1055 (__u8)li->type, 0, num,
1056 buf);
1057 if (stored_rc)
1058 rc = stored_rc;
1059 cur = buf;
1060 num = 0;
1061 } else
1062 cur++;
1065 if (num) {
1066 stored_rc = cifs_lockv(xid, tcon, cfile->fid.netfid,
1067 (__u8)types[i], 0, num, buf);
1068 if (stored_rc)
1069 rc = stored_rc;
1073 kfree(buf);
1074 free_xid(xid);
1075 return rc;
1078 /* copied from fs/locks.c with a name change */
1079 #define cifs_for_each_lock(inode, lockp) \
1080 for (lockp = &inode->i_flock; *lockp != NULL; \
1081 lockp = &(*lockp)->fl_next)
1083 struct lock_to_push {
1084 struct list_head llist;
1085 __u64 offset;
1086 __u64 length;
1087 __u32 pid;
1088 __u16 netfid;
1089 __u8 type;
1092 static int
1093 cifs_push_posix_locks(struct cifsFileInfo *cfile)
1095 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
1096 struct file_lock *flock, **before;
1097 unsigned int count = 0, i = 0;
1098 int rc = 0, xid, type;
1099 struct list_head locks_to_send, *el;
1100 struct lock_to_push *lck, *tmp;
1101 __u64 length;
1103 xid = get_xid();
1105 lock_flocks();
1106 cifs_for_each_lock(cfile->dentry->d_inode, before) {
1107 if ((*before)->fl_flags & FL_POSIX)
1108 count++;
1110 unlock_flocks();
1112 INIT_LIST_HEAD(&locks_to_send);
1115 * Allocating count locks is enough because no FL_POSIX locks can be
1116 * added to the list while we are holding cinode->lock_sem that
1117 * protects locking operations of this inode.
1119 for (; i < count; i++) {
1120 lck = kmalloc(sizeof(struct lock_to_push), GFP_KERNEL);
1121 if (!lck) {
1122 rc = -ENOMEM;
1123 goto err_out;
1125 list_add_tail(&lck->llist, &locks_to_send);
1128 el = locks_to_send.next;
1129 lock_flocks();
1130 cifs_for_each_lock(cfile->dentry->d_inode, before) {
1131 flock = *before;
1132 if ((flock->fl_flags & FL_POSIX) == 0)
1133 continue;
1134 if (el == &locks_to_send) {
1136 * The list ended. We don't have enough allocated
1137 * structures - something is really wrong.
1139 cifs_dbg(VFS, "Can't push all brlocks!\n");
1140 break;
1142 length = 1 + flock->fl_end - flock->fl_start;
1143 if (flock->fl_type == F_RDLCK || flock->fl_type == F_SHLCK)
1144 type = CIFS_RDLCK;
1145 else
1146 type = CIFS_WRLCK;
1147 lck = list_entry(el, struct lock_to_push, llist);
1148 lck->pid = flock->fl_pid;
1149 lck->netfid = cfile->fid.netfid;
1150 lck->length = length;
1151 lck->type = type;
1152 lck->offset = flock->fl_start;
1153 el = el->next;
1155 unlock_flocks();
1157 list_for_each_entry_safe(lck, tmp, &locks_to_send, llist) {
1158 int stored_rc;
1160 stored_rc = CIFSSMBPosixLock(xid, tcon, lck->netfid, lck->pid,
1161 lck->offset, lck->length, NULL,
1162 lck->type, 0);
1163 if (stored_rc)
1164 rc = stored_rc;
1165 list_del(&lck->llist);
1166 kfree(lck);
1169 out:
1170 free_xid(xid);
1171 return rc;
1172 err_out:
1173 list_for_each_entry_safe(lck, tmp, &locks_to_send, llist) {
1174 list_del(&lck->llist);
1175 kfree(lck);
1177 goto out;
1180 static int
1181 cifs_push_locks(struct cifsFileInfo *cfile)
1183 struct cifs_sb_info *cifs_sb = CIFS_SB(cfile->dentry->d_sb);
1184 struct cifsInodeInfo *cinode = CIFS_I(cfile->dentry->d_inode);
1185 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
1186 int rc = 0;
1188 /* we are going to update can_cache_brlcks here - need a write access */
1189 down_write(&cinode->lock_sem);
1190 if (!cinode->can_cache_brlcks) {
1191 up_write(&cinode->lock_sem);
1192 return rc;
1195 if (cap_unix(tcon->ses) &&
1196 (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) &&
1197 ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0))
1198 rc = cifs_push_posix_locks(cfile);
1199 else
1200 rc = tcon->ses->server->ops->push_mand_locks(cfile);
1202 cinode->can_cache_brlcks = false;
1203 up_write(&cinode->lock_sem);
1204 return rc;
1207 static void
1208 cifs_read_flock(struct file_lock *flock, __u32 *type, int *lock, int *unlock,
1209 bool *wait_flag, struct TCP_Server_Info *server)
1211 if (flock->fl_flags & FL_POSIX)
1212 cifs_dbg(FYI, "Posix\n");
1213 if (flock->fl_flags & FL_FLOCK)
1214 cifs_dbg(FYI, "Flock\n");
1215 if (flock->fl_flags & FL_SLEEP) {
1216 cifs_dbg(FYI, "Blocking lock\n");
1217 *wait_flag = true;
1219 if (flock->fl_flags & FL_ACCESS)
1220 cifs_dbg(FYI, "Process suspended by mandatory locking - not implemented yet\n");
1221 if (flock->fl_flags & FL_LEASE)
1222 cifs_dbg(FYI, "Lease on file - not implemented yet\n");
1223 if (flock->fl_flags &
1224 (~(FL_POSIX | FL_FLOCK | FL_SLEEP |
1225 FL_ACCESS | FL_LEASE | FL_CLOSE)))
1226 cifs_dbg(FYI, "Unknown lock flags 0x%x\n", flock->fl_flags);
1228 *type = server->vals->large_lock_type;
1229 if (flock->fl_type == F_WRLCK) {
1230 cifs_dbg(FYI, "F_WRLCK\n");
1231 *type |= server->vals->exclusive_lock_type;
1232 *lock = 1;
1233 } else if (flock->fl_type == F_UNLCK) {
1234 cifs_dbg(FYI, "F_UNLCK\n");
1235 *type |= server->vals->unlock_lock_type;
1236 *unlock = 1;
1237 /* Check if unlock includes more than one lock range */
1238 } else if (flock->fl_type == F_RDLCK) {
1239 cifs_dbg(FYI, "F_RDLCK\n");
1240 *type |= server->vals->shared_lock_type;
1241 *lock = 1;
1242 } else if (flock->fl_type == F_EXLCK) {
1243 cifs_dbg(FYI, "F_EXLCK\n");
1244 *type |= server->vals->exclusive_lock_type;
1245 *lock = 1;
1246 } else if (flock->fl_type == F_SHLCK) {
1247 cifs_dbg(FYI, "F_SHLCK\n");
1248 *type |= server->vals->shared_lock_type;
1249 *lock = 1;
1250 } else
1251 cifs_dbg(FYI, "Unknown type of lock\n");
1254 static int
1255 cifs_getlk(struct file *file, struct file_lock *flock, __u32 type,
1256 bool wait_flag, bool posix_lck, unsigned int xid)
1258 int rc = 0;
1259 __u64 length = 1 + flock->fl_end - flock->fl_start;
1260 struct cifsFileInfo *cfile = (struct cifsFileInfo *)file->private_data;
1261 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
1262 struct TCP_Server_Info *server = tcon->ses->server;
1263 __u16 netfid = cfile->fid.netfid;
1265 if (posix_lck) {
1266 int posix_lock_type;
1268 rc = cifs_posix_lock_test(file, flock);
1269 if (!rc)
1270 return rc;
1272 if (type & server->vals->shared_lock_type)
1273 posix_lock_type = CIFS_RDLCK;
1274 else
1275 posix_lock_type = CIFS_WRLCK;
1276 rc = CIFSSMBPosixLock(xid, tcon, netfid, current->tgid,
1277 flock->fl_start, length, flock,
1278 posix_lock_type, wait_flag);
1279 return rc;
1282 rc = cifs_lock_test(cfile, flock->fl_start, length, type, flock);
1283 if (!rc)
1284 return rc;
1286 /* BB we could chain these into one lock request BB */
1287 rc = server->ops->mand_lock(xid, cfile, flock->fl_start, length, type,
1288 1, 0, false);
1289 if (rc == 0) {
1290 rc = server->ops->mand_lock(xid, cfile, flock->fl_start, length,
1291 type, 0, 1, false);
1292 flock->fl_type = F_UNLCK;
1293 if (rc != 0)
1294 cifs_dbg(VFS, "Error unlocking previously locked range %d during test of lock\n",
1295 rc);
1296 return 0;
1299 if (type & server->vals->shared_lock_type) {
1300 flock->fl_type = F_WRLCK;
1301 return 0;
1304 type &= ~server->vals->exclusive_lock_type;
1306 rc = server->ops->mand_lock(xid, cfile, flock->fl_start, length,
1307 type | server->vals->shared_lock_type,
1308 1, 0, false);
1309 if (rc == 0) {
1310 rc = server->ops->mand_lock(xid, cfile, flock->fl_start, length,
1311 type | server->vals->shared_lock_type, 0, 1, false);
1312 flock->fl_type = F_RDLCK;
1313 if (rc != 0)
1314 cifs_dbg(VFS, "Error unlocking previously locked range %d during test of lock\n",
1315 rc);
1316 } else
1317 flock->fl_type = F_WRLCK;
1319 return 0;
1322 void
1323 cifs_move_llist(struct list_head *source, struct list_head *dest)
1325 struct list_head *li, *tmp;
1326 list_for_each_safe(li, tmp, source)
1327 list_move(li, dest);
1330 void
1331 cifs_free_llist(struct list_head *llist)
1333 struct cifsLockInfo *li, *tmp;
1334 list_for_each_entry_safe(li, tmp, llist, llist) {
1335 cifs_del_lock_waiters(li);
1336 list_del(&li->llist);
1337 kfree(li);
1342 cifs_unlock_range(struct cifsFileInfo *cfile, struct file_lock *flock,
1343 unsigned int xid)
1345 int rc = 0, stored_rc;
1346 int types[] = {LOCKING_ANDX_LARGE_FILES,
1347 LOCKING_ANDX_SHARED_LOCK | LOCKING_ANDX_LARGE_FILES};
1348 unsigned int i;
1349 unsigned int max_num, num, max_buf;
1350 LOCKING_ANDX_RANGE *buf, *cur;
1351 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
1352 struct cifsInodeInfo *cinode = CIFS_I(cfile->dentry->d_inode);
1353 struct cifsLockInfo *li, *tmp;
1354 __u64 length = 1 + flock->fl_end - flock->fl_start;
1355 struct list_head tmp_llist;
1357 INIT_LIST_HEAD(&tmp_llist);
1360 * Accessing maxBuf is racy with cifs_reconnect - need to store value
1361 * and check it for zero before using.
1363 max_buf = tcon->ses->server->maxBuf;
1364 if (!max_buf)
1365 return -EINVAL;
1367 max_num = (max_buf - sizeof(struct smb_hdr)) /
1368 sizeof(LOCKING_ANDX_RANGE);
1369 buf = kzalloc(max_num * sizeof(LOCKING_ANDX_RANGE), GFP_KERNEL);
1370 if (!buf)
1371 return -ENOMEM;
1373 down_write(&cinode->lock_sem);
1374 for (i = 0; i < 2; i++) {
1375 cur = buf;
1376 num = 0;
1377 list_for_each_entry_safe(li, tmp, &cfile->llist->locks, llist) {
1378 if (flock->fl_start > li->offset ||
1379 (flock->fl_start + length) <
1380 (li->offset + li->length))
1381 continue;
1382 if (current->tgid != li->pid)
1383 continue;
1384 if (types[i] != li->type)
1385 continue;
1386 if (cinode->can_cache_brlcks) {
1388 * We can cache brlock requests - simply remove
1389 * a lock from the file's list.
1391 list_del(&li->llist);
1392 cifs_del_lock_waiters(li);
1393 kfree(li);
1394 continue;
1396 cur->Pid = cpu_to_le16(li->pid);
1397 cur->LengthLow = cpu_to_le32((u32)li->length);
1398 cur->LengthHigh = cpu_to_le32((u32)(li->length>>32));
1399 cur->OffsetLow = cpu_to_le32((u32)li->offset);
1400 cur->OffsetHigh = cpu_to_le32((u32)(li->offset>>32));
1402 * We need to save a lock here to let us add it again to
1403 * the file's list if the unlock range request fails on
1404 * the server.
1406 list_move(&li->llist, &tmp_llist);
1407 if (++num == max_num) {
1408 stored_rc = cifs_lockv(xid, tcon,
1409 cfile->fid.netfid,
1410 li->type, num, 0, buf);
1411 if (stored_rc) {
1413 * We failed on the unlock range
1414 * request - add all locks from the tmp
1415 * list to the head of the file's list.
1417 cifs_move_llist(&tmp_llist,
1418 &cfile->llist->locks);
1419 rc = stored_rc;
1420 } else
1422 * The unlock range request succeed -
1423 * free the tmp list.
1425 cifs_free_llist(&tmp_llist);
1426 cur = buf;
1427 num = 0;
1428 } else
1429 cur++;
1431 if (num) {
1432 stored_rc = cifs_lockv(xid, tcon, cfile->fid.netfid,
1433 types[i], num, 0, buf);
1434 if (stored_rc) {
1435 cifs_move_llist(&tmp_llist,
1436 &cfile->llist->locks);
1437 rc = stored_rc;
1438 } else
1439 cifs_free_llist(&tmp_llist);
1443 up_write(&cinode->lock_sem);
1444 kfree(buf);
1445 return rc;
1448 static int
1449 cifs_setlk(struct file *file, struct file_lock *flock, __u32 type,
1450 bool wait_flag, bool posix_lck, int lock, int unlock,
1451 unsigned int xid)
1453 int rc = 0;
1454 __u64 length = 1 + flock->fl_end - flock->fl_start;
1455 struct cifsFileInfo *cfile = (struct cifsFileInfo *)file->private_data;
1456 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
1457 struct TCP_Server_Info *server = tcon->ses->server;
1458 struct inode *inode = cfile->dentry->d_inode;
1460 if (posix_lck) {
1461 int posix_lock_type;
1463 rc = cifs_posix_lock_set(file, flock);
1464 if (!rc || rc < 0)
1465 return rc;
1467 if (type & server->vals->shared_lock_type)
1468 posix_lock_type = CIFS_RDLCK;
1469 else
1470 posix_lock_type = CIFS_WRLCK;
1472 if (unlock == 1)
1473 posix_lock_type = CIFS_UNLCK;
1475 rc = CIFSSMBPosixLock(xid, tcon, cfile->fid.netfid,
1476 current->tgid, flock->fl_start, length,
1477 NULL, posix_lock_type, wait_flag);
1478 goto out;
1481 if (lock) {
1482 struct cifsLockInfo *lock;
1484 lock = cifs_lock_init(flock->fl_start, length, type);
1485 if (!lock)
1486 return -ENOMEM;
1488 rc = cifs_lock_add_if(cfile, lock, wait_flag);
1489 if (rc < 0) {
1490 kfree(lock);
1491 return rc;
1493 if (!rc)
1494 goto out;
1497 * Windows 7 server can delay breaking lease from read to None
1498 * if we set a byte-range lock on a file - break it explicitly
1499 * before sending the lock to the server to be sure the next
1500 * read won't conflict with non-overlapted locks due to
1501 * pagereading.
1503 if (!CIFS_I(inode)->clientCanCacheAll &&
1504 CIFS_I(inode)->clientCanCacheRead) {
1505 cifs_invalidate_mapping(inode);
1506 cifs_dbg(FYI, "Set no oplock for inode=%p due to mand locks\n",
1507 inode);
1508 CIFS_I(inode)->clientCanCacheRead = false;
1511 rc = server->ops->mand_lock(xid, cfile, flock->fl_start, length,
1512 type, 1, 0, wait_flag);
1513 if (rc) {
1514 kfree(lock);
1515 return rc;
1518 cifs_lock_add(cfile, lock);
1519 } else if (unlock)
1520 rc = server->ops->mand_unlock_range(cfile, flock, xid);
1522 out:
1523 if (flock->fl_flags & FL_POSIX)
1524 posix_lock_file_wait(file, flock);
1525 return rc;
1528 int cifs_lock(struct file *file, int cmd, struct file_lock *flock)
1530 int rc, xid;
1531 int lock = 0, unlock = 0;
1532 bool wait_flag = false;
1533 bool posix_lck = false;
1534 struct cifs_sb_info *cifs_sb;
1535 struct cifs_tcon *tcon;
1536 struct cifsInodeInfo *cinode;
1537 struct cifsFileInfo *cfile;
1538 __u16 netfid;
1539 __u32 type;
1541 rc = -EACCES;
1542 xid = get_xid();
1544 cifs_dbg(FYI, "Lock parm: 0x%x flockflags: 0x%x flocktype: 0x%x start: %lld end: %lld\n",
1545 cmd, flock->fl_flags, flock->fl_type,
1546 flock->fl_start, flock->fl_end);
1548 cfile = (struct cifsFileInfo *)file->private_data;
1549 tcon = tlink_tcon(cfile->tlink);
1551 cifs_read_flock(flock, &type, &lock, &unlock, &wait_flag,
1552 tcon->ses->server);
1554 cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
1555 netfid = cfile->fid.netfid;
1556 cinode = CIFS_I(file_inode(file));
1558 if (cap_unix(tcon->ses) &&
1559 (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) &&
1560 ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0))
1561 posix_lck = true;
1563 * BB add code here to normalize offset and length to account for
1564 * negative length which we can not accept over the wire.
1566 if (IS_GETLK(cmd)) {
1567 rc = cifs_getlk(file, flock, type, wait_flag, posix_lck, xid);
1568 free_xid(xid);
1569 return rc;
1572 if (!lock && !unlock) {
1574 * if no lock or unlock then nothing to do since we do not
1575 * know what it is
1577 free_xid(xid);
1578 return -EOPNOTSUPP;
1581 rc = cifs_setlk(file, flock, type, wait_flag, posix_lck, lock, unlock,
1582 xid);
1583 free_xid(xid);
1584 return rc;
1588 * update the file size (if needed) after a write. Should be called with
1589 * the inode->i_lock held
1591 void
1592 cifs_update_eof(struct cifsInodeInfo *cifsi, loff_t offset,
1593 unsigned int bytes_written)
1595 loff_t end_of_write = offset + bytes_written;
1597 if (end_of_write > cifsi->server_eof)
1598 cifsi->server_eof = end_of_write;
1601 static ssize_t
1602 cifs_write(struct cifsFileInfo *open_file, __u32 pid, const char *write_data,
1603 size_t write_size, loff_t *offset)
1605 int rc = 0;
1606 unsigned int bytes_written = 0;
1607 unsigned int total_written;
1608 struct cifs_sb_info *cifs_sb;
1609 struct cifs_tcon *tcon;
1610 struct TCP_Server_Info *server;
1611 unsigned int xid;
1612 struct dentry *dentry = open_file->dentry;
1613 struct cifsInodeInfo *cifsi = CIFS_I(dentry->d_inode);
1614 struct cifs_io_parms io_parms;
1616 cifs_sb = CIFS_SB(dentry->d_sb);
1618 cifs_dbg(FYI, "write %zd bytes to offset %lld of %s\n",
1619 write_size, *offset, dentry->d_name.name);
1621 tcon = tlink_tcon(open_file->tlink);
1622 server = tcon->ses->server;
1624 if (!server->ops->sync_write)
1625 return -ENOSYS;
1627 xid = get_xid();
1629 for (total_written = 0; write_size > total_written;
1630 total_written += bytes_written) {
1631 rc = -EAGAIN;
1632 while (rc == -EAGAIN) {
1633 struct kvec iov[2];
1634 unsigned int len;
1636 if (open_file->invalidHandle) {
1637 /* we could deadlock if we called
1638 filemap_fdatawait from here so tell
1639 reopen_file not to flush data to
1640 server now */
1641 rc = cifs_reopen_file(open_file, false);
1642 if (rc != 0)
1643 break;
1646 len = min((size_t)cifs_sb->wsize,
1647 write_size - total_written);
1648 /* iov[0] is reserved for smb header */
1649 iov[1].iov_base = (char *)write_data + total_written;
1650 iov[1].iov_len = len;
1651 io_parms.pid = pid;
1652 io_parms.tcon = tcon;
1653 io_parms.offset = *offset;
1654 io_parms.length = len;
1655 rc = server->ops->sync_write(xid, open_file, &io_parms,
1656 &bytes_written, iov, 1);
1658 if (rc || (bytes_written == 0)) {
1659 if (total_written)
1660 break;
1661 else {
1662 free_xid(xid);
1663 return rc;
1665 } else {
1666 spin_lock(&dentry->d_inode->i_lock);
1667 cifs_update_eof(cifsi, *offset, bytes_written);
1668 spin_unlock(&dentry->d_inode->i_lock);
1669 *offset += bytes_written;
1673 cifs_stats_bytes_written(tcon, total_written);
1675 if (total_written > 0) {
1676 spin_lock(&dentry->d_inode->i_lock);
1677 if (*offset > dentry->d_inode->i_size)
1678 i_size_write(dentry->d_inode, *offset);
1679 spin_unlock(&dentry->d_inode->i_lock);
1681 mark_inode_dirty_sync(dentry->d_inode);
1682 free_xid(xid);
1683 return total_written;
1686 struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *cifs_inode,
1687 bool fsuid_only)
1689 struct cifsFileInfo *open_file = NULL;
1690 struct cifs_sb_info *cifs_sb = CIFS_SB(cifs_inode->vfs_inode.i_sb);
1692 /* only filter by fsuid on multiuser mounts */
1693 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
1694 fsuid_only = false;
1696 spin_lock(&cifs_file_list_lock);
1697 /* we could simply get the first_list_entry since write-only entries
1698 are always at the end of the list but since the first entry might
1699 have a close pending, we go through the whole list */
1700 list_for_each_entry(open_file, &cifs_inode->openFileList, flist) {
1701 if (fsuid_only && !uid_eq(open_file->uid, current_fsuid()))
1702 continue;
1703 if (OPEN_FMODE(open_file->f_flags) & FMODE_READ) {
1704 if (!open_file->invalidHandle) {
1705 /* found a good file */
1706 /* lock it so it will not be closed on us */
1707 cifsFileInfo_get_locked(open_file);
1708 spin_unlock(&cifs_file_list_lock);
1709 return open_file;
1710 } /* else might as well continue, and look for
1711 another, or simply have the caller reopen it
1712 again rather than trying to fix this handle */
1713 } else /* write only file */
1714 break; /* write only files are last so must be done */
1716 spin_unlock(&cifs_file_list_lock);
1717 return NULL;
1720 struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *cifs_inode,
1721 bool fsuid_only)
1723 struct cifsFileInfo *open_file, *inv_file = NULL;
1724 struct cifs_sb_info *cifs_sb;
1725 bool any_available = false;
1726 int rc;
1727 unsigned int refind = 0;
1729 /* Having a null inode here (because mapping->host was set to zero by
1730 the VFS or MM) should not happen but we had reports of on oops (due to
1731 it being zero) during stress testcases so we need to check for it */
1733 if (cifs_inode == NULL) {
1734 cifs_dbg(VFS, "Null inode passed to cifs_writeable_file\n");
1735 dump_stack();
1736 return NULL;
1739 cifs_sb = CIFS_SB(cifs_inode->vfs_inode.i_sb);
1741 /* only filter by fsuid on multiuser mounts */
1742 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
1743 fsuid_only = false;
1745 spin_lock(&cifs_file_list_lock);
1746 refind_writable:
1747 if (refind > MAX_REOPEN_ATT) {
1748 spin_unlock(&cifs_file_list_lock);
1749 return NULL;
1751 list_for_each_entry(open_file, &cifs_inode->openFileList, flist) {
1752 if (!any_available && open_file->pid != current->tgid)
1753 continue;
1754 if (fsuid_only && !uid_eq(open_file->uid, current_fsuid()))
1755 continue;
1756 if (OPEN_FMODE(open_file->f_flags) & FMODE_WRITE) {
1757 if (!open_file->invalidHandle) {
1758 /* found a good writable file */
1759 cifsFileInfo_get_locked(open_file);
1760 spin_unlock(&cifs_file_list_lock);
1761 return open_file;
1762 } else {
1763 if (!inv_file)
1764 inv_file = open_file;
1768 /* couldn't find useable FH with same pid, try any available */
1769 if (!any_available) {
1770 any_available = true;
1771 goto refind_writable;
1774 if (inv_file) {
1775 any_available = false;
1776 cifsFileInfo_get_locked(inv_file);
1779 spin_unlock(&cifs_file_list_lock);
1781 if (inv_file) {
1782 rc = cifs_reopen_file(inv_file, false);
1783 if (!rc)
1784 return inv_file;
1785 else {
1786 spin_lock(&cifs_file_list_lock);
1787 list_move_tail(&inv_file->flist,
1788 &cifs_inode->openFileList);
1789 spin_unlock(&cifs_file_list_lock);
1790 cifsFileInfo_put(inv_file);
1791 spin_lock(&cifs_file_list_lock);
1792 ++refind;
1793 goto refind_writable;
1797 return NULL;
1800 static int cifs_partialpagewrite(struct page *page, unsigned from, unsigned to)
1802 struct address_space *mapping = page->mapping;
1803 loff_t offset = (loff_t)page->index << PAGE_CACHE_SHIFT;
1804 char *write_data;
1805 int rc = -EFAULT;
1806 int bytes_written = 0;
1807 struct inode *inode;
1808 struct cifsFileInfo *open_file;
1810 if (!mapping || !mapping->host)
1811 return -EFAULT;
1813 inode = page->mapping->host;
1815 offset += (loff_t)from;
1816 write_data = kmap(page);
1817 write_data += from;
1819 if ((to > PAGE_CACHE_SIZE) || (from > to)) {
1820 kunmap(page);
1821 return -EIO;
1824 /* racing with truncate? */
1825 if (offset > mapping->host->i_size) {
1826 kunmap(page);
1827 return 0; /* don't care */
1830 /* check to make sure that we are not extending the file */
1831 if (mapping->host->i_size - offset < (loff_t)to)
1832 to = (unsigned)(mapping->host->i_size - offset);
1834 open_file = find_writable_file(CIFS_I(mapping->host), false);
1835 if (open_file) {
1836 bytes_written = cifs_write(open_file, open_file->pid,
1837 write_data, to - from, &offset);
1838 cifsFileInfo_put(open_file);
1839 /* Does mm or vfs already set times? */
1840 inode->i_atime = inode->i_mtime = current_fs_time(inode->i_sb);
1841 if ((bytes_written > 0) && (offset))
1842 rc = 0;
1843 else if (bytes_written < 0)
1844 rc = bytes_written;
1845 } else {
1846 cifs_dbg(FYI, "No writeable filehandles for inode\n");
1847 rc = -EIO;
1850 kunmap(page);
1851 return rc;
1854 static int cifs_writepages(struct address_space *mapping,
1855 struct writeback_control *wbc)
1857 struct cifs_sb_info *cifs_sb = CIFS_SB(mapping->host->i_sb);
1858 bool done = false, scanned = false, range_whole = false;
1859 pgoff_t end, index;
1860 struct cifs_writedata *wdata;
1861 struct TCP_Server_Info *server;
1862 struct page *page;
1863 int rc = 0;
1866 * If wsize is smaller than the page cache size, default to writing
1867 * one page at a time via cifs_writepage
1869 if (cifs_sb->wsize < PAGE_CACHE_SIZE)
1870 return generic_writepages(mapping, wbc);
1872 if (wbc->range_cyclic) {
1873 index = mapping->writeback_index; /* Start from prev offset */
1874 end = -1;
1875 } else {
1876 index = wbc->range_start >> PAGE_CACHE_SHIFT;
1877 end = wbc->range_end >> PAGE_CACHE_SHIFT;
1878 if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX)
1879 range_whole = true;
1880 scanned = true;
1882 retry:
1883 while (!done && index <= end) {
1884 unsigned int i, nr_pages, found_pages;
1885 pgoff_t next = 0, tofind;
1886 struct page **pages;
1888 tofind = min((cifs_sb->wsize / PAGE_CACHE_SIZE) - 1,
1889 end - index) + 1;
1891 wdata = cifs_writedata_alloc((unsigned int)tofind,
1892 cifs_writev_complete);
1893 if (!wdata) {
1894 rc = -ENOMEM;
1895 break;
1899 * find_get_pages_tag seems to return a max of 256 on each
1900 * iteration, so we must call it several times in order to
1901 * fill the array or the wsize is effectively limited to
1902 * 256 * PAGE_CACHE_SIZE.
1904 found_pages = 0;
1905 pages = wdata->pages;
1906 do {
1907 nr_pages = find_get_pages_tag(mapping, &index,
1908 PAGECACHE_TAG_DIRTY,
1909 tofind, pages);
1910 found_pages += nr_pages;
1911 tofind -= nr_pages;
1912 pages += nr_pages;
1913 } while (nr_pages && tofind && index <= end);
1915 if (found_pages == 0) {
1916 kref_put(&wdata->refcount, cifs_writedata_release);
1917 break;
1920 nr_pages = 0;
1921 for (i = 0; i < found_pages; i++) {
1922 page = wdata->pages[i];
1924 * At this point we hold neither mapping->tree_lock nor
1925 * lock on the page itself: the page may be truncated or
1926 * invalidated (changing page->mapping to NULL), or even
1927 * swizzled back from swapper_space to tmpfs file
1928 * mapping
1931 if (nr_pages == 0)
1932 lock_page(page);
1933 else if (!trylock_page(page))
1934 break;
1936 if (unlikely(page->mapping != mapping)) {
1937 unlock_page(page);
1938 break;
1941 if (!wbc->range_cyclic && page->index > end) {
1942 done = true;
1943 unlock_page(page);
1944 break;
1947 if (next && (page->index != next)) {
1948 /* Not next consecutive page */
1949 unlock_page(page);
1950 break;
1953 if (wbc->sync_mode != WB_SYNC_NONE)
1954 wait_on_page_writeback(page);
1956 if (PageWriteback(page) ||
1957 !clear_page_dirty_for_io(page)) {
1958 unlock_page(page);
1959 break;
1963 * This actually clears the dirty bit in the radix tree.
1964 * See cifs_writepage() for more commentary.
1966 set_page_writeback(page);
1968 if (page_offset(page) >= i_size_read(mapping->host)) {
1969 done = true;
1970 unlock_page(page);
1971 end_page_writeback(page);
1972 break;
1975 wdata->pages[i] = page;
1976 next = page->index + 1;
1977 ++nr_pages;
1980 /* reset index to refind any pages skipped */
1981 if (nr_pages == 0)
1982 index = wdata->pages[0]->index + 1;
1984 /* put any pages we aren't going to use */
1985 for (i = nr_pages; i < found_pages; i++) {
1986 page_cache_release(wdata->pages[i]);
1987 wdata->pages[i] = NULL;
1990 /* nothing to write? */
1991 if (nr_pages == 0) {
1992 kref_put(&wdata->refcount, cifs_writedata_release);
1993 continue;
1996 wdata->sync_mode = wbc->sync_mode;
1997 wdata->nr_pages = nr_pages;
1998 wdata->offset = page_offset(wdata->pages[0]);
1999 wdata->pagesz = PAGE_CACHE_SIZE;
2000 wdata->tailsz =
2001 min(i_size_read(mapping->host) -
2002 page_offset(wdata->pages[nr_pages - 1]),
2003 (loff_t)PAGE_CACHE_SIZE);
2004 wdata->bytes = ((nr_pages - 1) * PAGE_CACHE_SIZE) +
2005 wdata->tailsz;
2007 do {
2008 if (wdata->cfile != NULL)
2009 cifsFileInfo_put(wdata->cfile);
2010 wdata->cfile = find_writable_file(CIFS_I(mapping->host),
2011 false);
2012 if (!wdata->cfile) {
2013 cifs_dbg(VFS, "No writable handles for inode\n");
2014 rc = -EBADF;
2015 break;
2017 wdata->pid = wdata->cfile->pid;
2018 server = tlink_tcon(wdata->cfile->tlink)->ses->server;
2019 rc = server->ops->async_writev(wdata);
2020 } while (wbc->sync_mode == WB_SYNC_ALL && rc == -EAGAIN);
2022 for (i = 0; i < nr_pages; ++i)
2023 unlock_page(wdata->pages[i]);
2025 /* send failure -- clean up the mess */
2026 if (rc != 0) {
2027 for (i = 0; i < nr_pages; ++i) {
2028 if (rc == -EAGAIN)
2029 redirty_page_for_writepage(wbc,
2030 wdata->pages[i]);
2031 else
2032 SetPageError(wdata->pages[i]);
2033 end_page_writeback(wdata->pages[i]);
2034 page_cache_release(wdata->pages[i]);
2036 if (rc != -EAGAIN)
2037 mapping_set_error(mapping, rc);
2039 kref_put(&wdata->refcount, cifs_writedata_release);
2041 wbc->nr_to_write -= nr_pages;
2042 if (wbc->nr_to_write <= 0)
2043 done = true;
2045 index = next;
2048 if (!scanned && !done) {
2050 * We hit the last page and there is more work to be done: wrap
2051 * back to the start of the file
2053 scanned = true;
2054 index = 0;
2055 goto retry;
2058 if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0))
2059 mapping->writeback_index = index;
2061 return rc;
2064 static int
2065 cifs_writepage_locked(struct page *page, struct writeback_control *wbc)
2067 int rc;
2068 unsigned int xid;
2070 xid = get_xid();
2071 /* BB add check for wbc flags */
2072 page_cache_get(page);
2073 if (!PageUptodate(page))
2074 cifs_dbg(FYI, "ppw - page not up to date\n");
2077 * Set the "writeback" flag, and clear "dirty" in the radix tree.
2079 * A writepage() implementation always needs to do either this,
2080 * or re-dirty the page with "redirty_page_for_writepage()" in
2081 * the case of a failure.
2083 * Just unlocking the page will cause the radix tree tag-bits
2084 * to fail to update with the state of the page correctly.
2086 set_page_writeback(page);
2087 retry_write:
2088 rc = cifs_partialpagewrite(page, 0, PAGE_CACHE_SIZE);
2089 if (rc == -EAGAIN && wbc->sync_mode == WB_SYNC_ALL)
2090 goto retry_write;
2091 else if (rc == -EAGAIN)
2092 redirty_page_for_writepage(wbc, page);
2093 else if (rc != 0)
2094 SetPageError(page);
2095 else
2096 SetPageUptodate(page);
2097 end_page_writeback(page);
2098 page_cache_release(page);
2099 free_xid(xid);
2100 return rc;
2103 static int cifs_writepage(struct page *page, struct writeback_control *wbc)
2105 int rc = cifs_writepage_locked(page, wbc);
2106 unlock_page(page);
2107 return rc;
2110 static int cifs_write_end(struct file *file, struct address_space *mapping,
2111 loff_t pos, unsigned len, unsigned copied,
2112 struct page *page, void *fsdata)
2114 int rc;
2115 struct inode *inode = mapping->host;
2116 struct cifsFileInfo *cfile = file->private_data;
2117 struct cifs_sb_info *cifs_sb = CIFS_SB(cfile->dentry->d_sb);
2118 __u32 pid;
2120 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD)
2121 pid = cfile->pid;
2122 else
2123 pid = current->tgid;
2125 cifs_dbg(FYI, "write_end for page %p from pos %lld with %d bytes\n",
2126 page, pos, copied);
2128 if (PageChecked(page)) {
2129 if (copied == len)
2130 SetPageUptodate(page);
2131 ClearPageChecked(page);
2132 } else if (!PageUptodate(page) && copied == PAGE_CACHE_SIZE)
2133 SetPageUptodate(page);
2135 if (!PageUptodate(page)) {
2136 char *page_data;
2137 unsigned offset = pos & (PAGE_CACHE_SIZE - 1);
2138 unsigned int xid;
2140 xid = get_xid();
2141 /* this is probably better than directly calling
2142 partialpage_write since in this function the file handle is
2143 known which we might as well leverage */
2144 /* BB check if anything else missing out of ppw
2145 such as updating last write time */
2146 page_data = kmap(page);
2147 rc = cifs_write(cfile, pid, page_data + offset, copied, &pos);
2148 /* if (rc < 0) should we set writebehind rc? */
2149 kunmap(page);
2151 free_xid(xid);
2152 } else {
2153 rc = copied;
2154 pos += copied;
2155 set_page_dirty(page);
2158 if (rc > 0) {
2159 spin_lock(&inode->i_lock);
2160 if (pos > inode->i_size)
2161 i_size_write(inode, pos);
2162 spin_unlock(&inode->i_lock);
2165 unlock_page(page);
2166 page_cache_release(page);
2168 return rc;
2171 int cifs_strict_fsync(struct file *file, loff_t start, loff_t end,
2172 int datasync)
2174 unsigned int xid;
2175 int rc = 0;
2176 struct cifs_tcon *tcon;
2177 struct TCP_Server_Info *server;
2178 struct cifsFileInfo *smbfile = file->private_data;
2179 struct inode *inode = file_inode(file);
2180 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2182 rc = filemap_write_and_wait_range(inode->i_mapping, start, end);
2183 if (rc)
2184 return rc;
2185 mutex_lock(&inode->i_mutex);
2187 xid = get_xid();
2189 cifs_dbg(FYI, "Sync file - name: %s datasync: 0x%x\n",
2190 file->f_path.dentry->d_name.name, datasync);
2192 if (!CIFS_I(inode)->clientCanCacheRead) {
2193 rc = cifs_invalidate_mapping(inode);
2194 if (rc) {
2195 cifs_dbg(FYI, "rc: %d during invalidate phase\n", rc);
2196 rc = 0; /* don't care about it in fsync */
2200 tcon = tlink_tcon(smbfile->tlink);
2201 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC)) {
2202 server = tcon->ses->server;
2203 if (server->ops->flush)
2204 rc = server->ops->flush(xid, tcon, &smbfile->fid);
2205 else
2206 rc = -ENOSYS;
2209 free_xid(xid);
2210 mutex_unlock(&inode->i_mutex);
2211 return rc;
2214 int cifs_fsync(struct file *file, loff_t start, loff_t end, int datasync)
2216 unsigned int xid;
2217 int rc = 0;
2218 struct cifs_tcon *tcon;
2219 struct TCP_Server_Info *server;
2220 struct cifsFileInfo *smbfile = file->private_data;
2221 struct cifs_sb_info *cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
2222 struct inode *inode = file->f_mapping->host;
2224 rc = filemap_write_and_wait_range(inode->i_mapping, start, end);
2225 if (rc)
2226 return rc;
2227 mutex_lock(&inode->i_mutex);
2229 xid = get_xid();
2231 cifs_dbg(FYI, "Sync file - name: %s datasync: 0x%x\n",
2232 file->f_path.dentry->d_name.name, datasync);
2234 tcon = tlink_tcon(smbfile->tlink);
2235 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC)) {
2236 server = tcon->ses->server;
2237 if (server->ops->flush)
2238 rc = server->ops->flush(xid, tcon, &smbfile->fid);
2239 else
2240 rc = -ENOSYS;
2243 free_xid(xid);
2244 mutex_unlock(&inode->i_mutex);
2245 return rc;
2249 * As file closes, flush all cached write data for this inode checking
2250 * for write behind errors.
2252 int cifs_flush(struct file *file, fl_owner_t id)
2254 struct inode *inode = file_inode(file);
2255 int rc = 0;
2257 if (file->f_mode & FMODE_WRITE)
2258 rc = filemap_write_and_wait(inode->i_mapping);
2260 cifs_dbg(FYI, "Flush inode %p file %p rc %d\n", inode, file, rc);
2262 return rc;
2265 static int
2266 cifs_write_allocate_pages(struct page **pages, unsigned long num_pages)
2268 int rc = 0;
2269 unsigned long i;
2271 for (i = 0; i < num_pages; i++) {
2272 pages[i] = alloc_page(GFP_KERNEL|__GFP_HIGHMEM);
2273 if (!pages[i]) {
2275 * save number of pages we have already allocated and
2276 * return with ENOMEM error
2278 num_pages = i;
2279 rc = -ENOMEM;
2280 break;
2284 if (rc) {
2285 for (i = 0; i < num_pages; i++)
2286 put_page(pages[i]);
2288 return rc;
2291 static inline
2292 size_t get_numpages(const size_t wsize, const size_t len, size_t *cur_len)
2294 size_t num_pages;
2295 size_t clen;
2297 clen = min_t(const size_t, len, wsize);
2298 num_pages = DIV_ROUND_UP(clen, PAGE_SIZE);
2300 if (cur_len)
2301 *cur_len = clen;
2303 return num_pages;
2306 static void
2307 cifs_uncached_writev_complete(struct work_struct *work)
2309 int i;
2310 struct cifs_writedata *wdata = container_of(work,
2311 struct cifs_writedata, work);
2312 struct inode *inode = wdata->cfile->dentry->d_inode;
2313 struct cifsInodeInfo *cifsi = CIFS_I(inode);
2315 spin_lock(&inode->i_lock);
2316 cifs_update_eof(cifsi, wdata->offset, wdata->bytes);
2317 if (cifsi->server_eof > inode->i_size)
2318 i_size_write(inode, cifsi->server_eof);
2319 spin_unlock(&inode->i_lock);
2321 complete(&wdata->done);
2323 if (wdata->result != -EAGAIN) {
2324 for (i = 0; i < wdata->nr_pages; i++)
2325 put_page(wdata->pages[i]);
2328 kref_put(&wdata->refcount, cifs_writedata_release);
2331 /* attempt to send write to server, retry on any -EAGAIN errors */
2332 static int
2333 cifs_uncached_retry_writev(struct cifs_writedata *wdata)
2335 int rc;
2336 struct TCP_Server_Info *server;
2338 server = tlink_tcon(wdata->cfile->tlink)->ses->server;
2340 do {
2341 if (wdata->cfile->invalidHandle) {
2342 rc = cifs_reopen_file(wdata->cfile, false);
2343 if (rc != 0)
2344 continue;
2346 rc = server->ops->async_writev(wdata);
2347 } while (rc == -EAGAIN);
2349 return rc;
2352 static ssize_t
2353 cifs_iovec_write(struct file *file, const struct iovec *iov,
2354 unsigned long nr_segs, loff_t *poffset)
2356 unsigned long nr_pages, i;
2357 size_t copied, len, cur_len;
2358 ssize_t total_written = 0;
2359 loff_t offset;
2360 struct iov_iter it;
2361 struct cifsFileInfo *open_file;
2362 struct cifs_tcon *tcon;
2363 struct cifs_sb_info *cifs_sb;
2364 struct cifs_writedata *wdata, *tmp;
2365 struct list_head wdata_list;
2366 int rc;
2367 pid_t pid;
2369 len = iov_length(iov, nr_segs);
2370 if (!len)
2371 return 0;
2373 rc = generic_write_checks(file, poffset, &len, 0);
2374 if (rc)
2375 return rc;
2377 INIT_LIST_HEAD(&wdata_list);
2378 cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
2379 open_file = file->private_data;
2380 tcon = tlink_tcon(open_file->tlink);
2382 if (!tcon->ses->server->ops->async_writev)
2383 return -ENOSYS;
2385 offset = *poffset;
2387 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD)
2388 pid = open_file->pid;
2389 else
2390 pid = current->tgid;
2392 iov_iter_init(&it, iov, nr_segs, len, 0);
2393 do {
2394 size_t save_len;
2396 nr_pages = get_numpages(cifs_sb->wsize, len, &cur_len);
2397 wdata = cifs_writedata_alloc(nr_pages,
2398 cifs_uncached_writev_complete);
2399 if (!wdata) {
2400 rc = -ENOMEM;
2401 break;
2404 rc = cifs_write_allocate_pages(wdata->pages, nr_pages);
2405 if (rc) {
2406 kfree(wdata);
2407 break;
2410 save_len = cur_len;
2411 for (i = 0; i < nr_pages; i++) {
2412 copied = min_t(const size_t, cur_len, PAGE_SIZE);
2413 copied = iov_iter_copy_from_user(wdata->pages[i], &it,
2414 0, copied);
2415 cur_len -= copied;
2416 iov_iter_advance(&it, copied);
2418 cur_len = save_len - cur_len;
2420 wdata->sync_mode = WB_SYNC_ALL;
2421 wdata->nr_pages = nr_pages;
2422 wdata->offset = (__u64)offset;
2423 wdata->cfile = cifsFileInfo_get(open_file);
2424 wdata->pid = pid;
2425 wdata->bytes = cur_len;
2426 wdata->pagesz = PAGE_SIZE;
2427 wdata->tailsz = cur_len - ((nr_pages - 1) * PAGE_SIZE);
2428 rc = cifs_uncached_retry_writev(wdata);
2429 if (rc) {
2430 kref_put(&wdata->refcount, cifs_writedata_release);
2431 break;
2434 list_add_tail(&wdata->list, &wdata_list);
2435 offset += cur_len;
2436 len -= cur_len;
2437 } while (len > 0);
2440 * If at least one write was successfully sent, then discard any rc
2441 * value from the later writes. If the other write succeeds, then
2442 * we'll end up returning whatever was written. If it fails, then
2443 * we'll get a new rc value from that.
2445 if (!list_empty(&wdata_list))
2446 rc = 0;
2449 * Wait for and collect replies for any successful sends in order of
2450 * increasing offset. Once an error is hit or we get a fatal signal
2451 * while waiting, then return without waiting for any more replies.
2453 restart_loop:
2454 list_for_each_entry_safe(wdata, tmp, &wdata_list, list) {
2455 if (!rc) {
2456 /* FIXME: freezable too? */
2457 rc = wait_for_completion_killable(&wdata->done);
2458 if (rc)
2459 rc = -EINTR;
2460 else if (wdata->result)
2461 rc = wdata->result;
2462 else
2463 total_written += wdata->bytes;
2465 /* resend call if it's a retryable error */
2466 if (rc == -EAGAIN) {
2467 rc = cifs_uncached_retry_writev(wdata);
2468 goto restart_loop;
2471 list_del_init(&wdata->list);
2472 kref_put(&wdata->refcount, cifs_writedata_release);
2475 if (total_written > 0)
2476 *poffset += total_written;
2478 cifs_stats_bytes_written(tcon, total_written);
2479 return total_written ? total_written : (ssize_t)rc;
2482 ssize_t cifs_user_writev(struct kiocb *iocb, const struct iovec *iov,
2483 unsigned long nr_segs, loff_t pos)
2485 ssize_t written;
2486 struct inode *inode;
2488 inode = file_inode(iocb->ki_filp);
2491 * BB - optimize the way when signing is disabled. We can drop this
2492 * extra memory-to-memory copying and use iovec buffers for constructing
2493 * write request.
2496 written = cifs_iovec_write(iocb->ki_filp, iov, nr_segs, &pos);
2497 if (written > 0) {
2498 CIFS_I(inode)->invalid_mapping = true;
2499 iocb->ki_pos = pos;
2502 return written;
2505 static ssize_t
2506 cifs_writev(struct kiocb *iocb, const struct iovec *iov,
2507 unsigned long nr_segs, loff_t pos)
2509 struct file *file = iocb->ki_filp;
2510 struct cifsFileInfo *cfile = (struct cifsFileInfo *)file->private_data;
2511 struct inode *inode = file->f_mapping->host;
2512 struct cifsInodeInfo *cinode = CIFS_I(inode);
2513 struct TCP_Server_Info *server = tlink_tcon(cfile->tlink)->ses->server;
2514 ssize_t rc = -EACCES;
2516 BUG_ON(iocb->ki_pos != pos);
2519 * We need to hold the sem to be sure nobody modifies lock list
2520 * with a brlock that prevents writing.
2522 down_read(&cinode->lock_sem);
2523 if (!cifs_find_lock_conflict(cfile, pos, iov_length(iov, nr_segs),
2524 server->vals->exclusive_lock_type, NULL,
2525 CIFS_WRITE_OP)) {
2526 mutex_lock(&inode->i_mutex);
2527 rc = __generic_file_aio_write(iocb, iov, nr_segs,
2528 &iocb->ki_pos);
2529 mutex_unlock(&inode->i_mutex);
2532 if (rc > 0 || rc == -EIOCBQUEUED) {
2533 ssize_t err;
2535 err = generic_write_sync(file, pos, rc);
2536 if (err < 0 && rc > 0)
2537 rc = err;
2540 up_read(&cinode->lock_sem);
2541 return rc;
2544 ssize_t
2545 cifs_strict_writev(struct kiocb *iocb, const struct iovec *iov,
2546 unsigned long nr_segs, loff_t pos)
2548 struct inode *inode = file_inode(iocb->ki_filp);
2549 struct cifsInodeInfo *cinode = CIFS_I(inode);
2550 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2551 struct cifsFileInfo *cfile = (struct cifsFileInfo *)
2552 iocb->ki_filp->private_data;
2553 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
2554 ssize_t written;
2556 if (cinode->clientCanCacheAll) {
2557 if (cap_unix(tcon->ses) &&
2558 (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability))
2559 && ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0))
2560 return generic_file_aio_write(iocb, iov, nr_segs, pos);
2561 return cifs_writev(iocb, iov, nr_segs, pos);
2564 * For non-oplocked files in strict cache mode we need to write the data
2565 * to the server exactly from the pos to pos+len-1 rather than flush all
2566 * affected pages because it may cause a error with mandatory locks on
2567 * these pages but not on the region from pos to ppos+len-1.
2569 written = cifs_user_writev(iocb, iov, nr_segs, pos);
2570 if (written > 0 && cinode->clientCanCacheRead) {
2572 * Windows 7 server can delay breaking level2 oplock if a write
2573 * request comes - break it on the client to prevent reading
2574 * an old data.
2576 cifs_invalidate_mapping(inode);
2577 cifs_dbg(FYI, "Set no oplock for inode=%p after a write operation\n",
2578 inode);
2579 cinode->clientCanCacheRead = false;
2581 return written;
2584 static struct cifs_readdata *
2585 cifs_readdata_alloc(unsigned int nr_pages, work_func_t complete)
2587 struct cifs_readdata *rdata;
2589 rdata = kzalloc(sizeof(*rdata) + (sizeof(struct page *) * nr_pages),
2590 GFP_KERNEL);
2591 if (rdata != NULL) {
2592 kref_init(&rdata->refcount);
2593 INIT_LIST_HEAD(&rdata->list);
2594 init_completion(&rdata->done);
2595 INIT_WORK(&rdata->work, complete);
2598 return rdata;
2601 void
2602 cifs_readdata_release(struct kref *refcount)
2604 struct cifs_readdata *rdata = container_of(refcount,
2605 struct cifs_readdata, refcount);
2607 if (rdata->cfile)
2608 cifsFileInfo_put(rdata->cfile);
2610 kfree(rdata);
2613 static int
2614 cifs_read_allocate_pages(struct cifs_readdata *rdata, unsigned int nr_pages)
2616 int rc = 0;
2617 struct page *page;
2618 unsigned int i;
2620 for (i = 0; i < nr_pages; i++) {
2621 page = alloc_page(GFP_KERNEL|__GFP_HIGHMEM);
2622 if (!page) {
2623 rc = -ENOMEM;
2624 break;
2626 rdata->pages[i] = page;
2629 if (rc) {
2630 for (i = 0; i < nr_pages; i++) {
2631 put_page(rdata->pages[i]);
2632 rdata->pages[i] = NULL;
2635 return rc;
2638 static void
2639 cifs_uncached_readdata_release(struct kref *refcount)
2641 struct cifs_readdata *rdata = container_of(refcount,
2642 struct cifs_readdata, refcount);
2643 unsigned int i;
2645 for (i = 0; i < rdata->nr_pages; i++) {
2646 put_page(rdata->pages[i]);
2647 rdata->pages[i] = NULL;
2649 cifs_readdata_release(refcount);
2652 static int
2653 cifs_retry_async_readv(struct cifs_readdata *rdata)
2655 int rc;
2656 struct TCP_Server_Info *server;
2658 server = tlink_tcon(rdata->cfile->tlink)->ses->server;
2660 do {
2661 if (rdata->cfile->invalidHandle) {
2662 rc = cifs_reopen_file(rdata->cfile, true);
2663 if (rc != 0)
2664 continue;
2666 rc = server->ops->async_readv(rdata);
2667 } while (rc == -EAGAIN);
2669 return rc;
2673 * cifs_readdata_to_iov - copy data from pages in response to an iovec
2674 * @rdata: the readdata response with list of pages holding data
2675 * @iov: vector in which we should copy the data
2676 * @nr_segs: number of segments in vector
2677 * @offset: offset into file of the first iovec
2678 * @copied: used to return the amount of data copied to the iov
2680 * This function copies data from a list of pages in a readdata response into
2681 * an array of iovecs. It will first calculate where the data should go
2682 * based on the info in the readdata and then copy the data into that spot.
2684 static ssize_t
2685 cifs_readdata_to_iov(struct cifs_readdata *rdata, const struct iovec *iov,
2686 unsigned long nr_segs, loff_t offset, ssize_t *copied)
2688 int rc = 0;
2689 struct iov_iter ii;
2690 size_t pos = rdata->offset - offset;
2691 ssize_t remaining = rdata->bytes;
2692 unsigned char *pdata;
2693 unsigned int i;
2695 /* set up iov_iter and advance to the correct offset */
2696 iov_iter_init(&ii, iov, nr_segs, iov_length(iov, nr_segs), 0);
2697 iov_iter_advance(&ii, pos);
2699 *copied = 0;
2700 for (i = 0; i < rdata->nr_pages; i++) {
2701 ssize_t copy;
2702 struct page *page = rdata->pages[i];
2704 /* copy a whole page or whatever's left */
2705 copy = min_t(ssize_t, remaining, PAGE_SIZE);
2707 /* ...but limit it to whatever space is left in the iov */
2708 copy = min_t(ssize_t, copy, iov_iter_count(&ii));
2710 /* go while there's data to be copied and no errors */
2711 if (copy && !rc) {
2712 pdata = kmap(page);
2713 rc = memcpy_toiovecend(ii.iov, pdata, ii.iov_offset,
2714 (int)copy);
2715 kunmap(page);
2716 if (!rc) {
2717 *copied += copy;
2718 remaining -= copy;
2719 iov_iter_advance(&ii, copy);
2724 return rc;
2727 static void
2728 cifs_uncached_readv_complete(struct work_struct *work)
2730 struct cifs_readdata *rdata = container_of(work,
2731 struct cifs_readdata, work);
2733 complete(&rdata->done);
2734 kref_put(&rdata->refcount, cifs_uncached_readdata_release);
2737 static int
2738 cifs_uncached_read_into_pages(struct TCP_Server_Info *server,
2739 struct cifs_readdata *rdata, unsigned int len)
2741 int total_read = 0, result = 0;
2742 unsigned int i;
2743 unsigned int nr_pages = rdata->nr_pages;
2744 struct kvec iov;
2746 rdata->tailsz = PAGE_SIZE;
2747 for (i = 0; i < nr_pages; i++) {
2748 struct page *page = rdata->pages[i];
2750 if (len >= PAGE_SIZE) {
2751 /* enough data to fill the page */
2752 iov.iov_base = kmap(page);
2753 iov.iov_len = PAGE_SIZE;
2754 cifs_dbg(FYI, "%u: iov_base=%p iov_len=%zu\n",
2755 i, iov.iov_base, iov.iov_len);
2756 len -= PAGE_SIZE;
2757 } else if (len > 0) {
2758 /* enough for partial page, fill and zero the rest */
2759 iov.iov_base = kmap(page);
2760 iov.iov_len = len;
2761 cifs_dbg(FYI, "%u: iov_base=%p iov_len=%zu\n",
2762 i, iov.iov_base, iov.iov_len);
2763 memset(iov.iov_base + len, '\0', PAGE_SIZE - len);
2764 rdata->tailsz = len;
2765 len = 0;
2766 } else {
2767 /* no need to hold page hostage */
2768 rdata->pages[i] = NULL;
2769 rdata->nr_pages--;
2770 put_page(page);
2771 continue;
2774 result = cifs_readv_from_socket(server, &iov, 1, iov.iov_len);
2775 kunmap(page);
2776 if (result < 0)
2777 break;
2779 total_read += result;
2782 return total_read > 0 ? total_read : result;
2785 static ssize_t
2786 cifs_iovec_read(struct file *file, const struct iovec *iov,
2787 unsigned long nr_segs, loff_t *poffset)
2789 ssize_t rc;
2790 size_t len, cur_len;
2791 ssize_t total_read = 0;
2792 loff_t offset = *poffset;
2793 unsigned int npages;
2794 struct cifs_sb_info *cifs_sb;
2795 struct cifs_tcon *tcon;
2796 struct cifsFileInfo *open_file;
2797 struct cifs_readdata *rdata, *tmp;
2798 struct list_head rdata_list;
2799 pid_t pid;
2801 if (!nr_segs)
2802 return 0;
2804 len = iov_length(iov, nr_segs);
2805 if (!len)
2806 return 0;
2808 INIT_LIST_HEAD(&rdata_list);
2809 cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
2810 open_file = file->private_data;
2811 tcon = tlink_tcon(open_file->tlink);
2813 if (!tcon->ses->server->ops->async_readv)
2814 return -ENOSYS;
2816 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD)
2817 pid = open_file->pid;
2818 else
2819 pid = current->tgid;
2821 if ((file->f_flags & O_ACCMODE) == O_WRONLY)
2822 cifs_dbg(FYI, "attempting read on write only file instance\n");
2824 do {
2825 cur_len = min_t(const size_t, len - total_read, cifs_sb->rsize);
2826 npages = DIV_ROUND_UP(cur_len, PAGE_SIZE);
2828 /* allocate a readdata struct */
2829 rdata = cifs_readdata_alloc(npages,
2830 cifs_uncached_readv_complete);
2831 if (!rdata) {
2832 rc = -ENOMEM;
2833 goto error;
2836 rc = cifs_read_allocate_pages(rdata, npages);
2837 if (rc)
2838 goto error;
2840 rdata->cfile = cifsFileInfo_get(open_file);
2841 rdata->nr_pages = npages;
2842 rdata->offset = offset;
2843 rdata->bytes = cur_len;
2844 rdata->pid = pid;
2845 rdata->pagesz = PAGE_SIZE;
2846 rdata->read_into_pages = cifs_uncached_read_into_pages;
2848 rc = cifs_retry_async_readv(rdata);
2849 error:
2850 if (rc) {
2851 kref_put(&rdata->refcount,
2852 cifs_uncached_readdata_release);
2853 break;
2856 list_add_tail(&rdata->list, &rdata_list);
2857 offset += cur_len;
2858 len -= cur_len;
2859 } while (len > 0);
2861 /* if at least one read request send succeeded, then reset rc */
2862 if (!list_empty(&rdata_list))
2863 rc = 0;
2865 /* the loop below should proceed in the order of increasing offsets */
2866 restart_loop:
2867 list_for_each_entry_safe(rdata, tmp, &rdata_list, list) {
2868 if (!rc) {
2869 ssize_t copied;
2871 /* FIXME: freezable sleep too? */
2872 rc = wait_for_completion_killable(&rdata->done);
2873 if (rc)
2874 rc = -EINTR;
2875 else if (rdata->result)
2876 rc = rdata->result;
2877 else {
2878 rc = cifs_readdata_to_iov(rdata, iov,
2879 nr_segs, *poffset,
2880 &copied);
2881 total_read += copied;
2884 /* resend call if it's a retryable error */
2885 if (rc == -EAGAIN) {
2886 rc = cifs_retry_async_readv(rdata);
2887 goto restart_loop;
2890 list_del_init(&rdata->list);
2891 kref_put(&rdata->refcount, cifs_uncached_readdata_release);
2894 cifs_stats_bytes_read(tcon, total_read);
2895 *poffset += total_read;
2897 /* mask nodata case */
2898 if (rc == -ENODATA)
2899 rc = 0;
2901 return total_read ? total_read : rc;
2904 ssize_t cifs_user_readv(struct kiocb *iocb, const struct iovec *iov,
2905 unsigned long nr_segs, loff_t pos)
2907 ssize_t read;
2909 read = cifs_iovec_read(iocb->ki_filp, iov, nr_segs, &pos);
2910 if (read > 0)
2911 iocb->ki_pos = pos;
2913 return read;
2916 ssize_t
2917 cifs_strict_readv(struct kiocb *iocb, const struct iovec *iov,
2918 unsigned long nr_segs, loff_t pos)
2920 struct inode *inode = file_inode(iocb->ki_filp);
2921 struct cifsInodeInfo *cinode = CIFS_I(inode);
2922 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2923 struct cifsFileInfo *cfile = (struct cifsFileInfo *)
2924 iocb->ki_filp->private_data;
2925 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
2926 int rc = -EACCES;
2929 * In strict cache mode we need to read from the server all the time
2930 * if we don't have level II oplock because the server can delay mtime
2931 * change - so we can't make a decision about inode invalidating.
2932 * And we can also fail with pagereading if there are mandatory locks
2933 * on pages affected by this read but not on the region from pos to
2934 * pos+len-1.
2936 if (!cinode->clientCanCacheRead)
2937 return cifs_user_readv(iocb, iov, nr_segs, pos);
2939 if (cap_unix(tcon->ses) &&
2940 (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) &&
2941 ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0))
2942 return generic_file_aio_read(iocb, iov, nr_segs, pos);
2945 * We need to hold the sem to be sure nobody modifies lock list
2946 * with a brlock that prevents reading.
2948 down_read(&cinode->lock_sem);
2949 if (!cifs_find_lock_conflict(cfile, pos, iov_length(iov, nr_segs),
2950 tcon->ses->server->vals->shared_lock_type,
2951 NULL, CIFS_READ_OP))
2952 rc = generic_file_aio_read(iocb, iov, nr_segs, pos);
2953 up_read(&cinode->lock_sem);
2954 return rc;
2957 static ssize_t
2958 cifs_read(struct file *file, char *read_data, size_t read_size, loff_t *offset)
2960 int rc = -EACCES;
2961 unsigned int bytes_read = 0;
2962 unsigned int total_read;
2963 unsigned int current_read_size;
2964 unsigned int rsize;
2965 struct cifs_sb_info *cifs_sb;
2966 struct cifs_tcon *tcon;
2967 struct TCP_Server_Info *server;
2968 unsigned int xid;
2969 char *cur_offset;
2970 struct cifsFileInfo *open_file;
2971 struct cifs_io_parms io_parms;
2972 int buf_type = CIFS_NO_BUFFER;
2973 __u32 pid;
2975 xid = get_xid();
2976 cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
2978 /* FIXME: set up handlers for larger reads and/or convert to async */
2979 rsize = min_t(unsigned int, cifs_sb->rsize, CIFSMaxBufSize);
2981 if (file->private_data == NULL) {
2982 rc = -EBADF;
2983 free_xid(xid);
2984 return rc;
2986 open_file = file->private_data;
2987 tcon = tlink_tcon(open_file->tlink);
2988 server = tcon->ses->server;
2990 if (!server->ops->sync_read) {
2991 free_xid(xid);
2992 return -ENOSYS;
2995 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD)
2996 pid = open_file->pid;
2997 else
2998 pid = current->tgid;
3000 if ((file->f_flags & O_ACCMODE) == O_WRONLY)
3001 cifs_dbg(FYI, "attempting read on write only file instance\n");
3003 for (total_read = 0, cur_offset = read_data; read_size > total_read;
3004 total_read += bytes_read, cur_offset += bytes_read) {
3005 current_read_size = min_t(uint, read_size - total_read, rsize);
3007 * For windows me and 9x we do not want to request more than it
3008 * negotiated since it will refuse the read then.
3010 if ((tcon->ses) && !(tcon->ses->capabilities &
3011 tcon->ses->server->vals->cap_large_files)) {
3012 current_read_size = min_t(uint, current_read_size,
3013 CIFSMaxBufSize);
3015 rc = -EAGAIN;
3016 while (rc == -EAGAIN) {
3017 if (open_file->invalidHandle) {
3018 rc = cifs_reopen_file(open_file, true);
3019 if (rc != 0)
3020 break;
3022 io_parms.pid = pid;
3023 io_parms.tcon = tcon;
3024 io_parms.offset = *offset;
3025 io_parms.length = current_read_size;
3026 rc = server->ops->sync_read(xid, open_file, &io_parms,
3027 &bytes_read, &cur_offset,
3028 &buf_type);
3030 if (rc || (bytes_read == 0)) {
3031 if (total_read) {
3032 break;
3033 } else {
3034 free_xid(xid);
3035 return rc;
3037 } else {
3038 cifs_stats_bytes_read(tcon, total_read);
3039 *offset += bytes_read;
3042 free_xid(xid);
3043 return total_read;
3047 * If the page is mmap'ed into a process' page tables, then we need to make
3048 * sure that it doesn't change while being written back.
3050 static int
3051 cifs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
3053 struct page *page = vmf->page;
3055 lock_page(page);
3056 return VM_FAULT_LOCKED;
3059 static struct vm_operations_struct cifs_file_vm_ops = {
3060 .fault = filemap_fault,
3061 .page_mkwrite = cifs_page_mkwrite,
3062 .remap_pages = generic_file_remap_pages,
3065 int cifs_file_strict_mmap(struct file *file, struct vm_area_struct *vma)
3067 int rc, xid;
3068 struct inode *inode = file_inode(file);
3070 xid = get_xid();
3072 if (!CIFS_I(inode)->clientCanCacheRead) {
3073 rc = cifs_invalidate_mapping(inode);
3074 if (rc)
3075 return rc;
3078 rc = generic_file_mmap(file, vma);
3079 if (rc == 0)
3080 vma->vm_ops = &cifs_file_vm_ops;
3081 free_xid(xid);
3082 return rc;
3085 int cifs_file_mmap(struct file *file, struct vm_area_struct *vma)
3087 int rc, xid;
3089 xid = get_xid();
3090 rc = cifs_revalidate_file(file);
3091 if (rc) {
3092 cifs_dbg(FYI, "Validation prior to mmap failed, error=%d\n",
3093 rc);
3094 free_xid(xid);
3095 return rc;
3097 rc = generic_file_mmap(file, vma);
3098 if (rc == 0)
3099 vma->vm_ops = &cifs_file_vm_ops;
3100 free_xid(xid);
3101 return rc;
3104 static void
3105 cifs_readv_complete(struct work_struct *work)
3107 unsigned int i;
3108 struct cifs_readdata *rdata = container_of(work,
3109 struct cifs_readdata, work);
3111 for (i = 0; i < rdata->nr_pages; i++) {
3112 struct page *page = rdata->pages[i];
3114 lru_cache_add_file(page);
3116 if (rdata->result == 0) {
3117 flush_dcache_page(page);
3118 SetPageUptodate(page);
3121 unlock_page(page);
3123 if (rdata->result == 0)
3124 cifs_readpage_to_fscache(rdata->mapping->host, page);
3126 page_cache_release(page);
3127 rdata->pages[i] = NULL;
3129 kref_put(&rdata->refcount, cifs_readdata_release);
3132 static int
3133 cifs_readpages_read_into_pages(struct TCP_Server_Info *server,
3134 struct cifs_readdata *rdata, unsigned int len)
3136 int total_read = 0, result = 0;
3137 unsigned int i;
3138 u64 eof;
3139 pgoff_t eof_index;
3140 unsigned int nr_pages = rdata->nr_pages;
3141 struct kvec iov;
3143 /* determine the eof that the server (probably) has */
3144 eof = CIFS_I(rdata->mapping->host)->server_eof;
3145 eof_index = eof ? (eof - 1) >> PAGE_CACHE_SHIFT : 0;
3146 cifs_dbg(FYI, "eof=%llu eof_index=%lu\n", eof, eof_index);
3148 rdata->tailsz = PAGE_CACHE_SIZE;
3149 for (i = 0; i < nr_pages; i++) {
3150 struct page *page = rdata->pages[i];
3152 if (len >= PAGE_CACHE_SIZE) {
3153 /* enough data to fill the page */
3154 iov.iov_base = kmap(page);
3155 iov.iov_len = PAGE_CACHE_SIZE;
3156 cifs_dbg(FYI, "%u: idx=%lu iov_base=%p iov_len=%zu\n",
3157 i, page->index, iov.iov_base, iov.iov_len);
3158 len -= PAGE_CACHE_SIZE;
3159 } else if (len > 0) {
3160 /* enough for partial page, fill and zero the rest */
3161 iov.iov_base = kmap(page);
3162 iov.iov_len = len;
3163 cifs_dbg(FYI, "%u: idx=%lu iov_base=%p iov_len=%zu\n",
3164 i, page->index, iov.iov_base, iov.iov_len);
3165 memset(iov.iov_base + len,
3166 '\0', PAGE_CACHE_SIZE - len);
3167 rdata->tailsz = len;
3168 len = 0;
3169 } else if (page->index > eof_index) {
3171 * The VFS will not try to do readahead past the
3172 * i_size, but it's possible that we have outstanding
3173 * writes with gaps in the middle and the i_size hasn't
3174 * caught up yet. Populate those with zeroed out pages
3175 * to prevent the VFS from repeatedly attempting to
3176 * fill them until the writes are flushed.
3178 zero_user(page, 0, PAGE_CACHE_SIZE);
3179 lru_cache_add_file(page);
3180 flush_dcache_page(page);
3181 SetPageUptodate(page);
3182 unlock_page(page);
3183 page_cache_release(page);
3184 rdata->pages[i] = NULL;
3185 rdata->nr_pages--;
3186 continue;
3187 } else {
3188 /* no need to hold page hostage */
3189 lru_cache_add_file(page);
3190 unlock_page(page);
3191 page_cache_release(page);
3192 rdata->pages[i] = NULL;
3193 rdata->nr_pages--;
3194 continue;
3197 result = cifs_readv_from_socket(server, &iov, 1, iov.iov_len);
3198 kunmap(page);
3199 if (result < 0)
3200 break;
3202 total_read += result;
3205 return total_read > 0 ? total_read : result;
3208 static int cifs_readpages(struct file *file, struct address_space *mapping,
3209 struct list_head *page_list, unsigned num_pages)
3211 int rc;
3212 struct list_head tmplist;
3213 struct cifsFileInfo *open_file = file->private_data;
3214 struct cifs_sb_info *cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
3215 unsigned int rsize = cifs_sb->rsize;
3216 pid_t pid;
3219 * Give up immediately if rsize is too small to read an entire page.
3220 * The VFS will fall back to readpage. We should never reach this
3221 * point however since we set ra_pages to 0 when the rsize is smaller
3222 * than a cache page.
3224 if (unlikely(rsize < PAGE_CACHE_SIZE))
3225 return 0;
3228 * Reads as many pages as possible from fscache. Returns -ENOBUFS
3229 * immediately if the cookie is negative
3231 rc = cifs_readpages_from_fscache(mapping->host, mapping, page_list,
3232 &num_pages);
3233 if (rc == 0)
3234 return rc;
3236 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD)
3237 pid = open_file->pid;
3238 else
3239 pid = current->tgid;
3241 rc = 0;
3242 INIT_LIST_HEAD(&tmplist);
3244 cifs_dbg(FYI, "%s: file=%p mapping=%p num_pages=%u\n",
3245 __func__, file, mapping, num_pages);
3248 * Start with the page at end of list and move it to private
3249 * list. Do the same with any following pages until we hit
3250 * the rsize limit, hit an index discontinuity, or run out of
3251 * pages. Issue the async read and then start the loop again
3252 * until the list is empty.
3254 * Note that list order is important. The page_list is in
3255 * the order of declining indexes. When we put the pages in
3256 * the rdata->pages, then we want them in increasing order.
3258 while (!list_empty(page_list)) {
3259 unsigned int i;
3260 unsigned int bytes = PAGE_CACHE_SIZE;
3261 unsigned int expected_index;
3262 unsigned int nr_pages = 1;
3263 loff_t offset;
3264 struct page *page, *tpage;
3265 struct cifs_readdata *rdata;
3267 page = list_entry(page_list->prev, struct page, lru);
3270 * Lock the page and put it in the cache. Since no one else
3271 * should have access to this page, we're safe to simply set
3272 * PG_locked without checking it first.
3274 __set_page_locked(page);
3275 rc = add_to_page_cache_locked(page, mapping,
3276 page->index, GFP_KERNEL);
3278 /* give up if we can't stick it in the cache */
3279 if (rc) {
3280 __clear_page_locked(page);
3281 break;
3284 /* move first page to the tmplist */
3285 offset = (loff_t)page->index << PAGE_CACHE_SHIFT;
3286 list_move_tail(&page->lru, &tmplist);
3288 /* now try and add more pages onto the request */
3289 expected_index = page->index + 1;
3290 list_for_each_entry_safe_reverse(page, tpage, page_list, lru) {
3291 /* discontinuity ? */
3292 if (page->index != expected_index)
3293 break;
3295 /* would this page push the read over the rsize? */
3296 if (bytes + PAGE_CACHE_SIZE > rsize)
3297 break;
3299 __set_page_locked(page);
3300 if (add_to_page_cache_locked(page, mapping,
3301 page->index, GFP_KERNEL)) {
3302 __clear_page_locked(page);
3303 break;
3305 list_move_tail(&page->lru, &tmplist);
3306 bytes += PAGE_CACHE_SIZE;
3307 expected_index++;
3308 nr_pages++;
3311 rdata = cifs_readdata_alloc(nr_pages, cifs_readv_complete);
3312 if (!rdata) {
3313 /* best to give up if we're out of mem */
3314 list_for_each_entry_safe(page, tpage, &tmplist, lru) {
3315 list_del(&page->lru);
3316 lru_cache_add_file(page);
3317 unlock_page(page);
3318 page_cache_release(page);
3320 rc = -ENOMEM;
3321 break;
3324 rdata->cfile = cifsFileInfo_get(open_file);
3325 rdata->mapping = mapping;
3326 rdata->offset = offset;
3327 rdata->bytes = bytes;
3328 rdata->pid = pid;
3329 rdata->pagesz = PAGE_CACHE_SIZE;
3330 rdata->read_into_pages = cifs_readpages_read_into_pages;
3332 list_for_each_entry_safe(page, tpage, &tmplist, lru) {
3333 list_del(&page->lru);
3334 rdata->pages[rdata->nr_pages++] = page;
3337 rc = cifs_retry_async_readv(rdata);
3338 if (rc != 0) {
3339 for (i = 0; i < rdata->nr_pages; i++) {
3340 page = rdata->pages[i];
3341 lru_cache_add_file(page);
3342 unlock_page(page);
3343 page_cache_release(page);
3345 kref_put(&rdata->refcount, cifs_readdata_release);
3346 break;
3349 kref_put(&rdata->refcount, cifs_readdata_release);
3352 return rc;
3355 static int cifs_readpage_worker(struct file *file, struct page *page,
3356 loff_t *poffset)
3358 char *read_data;
3359 int rc;
3361 /* Is the page cached? */
3362 rc = cifs_readpage_from_fscache(file_inode(file), page);
3363 if (rc == 0)
3364 goto read_complete;
3366 page_cache_get(page);
3367 read_data = kmap(page);
3368 /* for reads over a certain size could initiate async read ahead */
3370 rc = cifs_read(file, read_data, PAGE_CACHE_SIZE, poffset);
3372 if (rc < 0)
3373 goto io_error;
3374 else
3375 cifs_dbg(FYI, "Bytes read %d\n", rc);
3377 file_inode(file)->i_atime =
3378 current_fs_time(file_inode(file)->i_sb);
3380 if (PAGE_CACHE_SIZE > rc)
3381 memset(read_data + rc, 0, PAGE_CACHE_SIZE - rc);
3383 flush_dcache_page(page);
3384 SetPageUptodate(page);
3386 /* send this page to the cache */
3387 cifs_readpage_to_fscache(file_inode(file), page);
3389 rc = 0;
3391 io_error:
3392 kunmap(page);
3393 page_cache_release(page);
3395 read_complete:
3396 return rc;
3399 static int cifs_readpage(struct file *file, struct page *page)
3401 loff_t offset = (loff_t)page->index << PAGE_CACHE_SHIFT;
3402 int rc = -EACCES;
3403 unsigned int xid;
3405 xid = get_xid();
3407 if (file->private_data == NULL) {
3408 rc = -EBADF;
3409 free_xid(xid);
3410 return rc;
3413 cifs_dbg(FYI, "readpage %p at offset %d 0x%x\n",
3414 page, (int)offset, (int)offset);
3416 rc = cifs_readpage_worker(file, page, &offset);
3418 unlock_page(page);
3420 free_xid(xid);
3421 return rc;
3424 static int is_inode_writable(struct cifsInodeInfo *cifs_inode)
3426 struct cifsFileInfo *open_file;
3428 spin_lock(&cifs_file_list_lock);
3429 list_for_each_entry(open_file, &cifs_inode->openFileList, flist) {
3430 if (OPEN_FMODE(open_file->f_flags) & FMODE_WRITE) {
3431 spin_unlock(&cifs_file_list_lock);
3432 return 1;
3435 spin_unlock(&cifs_file_list_lock);
3436 return 0;
3439 /* We do not want to update the file size from server for inodes
3440 open for write - to avoid races with writepage extending
3441 the file - in the future we could consider allowing
3442 refreshing the inode only on increases in the file size
3443 but this is tricky to do without racing with writebehind
3444 page caching in the current Linux kernel design */
3445 bool is_size_safe_to_change(struct cifsInodeInfo *cifsInode, __u64 end_of_file)
3447 if (!cifsInode)
3448 return true;
3450 if (is_inode_writable(cifsInode)) {
3451 /* This inode is open for write at least once */
3452 struct cifs_sb_info *cifs_sb;
3454 cifs_sb = CIFS_SB(cifsInode->vfs_inode.i_sb);
3455 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) {
3456 /* since no page cache to corrupt on directio
3457 we can change size safely */
3458 return true;
3461 if (i_size_read(&cifsInode->vfs_inode) < end_of_file)
3462 return true;
3464 return false;
3465 } else
3466 return true;
3469 static int cifs_write_begin(struct file *file, struct address_space *mapping,
3470 loff_t pos, unsigned len, unsigned flags,
3471 struct page **pagep, void **fsdata)
3473 pgoff_t index = pos >> PAGE_CACHE_SHIFT;
3474 loff_t offset = pos & (PAGE_CACHE_SIZE - 1);
3475 loff_t page_start = pos & PAGE_MASK;
3476 loff_t i_size;
3477 struct page *page;
3478 int rc = 0;
3480 cifs_dbg(FYI, "write_begin from %lld len %d\n", (long long)pos, len);
3482 page = grab_cache_page_write_begin(mapping, index, flags);
3483 if (!page) {
3484 rc = -ENOMEM;
3485 goto out;
3488 if (PageUptodate(page))
3489 goto out;
3492 * If we write a full page it will be up to date, no need to read from
3493 * the server. If the write is short, we'll end up doing a sync write
3494 * instead.
3496 if (len == PAGE_CACHE_SIZE)
3497 goto out;
3500 * optimize away the read when we have an oplock, and we're not
3501 * expecting to use any of the data we'd be reading in. That
3502 * is, when the page lies beyond the EOF, or straddles the EOF
3503 * and the write will cover all of the existing data.
3505 if (CIFS_I(mapping->host)->clientCanCacheRead) {
3506 i_size = i_size_read(mapping->host);
3507 if (page_start >= i_size ||
3508 (offset == 0 && (pos + len) >= i_size)) {
3509 zero_user_segments(page, 0, offset,
3510 offset + len,
3511 PAGE_CACHE_SIZE);
3513 * PageChecked means that the parts of the page
3514 * to which we're not writing are considered up
3515 * to date. Once the data is copied to the
3516 * page, it can be set uptodate.
3518 SetPageChecked(page);
3519 goto out;
3523 if ((file->f_flags & O_ACCMODE) != O_WRONLY) {
3525 * might as well read a page, it is fast enough. If we get
3526 * an error, we don't need to return it. cifs_write_end will
3527 * do a sync write instead since PG_uptodate isn't set.
3529 cifs_readpage_worker(file, page, &page_start);
3530 } else {
3531 /* we could try using another file handle if there is one -
3532 but how would we lock it to prevent close of that handle
3533 racing with this read? In any case
3534 this will be written out by write_end so is fine */
3536 out:
3537 *pagep = page;
3538 return rc;
3541 static int cifs_release_page(struct page *page, gfp_t gfp)
3543 if (PagePrivate(page))
3544 return 0;
3546 return cifs_fscache_release_page(page, gfp);
3549 static void cifs_invalidate_page(struct page *page, unsigned long offset)
3551 struct cifsInodeInfo *cifsi = CIFS_I(page->mapping->host);
3553 if (offset == 0)
3554 cifs_fscache_invalidate_page(page, &cifsi->vfs_inode);
3557 static int cifs_launder_page(struct page *page)
3559 int rc = 0;
3560 loff_t range_start = page_offset(page);
3561 loff_t range_end = range_start + (loff_t)(PAGE_CACHE_SIZE - 1);
3562 struct writeback_control wbc = {
3563 .sync_mode = WB_SYNC_ALL,
3564 .nr_to_write = 0,
3565 .range_start = range_start,
3566 .range_end = range_end,
3569 cifs_dbg(FYI, "Launder page: %p\n", page);
3571 if (clear_page_dirty_for_io(page))
3572 rc = cifs_writepage_locked(page, &wbc);
3574 cifs_fscache_invalidate_page(page, page->mapping->host);
3575 return rc;
3578 void cifs_oplock_break(struct work_struct *work)
3580 struct cifsFileInfo *cfile = container_of(work, struct cifsFileInfo,
3581 oplock_break);
3582 struct inode *inode = cfile->dentry->d_inode;
3583 struct cifsInodeInfo *cinode = CIFS_I(inode);
3584 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
3585 int rc = 0;
3587 if (!cinode->clientCanCacheAll && cinode->clientCanCacheRead &&
3588 cifs_has_mand_locks(cinode)) {
3589 cifs_dbg(FYI, "Reset oplock to None for inode=%p due to mand locks\n",
3590 inode);
3591 cinode->clientCanCacheRead = false;
3594 if (inode && S_ISREG(inode->i_mode)) {
3595 if (cinode->clientCanCacheRead)
3596 break_lease(inode, O_RDONLY);
3597 else
3598 break_lease(inode, O_WRONLY);
3599 rc = filemap_fdatawrite(inode->i_mapping);
3600 if (cinode->clientCanCacheRead == 0) {
3601 rc = filemap_fdatawait(inode->i_mapping);
3602 mapping_set_error(inode->i_mapping, rc);
3603 cifs_invalidate_mapping(inode);
3605 cifs_dbg(FYI, "Oplock flush inode %p rc %d\n", inode, rc);
3608 rc = cifs_push_locks(cfile);
3609 if (rc)
3610 cifs_dbg(VFS, "Push locks rc = %d\n", rc);
3613 * releasing stale oplock after recent reconnect of smb session using
3614 * a now incorrect file handle is not a data integrity issue but do
3615 * not bother sending an oplock release if session to server still is
3616 * disconnected since oplock already released by the server
3618 if (!cfile->oplock_break_cancelled) {
3619 rc = tcon->ses->server->ops->oplock_response(tcon, &cfile->fid,
3620 cinode);
3621 cifs_dbg(FYI, "Oplock release rc = %d\n", rc);
3625 const struct address_space_operations cifs_addr_ops = {
3626 .readpage = cifs_readpage,
3627 .readpages = cifs_readpages,
3628 .writepage = cifs_writepage,
3629 .writepages = cifs_writepages,
3630 .write_begin = cifs_write_begin,
3631 .write_end = cifs_write_end,
3632 .set_page_dirty = __set_page_dirty_nobuffers,
3633 .releasepage = cifs_release_page,
3634 .invalidatepage = cifs_invalidate_page,
3635 .launder_page = cifs_launder_page,
3639 * cifs_readpages requires the server to support a buffer large enough to
3640 * contain the header plus one complete page of data. Otherwise, we need
3641 * to leave cifs_readpages out of the address space operations.
3643 const struct address_space_operations cifs_addr_ops_smallbuf = {
3644 .readpage = cifs_readpage,
3645 .writepage = cifs_writepage,
3646 .writepages = cifs_writepages,
3647 .write_begin = cifs_write_begin,
3648 .write_end = cifs_write_end,
3649 .set_page_dirty = __set_page_dirty_nobuffers,
3650 .releasepage = cifs_release_page,
3651 .invalidatepage = cifs_invalidate_page,
3652 .launder_page = cifs_launder_page,