Merge branch 'for_3.8-rc1' into v4l_for_linus
[deliverable/linux.git] / fs / cifs / file.c
1 /*
2 * fs/cifs/file.c
3 *
4 * vfs operations that deal with files
5 *
6 * Copyright (C) International Business Machines Corp., 2002,2010
7 * Author(s): Steve French (sfrench@us.ibm.com)
8 * Jeremy Allison (jra@samba.org)
9 *
10 * This library is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU Lesser General Public License as published
12 * by the Free Software Foundation; either version 2.1 of the License, or
13 * (at your option) any later version.
14 *
15 * This library is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
18 * the GNU Lesser General Public License for more details.
19 *
20 * You should have received a copy of the GNU Lesser General Public License
21 * along with this library; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 */
24 #include <linux/fs.h>
25 #include <linux/backing-dev.h>
26 #include <linux/stat.h>
27 #include <linux/fcntl.h>
28 #include <linux/pagemap.h>
29 #include <linux/pagevec.h>
30 #include <linux/writeback.h>
31 #include <linux/task_io_accounting_ops.h>
32 #include <linux/delay.h>
33 #include <linux/mount.h>
34 #include <linux/slab.h>
35 #include <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"
45
46 static inline int cifs_convert_flags(unsigned int flags)
47 {
48 if ((flags & O_ACCMODE) == O_RDONLY)
49 return GENERIC_READ;
50 else if ((flags & O_ACCMODE) == O_WRONLY)
51 return GENERIC_WRITE;
52 else if ((flags & O_ACCMODE) == O_RDWR) {
53 /* GENERIC_ALL is too much permission to request
54 can cause unnecessary access denied on create */
55 /* return GENERIC_ALL; */
56 return (GENERIC_READ | GENERIC_WRITE);
57 }
58
59 return (READ_CONTROL | FILE_WRITE_ATTRIBUTES | FILE_READ_ATTRIBUTES |
60 FILE_WRITE_EA | FILE_APPEND_DATA | FILE_WRITE_DATA |
61 FILE_READ_DATA);
62 }
63
64 static u32 cifs_posix_convert_flags(unsigned int flags)
65 {
66 u32 posix_flags = 0;
67
68 if ((flags & O_ACCMODE) == O_RDONLY)
69 posix_flags = SMB_O_RDONLY;
70 else if ((flags & O_ACCMODE) == O_WRONLY)
71 posix_flags = SMB_O_WRONLY;
72 else if ((flags & O_ACCMODE) == O_RDWR)
73 posix_flags = SMB_O_RDWR;
74
75 if (flags & O_CREAT)
76 posix_flags |= SMB_O_CREAT;
77 if (flags & O_EXCL)
78 posix_flags |= SMB_O_EXCL;
79 if (flags & O_TRUNC)
80 posix_flags |= SMB_O_TRUNC;
81 /* be safe and imply O_SYNC for O_DSYNC */
82 if (flags & O_DSYNC)
83 posix_flags |= SMB_O_SYNC;
84 if (flags & O_DIRECTORY)
85 posix_flags |= SMB_O_DIRECTORY;
86 if (flags & O_NOFOLLOW)
87 posix_flags |= SMB_O_NOFOLLOW;
88 if (flags & O_DIRECT)
89 posix_flags |= SMB_O_DIRECT;
90
91 return posix_flags;
92 }
93
94 static inline int cifs_get_disposition(unsigned int flags)
95 {
96 if ((flags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL))
97 return FILE_CREATE;
98 else if ((flags & (O_CREAT | O_TRUNC)) == (O_CREAT | O_TRUNC))
99 return FILE_OVERWRITE_IF;
100 else if ((flags & O_CREAT) == O_CREAT)
101 return FILE_OPEN_IF;
102 else if ((flags & O_TRUNC) == O_TRUNC)
103 return FILE_OVERWRITE;
104 else
105 return FILE_OPEN;
106 }
107
108 int cifs_posix_open(char *full_path, struct inode **pinode,
109 struct super_block *sb, int mode, unsigned int f_flags,
110 __u32 *poplock, __u16 *pnetfid, unsigned int xid)
111 {
112 int rc;
113 FILE_UNIX_BASIC_INFO *presp_data;
114 __u32 posix_flags = 0;
115 struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
116 struct cifs_fattr fattr;
117 struct tcon_link *tlink;
118 struct cifs_tcon *tcon;
119
120 cFYI(1, "posix open %s", full_path);
121
122 presp_data = kzalloc(sizeof(FILE_UNIX_BASIC_INFO), GFP_KERNEL);
123 if (presp_data == NULL)
124 return -ENOMEM;
125
126 tlink = cifs_sb_tlink(cifs_sb);
127 if (IS_ERR(tlink)) {
128 rc = PTR_ERR(tlink);
129 goto posix_open_ret;
130 }
131
132 tcon = tlink_tcon(tlink);
133 mode &= ~current_umask();
134
135 posix_flags = cifs_posix_convert_flags(f_flags);
136 rc = CIFSPOSIXCreate(xid, tcon, posix_flags, mode, pnetfid, presp_data,
137 poplock, full_path, cifs_sb->local_nls,
138 cifs_sb->mnt_cifs_flags &
139 CIFS_MOUNT_MAP_SPECIAL_CHR);
140 cifs_put_tlink(tlink);
141
142 if (rc)
143 goto posix_open_ret;
144
145 if (presp_data->Type == cpu_to_le32(-1))
146 goto posix_open_ret; /* open ok, caller does qpathinfo */
147
148 if (!pinode)
149 goto posix_open_ret; /* caller does not need info */
150
151 cifs_unix_basic_to_fattr(&fattr, presp_data, cifs_sb);
152
153 /* get new inode and set it up */
154 if (*pinode == NULL) {
155 cifs_fill_uniqueid(sb, &fattr);
156 *pinode = cifs_iget(sb, &fattr);
157 if (!*pinode) {
158 rc = -ENOMEM;
159 goto posix_open_ret;
160 }
161 } else {
162 cifs_fattr_to_inode(*pinode, &fattr);
163 }
164
165 posix_open_ret:
166 kfree(presp_data);
167 return rc;
168 }
169
170 static int
171 cifs_nt_open(char *full_path, struct inode *inode, struct cifs_sb_info *cifs_sb,
172 struct cifs_tcon *tcon, unsigned int f_flags, __u32 *oplock,
173 struct cifs_fid *fid, unsigned int xid)
174 {
175 int rc;
176 int desired_access;
177 int disposition;
178 int create_options = CREATE_NOT_DIR;
179 FILE_ALL_INFO *buf;
180 struct TCP_Server_Info *server = tcon->ses->server;
181
182 if (!server->ops->open)
183 return -ENOSYS;
184
185 desired_access = cifs_convert_flags(f_flags);
186
187 /*********************************************************************
188 * open flag mapping table:
189 *
190 * POSIX Flag CIFS Disposition
191 * ---------- ----------------
192 * O_CREAT FILE_OPEN_IF
193 * O_CREAT | O_EXCL FILE_CREATE
194 * O_CREAT | O_TRUNC FILE_OVERWRITE_IF
195 * O_TRUNC FILE_OVERWRITE
196 * none of the above FILE_OPEN
197 *
198 * Note that there is not a direct match between disposition
199 * FILE_SUPERSEDE (ie create whether or not file exists although
200 * O_CREAT | O_TRUNC is similar but truncates the existing
201 * file rather than creating a new file as FILE_SUPERSEDE does
202 * (which uses the attributes / metadata passed in on open call)
203 *?
204 *? O_SYNC is a reasonable match to CIFS writethrough flag
205 *? and the read write flags match reasonably. O_LARGEFILE
206 *? is irrelevant because largefile support is always used
207 *? by this client. Flags O_APPEND, O_DIRECT, O_DIRECTORY,
208 * O_FASYNC, O_NOFOLLOW, O_NONBLOCK need further investigation
209 *********************************************************************/
210
211 disposition = cifs_get_disposition(f_flags);
212
213 /* BB pass O_SYNC flag through on file attributes .. BB */
214
215 buf = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
216 if (!buf)
217 return -ENOMEM;
218
219 if (backup_cred(cifs_sb))
220 create_options |= CREATE_OPEN_BACKUP_INTENT;
221
222 rc = server->ops->open(xid, tcon, full_path, disposition,
223 desired_access, create_options, fid, oplock, buf,
224 cifs_sb);
225
226 if (rc)
227 goto out;
228
229 if (tcon->unix_ext)
230 rc = cifs_get_inode_info_unix(&inode, full_path, inode->i_sb,
231 xid);
232 else
233 rc = cifs_get_inode_info(&inode, full_path, buf, inode->i_sb,
234 xid, &fid->netfid);
235
236 out:
237 kfree(buf);
238 return rc;
239 }
240
241 struct cifsFileInfo *
242 cifs_new_fileinfo(struct cifs_fid *fid, struct file *file,
243 struct tcon_link *tlink, __u32 oplock)
244 {
245 struct dentry *dentry = file->f_path.dentry;
246 struct inode *inode = dentry->d_inode;
247 struct cifsInodeInfo *cinode = CIFS_I(inode);
248 struct cifsFileInfo *cfile;
249 struct cifs_fid_locks *fdlocks;
250 struct cifs_tcon *tcon = tlink_tcon(tlink);
251
252 cfile = kzalloc(sizeof(struct cifsFileInfo), GFP_KERNEL);
253 if (cfile == NULL)
254 return cfile;
255
256 fdlocks = kzalloc(sizeof(struct cifs_fid_locks), GFP_KERNEL);
257 if (!fdlocks) {
258 kfree(cfile);
259 return NULL;
260 }
261
262 INIT_LIST_HEAD(&fdlocks->locks);
263 fdlocks->cfile = cfile;
264 cfile->llist = fdlocks;
265 down_write(&cinode->lock_sem);
266 list_add(&fdlocks->llist, &cinode->llist);
267 up_write(&cinode->lock_sem);
268
269 cfile->count = 1;
270 cfile->pid = current->tgid;
271 cfile->uid = current_fsuid();
272 cfile->dentry = dget(dentry);
273 cfile->f_flags = file->f_flags;
274 cfile->invalidHandle = false;
275 cfile->tlink = cifs_get_tlink(tlink);
276 INIT_WORK(&cfile->oplock_break, cifs_oplock_break);
277 mutex_init(&cfile->fh_mutex);
278
279 spin_lock(&cifs_file_list_lock);
280 if (fid->pending_open->oplock != CIFS_OPLOCK_NO_CHANGE)
281 oplock = fid->pending_open->oplock;
282 list_del(&fid->pending_open->olist);
283
284 tlink_tcon(tlink)->ses->server->ops->set_fid(cfile, fid, oplock);
285
286 list_add(&cfile->tlist, &tcon->openFileList);
287 /* if readable file instance put first in list*/
288 if (file->f_mode & FMODE_READ)
289 list_add(&cfile->flist, &cinode->openFileList);
290 else
291 list_add_tail(&cfile->flist, &cinode->openFileList);
292 spin_unlock(&cifs_file_list_lock);
293
294 file->private_data = cfile;
295 return cfile;
296 }
297
298 struct cifsFileInfo *
299 cifsFileInfo_get(struct cifsFileInfo *cifs_file)
300 {
301 spin_lock(&cifs_file_list_lock);
302 cifsFileInfo_get_locked(cifs_file);
303 spin_unlock(&cifs_file_list_lock);
304 return cifs_file;
305 }
306
307 /*
308 * Release a reference on the file private data. This may involve closing
309 * the filehandle out on the server. Must be called without holding
310 * cifs_file_list_lock.
311 */
312 void cifsFileInfo_put(struct cifsFileInfo *cifs_file)
313 {
314 struct inode *inode = cifs_file->dentry->d_inode;
315 struct cifs_tcon *tcon = tlink_tcon(cifs_file->tlink);
316 struct TCP_Server_Info *server = tcon->ses->server;
317 struct cifsInodeInfo *cifsi = CIFS_I(inode);
318 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
319 struct cifsLockInfo *li, *tmp;
320 struct cifs_fid fid;
321 struct cifs_pending_open open;
322
323 spin_lock(&cifs_file_list_lock);
324 if (--cifs_file->count > 0) {
325 spin_unlock(&cifs_file_list_lock);
326 return;
327 }
328
329 if (server->ops->get_lease_key)
330 server->ops->get_lease_key(inode, &fid);
331
332 /* store open in pending opens to make sure we don't miss lease break */
333 cifs_add_pending_open_locked(&fid, cifs_file->tlink, &open);
334
335 /* remove it from the lists */
336 list_del(&cifs_file->flist);
337 list_del(&cifs_file->tlist);
338
339 if (list_empty(&cifsi->openFileList)) {
340 cFYI(1, "closing last open instance for inode %p",
341 cifs_file->dentry->d_inode);
342 /*
343 * In strict cache mode we need invalidate mapping on the last
344 * close because it may cause a error when we open this file
345 * again and get at least level II oplock.
346 */
347 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO)
348 CIFS_I(inode)->invalid_mapping = true;
349 cifs_set_oplock_level(cifsi, 0);
350 }
351 spin_unlock(&cifs_file_list_lock);
352
353 cancel_work_sync(&cifs_file->oplock_break);
354
355 if (!tcon->need_reconnect && !cifs_file->invalidHandle) {
356 struct TCP_Server_Info *server = tcon->ses->server;
357 unsigned int xid;
358
359 xid = get_xid();
360 if (server->ops->close)
361 server->ops->close(xid, tcon, &cifs_file->fid);
362 _free_xid(xid);
363 }
364
365 cifs_del_pending_open(&open);
366
367 /*
368 * Delete any outstanding lock records. We'll lose them when the file
369 * is closed anyway.
370 */
371 down_write(&cifsi->lock_sem);
372 list_for_each_entry_safe(li, tmp, &cifs_file->llist->locks, llist) {
373 list_del(&li->llist);
374 cifs_del_lock_waiters(li);
375 kfree(li);
376 }
377 list_del(&cifs_file->llist->llist);
378 kfree(cifs_file->llist);
379 up_write(&cifsi->lock_sem);
380
381 cifs_put_tlink(cifs_file->tlink);
382 dput(cifs_file->dentry);
383 kfree(cifs_file);
384 }
385
386 int cifs_open(struct inode *inode, struct file *file)
387
388 {
389 int rc = -EACCES;
390 unsigned int xid;
391 __u32 oplock;
392 struct cifs_sb_info *cifs_sb;
393 struct TCP_Server_Info *server;
394 struct cifs_tcon *tcon;
395 struct tcon_link *tlink;
396 struct cifsFileInfo *cfile = NULL;
397 char *full_path = NULL;
398 bool posix_open_ok = false;
399 struct cifs_fid fid;
400 struct cifs_pending_open open;
401
402 xid = get_xid();
403
404 cifs_sb = CIFS_SB(inode->i_sb);
405 tlink = cifs_sb_tlink(cifs_sb);
406 if (IS_ERR(tlink)) {
407 free_xid(xid);
408 return PTR_ERR(tlink);
409 }
410 tcon = tlink_tcon(tlink);
411 server = tcon->ses->server;
412
413 full_path = build_path_from_dentry(file->f_path.dentry);
414 if (full_path == NULL) {
415 rc = -ENOMEM;
416 goto out;
417 }
418
419 cFYI(1, "inode = 0x%p file flags are 0x%x for %s",
420 inode, file->f_flags, full_path);
421
422 if (server->oplocks)
423 oplock = REQ_OPLOCK;
424 else
425 oplock = 0;
426
427 if (!tcon->broken_posix_open && tcon->unix_ext &&
428 cap_unix(tcon->ses) && (CIFS_UNIX_POSIX_PATH_OPS_CAP &
429 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
430 /* can not refresh inode info since size could be stale */
431 rc = cifs_posix_open(full_path, &inode, inode->i_sb,
432 cifs_sb->mnt_file_mode /* ignored */,
433 file->f_flags, &oplock, &fid.netfid, xid);
434 if (rc == 0) {
435 cFYI(1, "posix open succeeded");
436 posix_open_ok = true;
437 } else if ((rc == -EINVAL) || (rc == -EOPNOTSUPP)) {
438 if (tcon->ses->serverNOS)
439 cERROR(1, "server %s of type %s returned"
440 " unexpected error on SMB posix open"
441 ", disabling posix open support."
442 " Check if server update available.",
443 tcon->ses->serverName,
444 tcon->ses->serverNOS);
445 tcon->broken_posix_open = true;
446 } else if ((rc != -EIO) && (rc != -EREMOTE) &&
447 (rc != -EOPNOTSUPP)) /* path not found or net err */
448 goto out;
449 /*
450 * Else fallthrough to retry open the old way on network i/o
451 * or DFS errors.
452 */
453 }
454
455 if (server->ops->get_lease_key)
456 server->ops->get_lease_key(inode, &fid);
457
458 cifs_add_pending_open(&fid, tlink, &open);
459
460 if (!posix_open_ok) {
461 if (server->ops->get_lease_key)
462 server->ops->get_lease_key(inode, &fid);
463
464 rc = cifs_nt_open(full_path, inode, cifs_sb, tcon,
465 file->f_flags, &oplock, &fid, xid);
466 if (rc) {
467 cifs_del_pending_open(&open);
468 goto out;
469 }
470 }
471
472 cfile = cifs_new_fileinfo(&fid, file, tlink, oplock);
473 if (cfile == NULL) {
474 if (server->ops->close)
475 server->ops->close(xid, tcon, &fid);
476 cifs_del_pending_open(&open);
477 rc = -ENOMEM;
478 goto out;
479 }
480
481 cifs_fscache_set_inode_cookie(inode, file);
482
483 if ((oplock & CIFS_CREATE_ACTION) && !posix_open_ok && tcon->unix_ext) {
484 /*
485 * Time to set mode which we can not set earlier due to
486 * problems creating new read-only files.
487 */
488 struct cifs_unix_set_info_args args = {
489 .mode = inode->i_mode,
490 .uid = NO_CHANGE_64,
491 .gid = NO_CHANGE_64,
492 .ctime = NO_CHANGE_64,
493 .atime = NO_CHANGE_64,
494 .mtime = NO_CHANGE_64,
495 .device = 0,
496 };
497 CIFSSMBUnixSetFileInfo(xid, tcon, &args, fid.netfid,
498 cfile->pid);
499 }
500
501 out:
502 kfree(full_path);
503 free_xid(xid);
504 cifs_put_tlink(tlink);
505 return rc;
506 }
507
508 /*
509 * Try to reacquire byte range locks that were released when session
510 * to server was lost
511 */
512 static int cifs_relock_file(struct cifsFileInfo *cifsFile)
513 {
514 int rc = 0;
515
516 /* BB list all locks open on this file and relock */
517
518 return rc;
519 }
520
521 static int
522 cifs_reopen_file(struct cifsFileInfo *cfile, bool can_flush)
523 {
524 int rc = -EACCES;
525 unsigned int xid;
526 __u32 oplock;
527 struct cifs_sb_info *cifs_sb;
528 struct cifs_tcon *tcon;
529 struct TCP_Server_Info *server;
530 struct cifsInodeInfo *cinode;
531 struct inode *inode;
532 char *full_path = NULL;
533 int desired_access;
534 int disposition = FILE_OPEN;
535 int create_options = CREATE_NOT_DIR;
536 struct cifs_fid fid;
537
538 xid = get_xid();
539 mutex_lock(&cfile->fh_mutex);
540 if (!cfile->invalidHandle) {
541 mutex_unlock(&cfile->fh_mutex);
542 rc = 0;
543 free_xid(xid);
544 return rc;
545 }
546
547 inode = cfile->dentry->d_inode;
548 cifs_sb = CIFS_SB(inode->i_sb);
549 tcon = tlink_tcon(cfile->tlink);
550 server = tcon->ses->server;
551
552 /*
553 * Can not grab rename sem here because various ops, including those
554 * that already have the rename sem can end up causing writepage to get
555 * called and if the server was down that means we end up here, and we
556 * can never tell if the caller already has the rename_sem.
557 */
558 full_path = build_path_from_dentry(cfile->dentry);
559 if (full_path == NULL) {
560 rc = -ENOMEM;
561 mutex_unlock(&cfile->fh_mutex);
562 free_xid(xid);
563 return rc;
564 }
565
566 cFYI(1, "inode = 0x%p file flags 0x%x for %s", inode, cfile->f_flags,
567 full_path);
568
569 if (tcon->ses->server->oplocks)
570 oplock = REQ_OPLOCK;
571 else
572 oplock = 0;
573
574 if (tcon->unix_ext && cap_unix(tcon->ses) &&
575 (CIFS_UNIX_POSIX_PATH_OPS_CAP &
576 le64_to_cpu(tcon->fsUnixInfo.Capability))) {
577 /*
578 * O_CREAT, O_EXCL and O_TRUNC already had their effect on the
579 * original open. Must mask them off for a reopen.
580 */
581 unsigned int oflags = cfile->f_flags &
582 ~(O_CREAT | O_EXCL | O_TRUNC);
583
584 rc = cifs_posix_open(full_path, NULL, inode->i_sb,
585 cifs_sb->mnt_file_mode /* ignored */,
586 oflags, &oplock, &fid.netfid, xid);
587 if (rc == 0) {
588 cFYI(1, "posix reopen succeeded");
589 goto reopen_success;
590 }
591 /*
592 * fallthrough to retry open the old way on errors, especially
593 * in the reconnect path it is important to retry hard
594 */
595 }
596
597 desired_access = cifs_convert_flags(cfile->f_flags);
598
599 if (backup_cred(cifs_sb))
600 create_options |= CREATE_OPEN_BACKUP_INTENT;
601
602 if (server->ops->get_lease_key)
603 server->ops->get_lease_key(inode, &fid);
604
605 /*
606 * Can not refresh inode by passing in file_info buf to be returned by
607 * CIFSSMBOpen and then calling get_inode_info with returned buf since
608 * file might have write behind data that needs to be flushed and server
609 * version of file size can be stale. If we knew for sure that inode was
610 * not dirty locally we could do this.
611 */
612 rc = server->ops->open(xid, tcon, full_path, disposition,
613 desired_access, create_options, &fid, &oplock,
614 NULL, cifs_sb);
615 if (rc) {
616 mutex_unlock(&cfile->fh_mutex);
617 cFYI(1, "cifs_reopen returned 0x%x", rc);
618 cFYI(1, "oplock: %d", oplock);
619 goto reopen_error_exit;
620 }
621
622 reopen_success:
623 cfile->invalidHandle = false;
624 mutex_unlock(&cfile->fh_mutex);
625 cinode = CIFS_I(inode);
626
627 if (can_flush) {
628 rc = filemap_write_and_wait(inode->i_mapping);
629 mapping_set_error(inode->i_mapping, rc);
630
631 if (tcon->unix_ext)
632 rc = cifs_get_inode_info_unix(&inode, full_path,
633 inode->i_sb, xid);
634 else
635 rc = cifs_get_inode_info(&inode, full_path, NULL,
636 inode->i_sb, xid, NULL);
637 }
638 /*
639 * Else we are writing out data to server already and could deadlock if
640 * we tried to flush data, and since we do not know if we have data that
641 * would invalidate the current end of file on the server we can not go
642 * to the server to get the new inode info.
643 */
644
645 server->ops->set_fid(cfile, &fid, oplock);
646 cifs_relock_file(cfile);
647
648 reopen_error_exit:
649 kfree(full_path);
650 free_xid(xid);
651 return rc;
652 }
653
654 int cifs_close(struct inode *inode, struct file *file)
655 {
656 if (file->private_data != NULL) {
657 cifsFileInfo_put(file->private_data);
658 file->private_data = NULL;
659 }
660
661 /* return code from the ->release op is always ignored */
662 return 0;
663 }
664
665 int cifs_closedir(struct inode *inode, struct file *file)
666 {
667 int rc = 0;
668 unsigned int xid;
669 struct cifsFileInfo *cfile = file->private_data;
670 struct cifs_tcon *tcon;
671 struct TCP_Server_Info *server;
672 char *buf;
673
674 cFYI(1, "Closedir inode = 0x%p", inode);
675
676 if (cfile == NULL)
677 return rc;
678
679 xid = get_xid();
680 tcon = tlink_tcon(cfile->tlink);
681 server = tcon->ses->server;
682
683 cFYI(1, "Freeing private data in close dir");
684 spin_lock(&cifs_file_list_lock);
685 if (!cfile->srch_inf.endOfSearch && !cfile->invalidHandle) {
686 cfile->invalidHandle = true;
687 spin_unlock(&cifs_file_list_lock);
688 if (server->ops->close_dir)
689 rc = server->ops->close_dir(xid, tcon, &cfile->fid);
690 else
691 rc = -ENOSYS;
692 cFYI(1, "Closing uncompleted readdir with rc %d", rc);
693 /* not much we can do if it fails anyway, ignore rc */
694 rc = 0;
695 } else
696 spin_unlock(&cifs_file_list_lock);
697
698 buf = cfile->srch_inf.ntwrk_buf_start;
699 if (buf) {
700 cFYI(1, "closedir free smb buf in srch struct");
701 cfile->srch_inf.ntwrk_buf_start = NULL;
702 if (cfile->srch_inf.smallBuf)
703 cifs_small_buf_release(buf);
704 else
705 cifs_buf_release(buf);
706 }
707
708 cifs_put_tlink(cfile->tlink);
709 kfree(file->private_data);
710 file->private_data = NULL;
711 /* BB can we lock the filestruct while this is going on? */
712 free_xid(xid);
713 return rc;
714 }
715
716 static struct cifsLockInfo *
717 cifs_lock_init(__u64 offset, __u64 length, __u8 type)
718 {
719 struct cifsLockInfo *lock =
720 kmalloc(sizeof(struct cifsLockInfo), GFP_KERNEL);
721 if (!lock)
722 return lock;
723 lock->offset = offset;
724 lock->length = length;
725 lock->type = type;
726 lock->pid = current->tgid;
727 INIT_LIST_HEAD(&lock->blist);
728 init_waitqueue_head(&lock->block_q);
729 return lock;
730 }
731
732 void
733 cifs_del_lock_waiters(struct cifsLockInfo *lock)
734 {
735 struct cifsLockInfo *li, *tmp;
736 list_for_each_entry_safe(li, tmp, &lock->blist, blist) {
737 list_del_init(&li->blist);
738 wake_up(&li->block_q);
739 }
740 }
741
742 static bool
743 cifs_find_fid_lock_conflict(struct cifs_fid_locks *fdlocks, __u64 offset,
744 __u64 length, __u8 type, struct cifsFileInfo *cfile,
745 struct cifsLockInfo **conf_lock, bool rw_check)
746 {
747 struct cifsLockInfo *li;
748 struct cifsFileInfo *cur_cfile = fdlocks->cfile;
749 struct TCP_Server_Info *server = tlink_tcon(cfile->tlink)->ses->server;
750
751 list_for_each_entry(li, &fdlocks->locks, llist) {
752 if (offset + length <= li->offset ||
753 offset >= li->offset + li->length)
754 continue;
755 if (rw_check && server->ops->compare_fids(cfile, cur_cfile) &&
756 current->tgid == li->pid)
757 continue;
758 if ((type & server->vals->shared_lock_type) &&
759 ((server->ops->compare_fids(cfile, cur_cfile) &&
760 current->tgid == li->pid) || type == li->type))
761 continue;
762 if (conf_lock)
763 *conf_lock = li;
764 return true;
765 }
766 return false;
767 }
768
769 bool
770 cifs_find_lock_conflict(struct cifsFileInfo *cfile, __u64 offset, __u64 length,
771 __u8 type, struct cifsLockInfo **conf_lock,
772 bool rw_check)
773 {
774 bool rc = false;
775 struct cifs_fid_locks *cur;
776 struct cifsInodeInfo *cinode = CIFS_I(cfile->dentry->d_inode);
777
778 list_for_each_entry(cur, &cinode->llist, llist) {
779 rc = cifs_find_fid_lock_conflict(cur, offset, length, type,
780 cfile, conf_lock, rw_check);
781 if (rc)
782 break;
783 }
784
785 return rc;
786 }
787
788 /*
789 * Check if there is another lock that prevents us to set the lock (mandatory
790 * style). If such a lock exists, update the flock structure with its
791 * properties. Otherwise, set the flock type to F_UNLCK if we can cache brlocks
792 * or leave it the same if we can't. Returns 0 if we don't need to request to
793 * the server or 1 otherwise.
794 */
795 static int
796 cifs_lock_test(struct cifsFileInfo *cfile, __u64 offset, __u64 length,
797 __u8 type, struct file_lock *flock)
798 {
799 int rc = 0;
800 struct cifsLockInfo *conf_lock;
801 struct cifsInodeInfo *cinode = CIFS_I(cfile->dentry->d_inode);
802 struct TCP_Server_Info *server = tlink_tcon(cfile->tlink)->ses->server;
803 bool exist;
804
805 down_read(&cinode->lock_sem);
806
807 exist = cifs_find_lock_conflict(cfile, offset, length, type,
808 &conf_lock, false);
809 if (exist) {
810 flock->fl_start = conf_lock->offset;
811 flock->fl_end = conf_lock->offset + conf_lock->length - 1;
812 flock->fl_pid = conf_lock->pid;
813 if (conf_lock->type & server->vals->shared_lock_type)
814 flock->fl_type = F_RDLCK;
815 else
816 flock->fl_type = F_WRLCK;
817 } else if (!cinode->can_cache_brlcks)
818 rc = 1;
819 else
820 flock->fl_type = F_UNLCK;
821
822 up_read(&cinode->lock_sem);
823 return rc;
824 }
825
826 static void
827 cifs_lock_add(struct cifsFileInfo *cfile, struct cifsLockInfo *lock)
828 {
829 struct cifsInodeInfo *cinode = CIFS_I(cfile->dentry->d_inode);
830 down_write(&cinode->lock_sem);
831 list_add_tail(&lock->llist, &cfile->llist->locks);
832 up_write(&cinode->lock_sem);
833 }
834
835 /*
836 * Set the byte-range lock (mandatory style). Returns:
837 * 1) 0, if we set the lock and don't need to request to the server;
838 * 2) 1, if no locks prevent us but we need to request to the server;
839 * 3) -EACCESS, if there is a lock that prevents us and wait is false.
840 */
841 static int
842 cifs_lock_add_if(struct cifsFileInfo *cfile, struct cifsLockInfo *lock,
843 bool wait)
844 {
845 struct cifsLockInfo *conf_lock;
846 struct cifsInodeInfo *cinode = CIFS_I(cfile->dentry->d_inode);
847 bool exist;
848 int rc = 0;
849
850 try_again:
851 exist = false;
852 down_write(&cinode->lock_sem);
853
854 exist = cifs_find_lock_conflict(cfile, lock->offset, lock->length,
855 lock->type, &conf_lock, false);
856 if (!exist && cinode->can_cache_brlcks) {
857 list_add_tail(&lock->llist, &cfile->llist->locks);
858 up_write(&cinode->lock_sem);
859 return rc;
860 }
861
862 if (!exist)
863 rc = 1;
864 else if (!wait)
865 rc = -EACCES;
866 else {
867 list_add_tail(&lock->blist, &conf_lock->blist);
868 up_write(&cinode->lock_sem);
869 rc = wait_event_interruptible(lock->block_q,
870 (lock->blist.prev == &lock->blist) &&
871 (lock->blist.next == &lock->blist));
872 if (!rc)
873 goto try_again;
874 down_write(&cinode->lock_sem);
875 list_del_init(&lock->blist);
876 }
877
878 up_write(&cinode->lock_sem);
879 return rc;
880 }
881
882 /*
883 * Check if there is another lock that prevents us to set the lock (posix
884 * style). If such a lock exists, update the flock structure with its
885 * properties. Otherwise, set the flock type to F_UNLCK if we can cache brlocks
886 * or leave it the same if we can't. Returns 0 if we don't need to request to
887 * the server or 1 otherwise.
888 */
889 static int
890 cifs_posix_lock_test(struct file *file, struct file_lock *flock)
891 {
892 int rc = 0;
893 struct cifsInodeInfo *cinode = CIFS_I(file->f_path.dentry->d_inode);
894 unsigned char saved_type = flock->fl_type;
895
896 if ((flock->fl_flags & FL_POSIX) == 0)
897 return 1;
898
899 down_read(&cinode->lock_sem);
900 posix_test_lock(file, flock);
901
902 if (flock->fl_type == F_UNLCK && !cinode->can_cache_brlcks) {
903 flock->fl_type = saved_type;
904 rc = 1;
905 }
906
907 up_read(&cinode->lock_sem);
908 return rc;
909 }
910
911 /*
912 * Set the byte-range lock (posix style). Returns:
913 * 1) 0, if we set the lock and don't need to request to the server;
914 * 2) 1, if we need to request to the server;
915 * 3) <0, if the error occurs while setting the lock.
916 */
917 static int
918 cifs_posix_lock_set(struct file *file, struct file_lock *flock)
919 {
920 struct cifsInodeInfo *cinode = CIFS_I(file->f_path.dentry->d_inode);
921 int rc = 1;
922
923 if ((flock->fl_flags & FL_POSIX) == 0)
924 return rc;
925
926 try_again:
927 down_write(&cinode->lock_sem);
928 if (!cinode->can_cache_brlcks) {
929 up_write(&cinode->lock_sem);
930 return rc;
931 }
932
933 rc = posix_lock_file(file, flock, NULL);
934 up_write(&cinode->lock_sem);
935 if (rc == FILE_LOCK_DEFERRED) {
936 rc = wait_event_interruptible(flock->fl_wait, !flock->fl_next);
937 if (!rc)
938 goto try_again;
939 locks_delete_block(flock);
940 }
941 return rc;
942 }
943
944 int
945 cifs_push_mandatory_locks(struct cifsFileInfo *cfile)
946 {
947 unsigned int xid;
948 int rc = 0, stored_rc;
949 struct cifsLockInfo *li, *tmp;
950 struct cifs_tcon *tcon;
951 struct cifsInodeInfo *cinode = CIFS_I(cfile->dentry->d_inode);
952 unsigned int num, max_num, max_buf;
953 LOCKING_ANDX_RANGE *buf, *cur;
954 int types[] = {LOCKING_ANDX_LARGE_FILES,
955 LOCKING_ANDX_SHARED_LOCK | LOCKING_ANDX_LARGE_FILES};
956 int i;
957
958 xid = get_xid();
959 tcon = tlink_tcon(cfile->tlink);
960
961 /* we are going to update can_cache_brlcks here - need a write access */
962 down_write(&cinode->lock_sem);
963 if (!cinode->can_cache_brlcks) {
964 up_write(&cinode->lock_sem);
965 free_xid(xid);
966 return rc;
967 }
968
969 /*
970 * Accessing maxBuf is racy with cifs_reconnect - need to store value
971 * and check it for zero before using.
972 */
973 max_buf = tcon->ses->server->maxBuf;
974 if (!max_buf) {
975 up_write(&cinode->lock_sem);
976 free_xid(xid);
977 return -EINVAL;
978 }
979
980 max_num = (max_buf - sizeof(struct smb_hdr)) /
981 sizeof(LOCKING_ANDX_RANGE);
982 buf = kzalloc(max_num * sizeof(LOCKING_ANDX_RANGE), GFP_KERNEL);
983 if (!buf) {
984 up_write(&cinode->lock_sem);
985 free_xid(xid);
986 return -ENOMEM;
987 }
988
989 for (i = 0; i < 2; i++) {
990 cur = buf;
991 num = 0;
992 list_for_each_entry_safe(li, tmp, &cfile->llist->locks, llist) {
993 if (li->type != types[i])
994 continue;
995 cur->Pid = cpu_to_le16(li->pid);
996 cur->LengthLow = cpu_to_le32((u32)li->length);
997 cur->LengthHigh = cpu_to_le32((u32)(li->length>>32));
998 cur->OffsetLow = cpu_to_le32((u32)li->offset);
999 cur->OffsetHigh = cpu_to_le32((u32)(li->offset>>32));
1000 if (++num == max_num) {
1001 stored_rc = cifs_lockv(xid, tcon,
1002 cfile->fid.netfid,
1003 (__u8)li->type, 0, num,
1004 buf);
1005 if (stored_rc)
1006 rc = stored_rc;
1007 cur = buf;
1008 num = 0;
1009 } else
1010 cur++;
1011 }
1012
1013 if (num) {
1014 stored_rc = cifs_lockv(xid, tcon, cfile->fid.netfid,
1015 (__u8)types[i], 0, num, buf);
1016 if (stored_rc)
1017 rc = stored_rc;
1018 }
1019 }
1020
1021 cinode->can_cache_brlcks = false;
1022 up_write(&cinode->lock_sem);
1023
1024 kfree(buf);
1025 free_xid(xid);
1026 return rc;
1027 }
1028
1029 /* copied from fs/locks.c with a name change */
1030 #define cifs_for_each_lock(inode, lockp) \
1031 for (lockp = &inode->i_flock; *lockp != NULL; \
1032 lockp = &(*lockp)->fl_next)
1033
1034 struct lock_to_push {
1035 struct list_head llist;
1036 __u64 offset;
1037 __u64 length;
1038 __u32 pid;
1039 __u16 netfid;
1040 __u8 type;
1041 };
1042
1043 static int
1044 cifs_push_posix_locks(struct cifsFileInfo *cfile)
1045 {
1046 struct cifsInodeInfo *cinode = CIFS_I(cfile->dentry->d_inode);
1047 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
1048 struct file_lock *flock, **before;
1049 unsigned int count = 0, i = 0;
1050 int rc = 0, xid, type;
1051 struct list_head locks_to_send, *el;
1052 struct lock_to_push *lck, *tmp;
1053 __u64 length;
1054
1055 xid = get_xid();
1056
1057 /* we are going to update can_cache_brlcks here - need a write access */
1058 down_write(&cinode->lock_sem);
1059 if (!cinode->can_cache_brlcks) {
1060 up_write(&cinode->lock_sem);
1061 free_xid(xid);
1062 return rc;
1063 }
1064
1065 lock_flocks();
1066 cifs_for_each_lock(cfile->dentry->d_inode, before) {
1067 if ((*before)->fl_flags & FL_POSIX)
1068 count++;
1069 }
1070 unlock_flocks();
1071
1072 INIT_LIST_HEAD(&locks_to_send);
1073
1074 /*
1075 * Allocating count locks is enough because no FL_POSIX locks can be
1076 * added to the list while we are holding cinode->lock_sem that
1077 * protects locking operations of this inode.
1078 */
1079 for (; i < count; i++) {
1080 lck = kmalloc(sizeof(struct lock_to_push), GFP_KERNEL);
1081 if (!lck) {
1082 rc = -ENOMEM;
1083 goto err_out;
1084 }
1085 list_add_tail(&lck->llist, &locks_to_send);
1086 }
1087
1088 el = locks_to_send.next;
1089 lock_flocks();
1090 cifs_for_each_lock(cfile->dentry->d_inode, before) {
1091 flock = *before;
1092 if ((flock->fl_flags & FL_POSIX) == 0)
1093 continue;
1094 if (el == &locks_to_send) {
1095 /*
1096 * The list ended. We don't have enough allocated
1097 * structures - something is really wrong.
1098 */
1099 cERROR(1, "Can't push all brlocks!");
1100 break;
1101 }
1102 length = 1 + flock->fl_end - flock->fl_start;
1103 if (flock->fl_type == F_RDLCK || flock->fl_type == F_SHLCK)
1104 type = CIFS_RDLCK;
1105 else
1106 type = CIFS_WRLCK;
1107 lck = list_entry(el, struct lock_to_push, llist);
1108 lck->pid = flock->fl_pid;
1109 lck->netfid = cfile->fid.netfid;
1110 lck->length = length;
1111 lck->type = type;
1112 lck->offset = flock->fl_start;
1113 el = el->next;
1114 }
1115 unlock_flocks();
1116
1117 list_for_each_entry_safe(lck, tmp, &locks_to_send, llist) {
1118 int stored_rc;
1119
1120 stored_rc = CIFSSMBPosixLock(xid, tcon, lck->netfid, lck->pid,
1121 lck->offset, lck->length, NULL,
1122 lck->type, 0);
1123 if (stored_rc)
1124 rc = stored_rc;
1125 list_del(&lck->llist);
1126 kfree(lck);
1127 }
1128
1129 out:
1130 cinode->can_cache_brlcks = false;
1131 up_write(&cinode->lock_sem);
1132
1133 free_xid(xid);
1134 return rc;
1135 err_out:
1136 list_for_each_entry_safe(lck, tmp, &locks_to_send, llist) {
1137 list_del(&lck->llist);
1138 kfree(lck);
1139 }
1140 goto out;
1141 }
1142
1143 static int
1144 cifs_push_locks(struct cifsFileInfo *cfile)
1145 {
1146 struct cifs_sb_info *cifs_sb = CIFS_SB(cfile->dentry->d_sb);
1147 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
1148
1149 if (cap_unix(tcon->ses) &&
1150 (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) &&
1151 ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0))
1152 return cifs_push_posix_locks(cfile);
1153
1154 return tcon->ses->server->ops->push_mand_locks(cfile);
1155 }
1156
1157 static void
1158 cifs_read_flock(struct file_lock *flock, __u32 *type, int *lock, int *unlock,
1159 bool *wait_flag, struct TCP_Server_Info *server)
1160 {
1161 if (flock->fl_flags & FL_POSIX)
1162 cFYI(1, "Posix");
1163 if (flock->fl_flags & FL_FLOCK)
1164 cFYI(1, "Flock");
1165 if (flock->fl_flags & FL_SLEEP) {
1166 cFYI(1, "Blocking lock");
1167 *wait_flag = true;
1168 }
1169 if (flock->fl_flags & FL_ACCESS)
1170 cFYI(1, "Process suspended by mandatory locking - "
1171 "not implemented yet");
1172 if (flock->fl_flags & FL_LEASE)
1173 cFYI(1, "Lease on file - not implemented yet");
1174 if (flock->fl_flags &
1175 (~(FL_POSIX | FL_FLOCK | FL_SLEEP |
1176 FL_ACCESS | FL_LEASE | FL_CLOSE)))
1177 cFYI(1, "Unknown lock flags 0x%x", flock->fl_flags);
1178
1179 *type = server->vals->large_lock_type;
1180 if (flock->fl_type == F_WRLCK) {
1181 cFYI(1, "F_WRLCK ");
1182 *type |= server->vals->exclusive_lock_type;
1183 *lock = 1;
1184 } else if (flock->fl_type == F_UNLCK) {
1185 cFYI(1, "F_UNLCK");
1186 *type |= server->vals->unlock_lock_type;
1187 *unlock = 1;
1188 /* Check if unlock includes more than one lock range */
1189 } else if (flock->fl_type == F_RDLCK) {
1190 cFYI(1, "F_RDLCK");
1191 *type |= server->vals->shared_lock_type;
1192 *lock = 1;
1193 } else if (flock->fl_type == F_EXLCK) {
1194 cFYI(1, "F_EXLCK");
1195 *type |= server->vals->exclusive_lock_type;
1196 *lock = 1;
1197 } else if (flock->fl_type == F_SHLCK) {
1198 cFYI(1, "F_SHLCK");
1199 *type |= server->vals->shared_lock_type;
1200 *lock = 1;
1201 } else
1202 cFYI(1, "Unknown type of lock");
1203 }
1204
1205 static int
1206 cifs_getlk(struct file *file, struct file_lock *flock, __u32 type,
1207 bool wait_flag, bool posix_lck, unsigned int xid)
1208 {
1209 int rc = 0;
1210 __u64 length = 1 + flock->fl_end - flock->fl_start;
1211 struct cifsFileInfo *cfile = (struct cifsFileInfo *)file->private_data;
1212 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
1213 struct TCP_Server_Info *server = tcon->ses->server;
1214 __u16 netfid = cfile->fid.netfid;
1215
1216 if (posix_lck) {
1217 int posix_lock_type;
1218
1219 rc = cifs_posix_lock_test(file, flock);
1220 if (!rc)
1221 return rc;
1222
1223 if (type & server->vals->shared_lock_type)
1224 posix_lock_type = CIFS_RDLCK;
1225 else
1226 posix_lock_type = CIFS_WRLCK;
1227 rc = CIFSSMBPosixLock(xid, tcon, netfid, current->tgid,
1228 flock->fl_start, length, flock,
1229 posix_lock_type, wait_flag);
1230 return rc;
1231 }
1232
1233 rc = cifs_lock_test(cfile, flock->fl_start, length, type, flock);
1234 if (!rc)
1235 return rc;
1236
1237 /* BB we could chain these into one lock request BB */
1238 rc = server->ops->mand_lock(xid, cfile, flock->fl_start, length, type,
1239 1, 0, false);
1240 if (rc == 0) {
1241 rc = server->ops->mand_lock(xid, cfile, flock->fl_start, length,
1242 type, 0, 1, false);
1243 flock->fl_type = F_UNLCK;
1244 if (rc != 0)
1245 cERROR(1, "Error unlocking previously locked "
1246 "range %d during test of lock", rc);
1247 return 0;
1248 }
1249
1250 if (type & server->vals->shared_lock_type) {
1251 flock->fl_type = F_WRLCK;
1252 return 0;
1253 }
1254
1255 type &= ~server->vals->exclusive_lock_type;
1256
1257 rc = server->ops->mand_lock(xid, cfile, flock->fl_start, length,
1258 type | server->vals->shared_lock_type,
1259 1, 0, false);
1260 if (rc == 0) {
1261 rc = server->ops->mand_lock(xid, cfile, flock->fl_start, length,
1262 type | server->vals->shared_lock_type, 0, 1, false);
1263 flock->fl_type = F_RDLCK;
1264 if (rc != 0)
1265 cERROR(1, "Error unlocking previously locked "
1266 "range %d during test of lock", rc);
1267 } else
1268 flock->fl_type = F_WRLCK;
1269
1270 return 0;
1271 }
1272
1273 void
1274 cifs_move_llist(struct list_head *source, struct list_head *dest)
1275 {
1276 struct list_head *li, *tmp;
1277 list_for_each_safe(li, tmp, source)
1278 list_move(li, dest);
1279 }
1280
1281 void
1282 cifs_free_llist(struct list_head *llist)
1283 {
1284 struct cifsLockInfo *li, *tmp;
1285 list_for_each_entry_safe(li, tmp, llist, llist) {
1286 cifs_del_lock_waiters(li);
1287 list_del(&li->llist);
1288 kfree(li);
1289 }
1290 }
1291
1292 int
1293 cifs_unlock_range(struct cifsFileInfo *cfile, struct file_lock *flock,
1294 unsigned int xid)
1295 {
1296 int rc = 0, stored_rc;
1297 int types[] = {LOCKING_ANDX_LARGE_FILES,
1298 LOCKING_ANDX_SHARED_LOCK | LOCKING_ANDX_LARGE_FILES};
1299 unsigned int i;
1300 unsigned int max_num, num, max_buf;
1301 LOCKING_ANDX_RANGE *buf, *cur;
1302 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
1303 struct cifsInodeInfo *cinode = CIFS_I(cfile->dentry->d_inode);
1304 struct cifsLockInfo *li, *tmp;
1305 __u64 length = 1 + flock->fl_end - flock->fl_start;
1306 struct list_head tmp_llist;
1307
1308 INIT_LIST_HEAD(&tmp_llist);
1309
1310 /*
1311 * Accessing maxBuf is racy with cifs_reconnect - need to store value
1312 * and check it for zero before using.
1313 */
1314 max_buf = tcon->ses->server->maxBuf;
1315 if (!max_buf)
1316 return -EINVAL;
1317
1318 max_num = (max_buf - sizeof(struct smb_hdr)) /
1319 sizeof(LOCKING_ANDX_RANGE);
1320 buf = kzalloc(max_num * sizeof(LOCKING_ANDX_RANGE), GFP_KERNEL);
1321 if (!buf)
1322 return -ENOMEM;
1323
1324 down_write(&cinode->lock_sem);
1325 for (i = 0; i < 2; i++) {
1326 cur = buf;
1327 num = 0;
1328 list_for_each_entry_safe(li, tmp, &cfile->llist->locks, llist) {
1329 if (flock->fl_start > li->offset ||
1330 (flock->fl_start + length) <
1331 (li->offset + li->length))
1332 continue;
1333 if (current->tgid != li->pid)
1334 continue;
1335 if (types[i] != li->type)
1336 continue;
1337 if (cinode->can_cache_brlcks) {
1338 /*
1339 * We can cache brlock requests - simply remove
1340 * a lock from the file's list.
1341 */
1342 list_del(&li->llist);
1343 cifs_del_lock_waiters(li);
1344 kfree(li);
1345 continue;
1346 }
1347 cur->Pid = cpu_to_le16(li->pid);
1348 cur->LengthLow = cpu_to_le32((u32)li->length);
1349 cur->LengthHigh = cpu_to_le32((u32)(li->length>>32));
1350 cur->OffsetLow = cpu_to_le32((u32)li->offset);
1351 cur->OffsetHigh = cpu_to_le32((u32)(li->offset>>32));
1352 /*
1353 * We need to save a lock here to let us add it again to
1354 * the file's list if the unlock range request fails on
1355 * the server.
1356 */
1357 list_move(&li->llist, &tmp_llist);
1358 if (++num == max_num) {
1359 stored_rc = cifs_lockv(xid, tcon,
1360 cfile->fid.netfid,
1361 li->type, num, 0, buf);
1362 if (stored_rc) {
1363 /*
1364 * We failed on the unlock range
1365 * request - add all locks from the tmp
1366 * list to the head of the file's list.
1367 */
1368 cifs_move_llist(&tmp_llist,
1369 &cfile->llist->locks);
1370 rc = stored_rc;
1371 } else
1372 /*
1373 * The unlock range request succeed -
1374 * free the tmp list.
1375 */
1376 cifs_free_llist(&tmp_llist);
1377 cur = buf;
1378 num = 0;
1379 } else
1380 cur++;
1381 }
1382 if (num) {
1383 stored_rc = cifs_lockv(xid, tcon, cfile->fid.netfid,
1384 types[i], num, 0, buf);
1385 if (stored_rc) {
1386 cifs_move_llist(&tmp_llist,
1387 &cfile->llist->locks);
1388 rc = stored_rc;
1389 } else
1390 cifs_free_llist(&tmp_llist);
1391 }
1392 }
1393
1394 up_write(&cinode->lock_sem);
1395 kfree(buf);
1396 return rc;
1397 }
1398
1399 static int
1400 cifs_setlk(struct file *file, struct file_lock *flock, __u32 type,
1401 bool wait_flag, bool posix_lck, int lock, int unlock,
1402 unsigned int xid)
1403 {
1404 int rc = 0;
1405 __u64 length = 1 + flock->fl_end - flock->fl_start;
1406 struct cifsFileInfo *cfile = (struct cifsFileInfo *)file->private_data;
1407 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
1408 struct TCP_Server_Info *server = tcon->ses->server;
1409
1410 if (posix_lck) {
1411 int posix_lock_type;
1412
1413 rc = cifs_posix_lock_set(file, flock);
1414 if (!rc || rc < 0)
1415 return rc;
1416
1417 if (type & server->vals->shared_lock_type)
1418 posix_lock_type = CIFS_RDLCK;
1419 else
1420 posix_lock_type = CIFS_WRLCK;
1421
1422 if (unlock == 1)
1423 posix_lock_type = CIFS_UNLCK;
1424
1425 rc = CIFSSMBPosixLock(xid, tcon, cfile->fid.netfid,
1426 current->tgid, flock->fl_start, length,
1427 NULL, posix_lock_type, wait_flag);
1428 goto out;
1429 }
1430
1431 if (lock) {
1432 struct cifsLockInfo *lock;
1433
1434 lock = cifs_lock_init(flock->fl_start, length, type);
1435 if (!lock)
1436 return -ENOMEM;
1437
1438 rc = cifs_lock_add_if(cfile, lock, wait_flag);
1439 if (rc < 0)
1440 kfree(lock);
1441 if (rc <= 0)
1442 goto out;
1443
1444 rc = server->ops->mand_lock(xid, cfile, flock->fl_start, length,
1445 type, 1, 0, wait_flag);
1446 if (rc) {
1447 kfree(lock);
1448 goto out;
1449 }
1450
1451 cifs_lock_add(cfile, lock);
1452 } else if (unlock)
1453 rc = server->ops->mand_unlock_range(cfile, flock, xid);
1454
1455 out:
1456 if (flock->fl_flags & FL_POSIX)
1457 posix_lock_file_wait(file, flock);
1458 return rc;
1459 }
1460
1461 int cifs_lock(struct file *file, int cmd, struct file_lock *flock)
1462 {
1463 int rc, xid;
1464 int lock = 0, unlock = 0;
1465 bool wait_flag = false;
1466 bool posix_lck = false;
1467 struct cifs_sb_info *cifs_sb;
1468 struct cifs_tcon *tcon;
1469 struct cifsInodeInfo *cinode;
1470 struct cifsFileInfo *cfile;
1471 __u16 netfid;
1472 __u32 type;
1473
1474 rc = -EACCES;
1475 xid = get_xid();
1476
1477 cFYI(1, "Lock parm: 0x%x flockflags: 0x%x flocktype: 0x%x start: %lld "
1478 "end: %lld", cmd, flock->fl_flags, flock->fl_type,
1479 flock->fl_start, flock->fl_end);
1480
1481 cfile = (struct cifsFileInfo *)file->private_data;
1482 tcon = tlink_tcon(cfile->tlink);
1483
1484 cifs_read_flock(flock, &type, &lock, &unlock, &wait_flag,
1485 tcon->ses->server);
1486
1487 cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
1488 netfid = cfile->fid.netfid;
1489 cinode = CIFS_I(file->f_path.dentry->d_inode);
1490
1491 if (cap_unix(tcon->ses) &&
1492 (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) &&
1493 ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0))
1494 posix_lck = true;
1495 /*
1496 * BB add code here to normalize offset and length to account for
1497 * negative length which we can not accept over the wire.
1498 */
1499 if (IS_GETLK(cmd)) {
1500 rc = cifs_getlk(file, flock, type, wait_flag, posix_lck, xid);
1501 free_xid(xid);
1502 return rc;
1503 }
1504
1505 if (!lock && !unlock) {
1506 /*
1507 * if no lock or unlock then nothing to do since we do not
1508 * know what it is
1509 */
1510 free_xid(xid);
1511 return -EOPNOTSUPP;
1512 }
1513
1514 rc = cifs_setlk(file, flock, type, wait_flag, posix_lck, lock, unlock,
1515 xid);
1516 free_xid(xid);
1517 return rc;
1518 }
1519
1520 /*
1521 * update the file size (if needed) after a write. Should be called with
1522 * the inode->i_lock held
1523 */
1524 void
1525 cifs_update_eof(struct cifsInodeInfo *cifsi, loff_t offset,
1526 unsigned int bytes_written)
1527 {
1528 loff_t end_of_write = offset + bytes_written;
1529
1530 if (end_of_write > cifsi->server_eof)
1531 cifsi->server_eof = end_of_write;
1532 }
1533
1534 static ssize_t
1535 cifs_write(struct cifsFileInfo *open_file, __u32 pid, const char *write_data,
1536 size_t write_size, loff_t *offset)
1537 {
1538 int rc = 0;
1539 unsigned int bytes_written = 0;
1540 unsigned int total_written;
1541 struct cifs_sb_info *cifs_sb;
1542 struct cifs_tcon *tcon;
1543 struct TCP_Server_Info *server;
1544 unsigned int xid;
1545 struct dentry *dentry = open_file->dentry;
1546 struct cifsInodeInfo *cifsi = CIFS_I(dentry->d_inode);
1547 struct cifs_io_parms io_parms;
1548
1549 cifs_sb = CIFS_SB(dentry->d_sb);
1550
1551 cFYI(1, "write %zd bytes to offset %lld of %s", write_size,
1552 *offset, dentry->d_name.name);
1553
1554 tcon = tlink_tcon(open_file->tlink);
1555 server = tcon->ses->server;
1556
1557 if (!server->ops->sync_write)
1558 return -ENOSYS;
1559
1560 xid = get_xid();
1561
1562 for (total_written = 0; write_size > total_written;
1563 total_written += bytes_written) {
1564 rc = -EAGAIN;
1565 while (rc == -EAGAIN) {
1566 struct kvec iov[2];
1567 unsigned int len;
1568
1569 if (open_file->invalidHandle) {
1570 /* we could deadlock if we called
1571 filemap_fdatawait from here so tell
1572 reopen_file not to flush data to
1573 server now */
1574 rc = cifs_reopen_file(open_file, false);
1575 if (rc != 0)
1576 break;
1577 }
1578
1579 len = min((size_t)cifs_sb->wsize,
1580 write_size - total_written);
1581 /* iov[0] is reserved for smb header */
1582 iov[1].iov_base = (char *)write_data + total_written;
1583 iov[1].iov_len = len;
1584 io_parms.pid = pid;
1585 io_parms.tcon = tcon;
1586 io_parms.offset = *offset;
1587 io_parms.length = len;
1588 rc = server->ops->sync_write(xid, open_file, &io_parms,
1589 &bytes_written, iov, 1);
1590 }
1591 if (rc || (bytes_written == 0)) {
1592 if (total_written)
1593 break;
1594 else {
1595 free_xid(xid);
1596 return rc;
1597 }
1598 } else {
1599 spin_lock(&dentry->d_inode->i_lock);
1600 cifs_update_eof(cifsi, *offset, bytes_written);
1601 spin_unlock(&dentry->d_inode->i_lock);
1602 *offset += bytes_written;
1603 }
1604 }
1605
1606 cifs_stats_bytes_written(tcon, total_written);
1607
1608 if (total_written > 0) {
1609 spin_lock(&dentry->d_inode->i_lock);
1610 if (*offset > dentry->d_inode->i_size)
1611 i_size_write(dentry->d_inode, *offset);
1612 spin_unlock(&dentry->d_inode->i_lock);
1613 }
1614 mark_inode_dirty_sync(dentry->d_inode);
1615 free_xid(xid);
1616 return total_written;
1617 }
1618
1619 struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *cifs_inode,
1620 bool fsuid_only)
1621 {
1622 struct cifsFileInfo *open_file = NULL;
1623 struct cifs_sb_info *cifs_sb = CIFS_SB(cifs_inode->vfs_inode.i_sb);
1624
1625 /* only filter by fsuid on multiuser mounts */
1626 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
1627 fsuid_only = false;
1628
1629 spin_lock(&cifs_file_list_lock);
1630 /* we could simply get the first_list_entry since write-only entries
1631 are always at the end of the list but since the first entry might
1632 have a close pending, we go through the whole list */
1633 list_for_each_entry(open_file, &cifs_inode->openFileList, flist) {
1634 if (fsuid_only && open_file->uid != current_fsuid())
1635 continue;
1636 if (OPEN_FMODE(open_file->f_flags) & FMODE_READ) {
1637 if (!open_file->invalidHandle) {
1638 /* found a good file */
1639 /* lock it so it will not be closed on us */
1640 cifsFileInfo_get_locked(open_file);
1641 spin_unlock(&cifs_file_list_lock);
1642 return open_file;
1643 } /* else might as well continue, and look for
1644 another, or simply have the caller reopen it
1645 again rather than trying to fix this handle */
1646 } else /* write only file */
1647 break; /* write only files are last so must be done */
1648 }
1649 spin_unlock(&cifs_file_list_lock);
1650 return NULL;
1651 }
1652
1653 struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *cifs_inode,
1654 bool fsuid_only)
1655 {
1656 struct cifsFileInfo *open_file, *inv_file = NULL;
1657 struct cifs_sb_info *cifs_sb;
1658 bool any_available = false;
1659 int rc;
1660 unsigned int refind = 0;
1661
1662 /* Having a null inode here (because mapping->host was set to zero by
1663 the VFS or MM) should not happen but we had reports of on oops (due to
1664 it being zero) during stress testcases so we need to check for it */
1665
1666 if (cifs_inode == NULL) {
1667 cERROR(1, "Null inode passed to cifs_writeable_file");
1668 dump_stack();
1669 return NULL;
1670 }
1671
1672 cifs_sb = CIFS_SB(cifs_inode->vfs_inode.i_sb);
1673
1674 /* only filter by fsuid on multiuser mounts */
1675 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER))
1676 fsuid_only = false;
1677
1678 spin_lock(&cifs_file_list_lock);
1679 refind_writable:
1680 if (refind > MAX_REOPEN_ATT) {
1681 spin_unlock(&cifs_file_list_lock);
1682 return NULL;
1683 }
1684 list_for_each_entry(open_file, &cifs_inode->openFileList, flist) {
1685 if (!any_available && open_file->pid != current->tgid)
1686 continue;
1687 if (fsuid_only && open_file->uid != current_fsuid())
1688 continue;
1689 if (OPEN_FMODE(open_file->f_flags) & FMODE_WRITE) {
1690 if (!open_file->invalidHandle) {
1691 /* found a good writable file */
1692 cifsFileInfo_get_locked(open_file);
1693 spin_unlock(&cifs_file_list_lock);
1694 return open_file;
1695 } else {
1696 if (!inv_file)
1697 inv_file = open_file;
1698 }
1699 }
1700 }
1701 /* couldn't find useable FH with same pid, try any available */
1702 if (!any_available) {
1703 any_available = true;
1704 goto refind_writable;
1705 }
1706
1707 if (inv_file) {
1708 any_available = false;
1709 cifsFileInfo_get_locked(inv_file);
1710 }
1711
1712 spin_unlock(&cifs_file_list_lock);
1713
1714 if (inv_file) {
1715 rc = cifs_reopen_file(inv_file, false);
1716 if (!rc)
1717 return inv_file;
1718 else {
1719 spin_lock(&cifs_file_list_lock);
1720 list_move_tail(&inv_file->flist,
1721 &cifs_inode->openFileList);
1722 spin_unlock(&cifs_file_list_lock);
1723 cifsFileInfo_put(inv_file);
1724 spin_lock(&cifs_file_list_lock);
1725 ++refind;
1726 goto refind_writable;
1727 }
1728 }
1729
1730 return NULL;
1731 }
1732
1733 static int cifs_partialpagewrite(struct page *page, unsigned from, unsigned to)
1734 {
1735 struct address_space *mapping = page->mapping;
1736 loff_t offset = (loff_t)page->index << PAGE_CACHE_SHIFT;
1737 char *write_data;
1738 int rc = -EFAULT;
1739 int bytes_written = 0;
1740 struct inode *inode;
1741 struct cifsFileInfo *open_file;
1742
1743 if (!mapping || !mapping->host)
1744 return -EFAULT;
1745
1746 inode = page->mapping->host;
1747
1748 offset += (loff_t)from;
1749 write_data = kmap(page);
1750 write_data += from;
1751
1752 if ((to > PAGE_CACHE_SIZE) || (from > to)) {
1753 kunmap(page);
1754 return -EIO;
1755 }
1756
1757 /* racing with truncate? */
1758 if (offset > mapping->host->i_size) {
1759 kunmap(page);
1760 return 0; /* don't care */
1761 }
1762
1763 /* check to make sure that we are not extending the file */
1764 if (mapping->host->i_size - offset < (loff_t)to)
1765 to = (unsigned)(mapping->host->i_size - offset);
1766
1767 open_file = find_writable_file(CIFS_I(mapping->host), false);
1768 if (open_file) {
1769 bytes_written = cifs_write(open_file, open_file->pid,
1770 write_data, to - from, &offset);
1771 cifsFileInfo_put(open_file);
1772 /* Does mm or vfs already set times? */
1773 inode->i_atime = inode->i_mtime = current_fs_time(inode->i_sb);
1774 if ((bytes_written > 0) && (offset))
1775 rc = 0;
1776 else if (bytes_written < 0)
1777 rc = bytes_written;
1778 } else {
1779 cFYI(1, "No writeable filehandles for inode");
1780 rc = -EIO;
1781 }
1782
1783 kunmap(page);
1784 return rc;
1785 }
1786
1787 static int cifs_writepages(struct address_space *mapping,
1788 struct writeback_control *wbc)
1789 {
1790 struct cifs_sb_info *cifs_sb = CIFS_SB(mapping->host->i_sb);
1791 bool done = false, scanned = false, range_whole = false;
1792 pgoff_t end, index;
1793 struct cifs_writedata *wdata;
1794 struct TCP_Server_Info *server;
1795 struct page *page;
1796 int rc = 0;
1797
1798 /*
1799 * If wsize is smaller than the page cache size, default to writing
1800 * one page at a time via cifs_writepage
1801 */
1802 if (cifs_sb->wsize < PAGE_CACHE_SIZE)
1803 return generic_writepages(mapping, wbc);
1804
1805 if (wbc->range_cyclic) {
1806 index = mapping->writeback_index; /* Start from prev offset */
1807 end = -1;
1808 } else {
1809 index = wbc->range_start >> PAGE_CACHE_SHIFT;
1810 end = wbc->range_end >> PAGE_CACHE_SHIFT;
1811 if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX)
1812 range_whole = true;
1813 scanned = true;
1814 }
1815 retry:
1816 while (!done && index <= end) {
1817 unsigned int i, nr_pages, found_pages;
1818 pgoff_t next = 0, tofind;
1819 struct page **pages;
1820
1821 tofind = min((cifs_sb->wsize / PAGE_CACHE_SIZE) - 1,
1822 end - index) + 1;
1823
1824 wdata = cifs_writedata_alloc((unsigned int)tofind,
1825 cifs_writev_complete);
1826 if (!wdata) {
1827 rc = -ENOMEM;
1828 break;
1829 }
1830
1831 /*
1832 * find_get_pages_tag seems to return a max of 256 on each
1833 * iteration, so we must call it several times in order to
1834 * fill the array or the wsize is effectively limited to
1835 * 256 * PAGE_CACHE_SIZE.
1836 */
1837 found_pages = 0;
1838 pages = wdata->pages;
1839 do {
1840 nr_pages = find_get_pages_tag(mapping, &index,
1841 PAGECACHE_TAG_DIRTY,
1842 tofind, pages);
1843 found_pages += nr_pages;
1844 tofind -= nr_pages;
1845 pages += nr_pages;
1846 } while (nr_pages && tofind && index <= end);
1847
1848 if (found_pages == 0) {
1849 kref_put(&wdata->refcount, cifs_writedata_release);
1850 break;
1851 }
1852
1853 nr_pages = 0;
1854 for (i = 0; i < found_pages; i++) {
1855 page = wdata->pages[i];
1856 /*
1857 * At this point we hold neither mapping->tree_lock nor
1858 * lock on the page itself: the page may be truncated or
1859 * invalidated (changing page->mapping to NULL), or even
1860 * swizzled back from swapper_space to tmpfs file
1861 * mapping
1862 */
1863
1864 if (nr_pages == 0)
1865 lock_page(page);
1866 else if (!trylock_page(page))
1867 break;
1868
1869 if (unlikely(page->mapping != mapping)) {
1870 unlock_page(page);
1871 break;
1872 }
1873
1874 if (!wbc->range_cyclic && page->index > end) {
1875 done = true;
1876 unlock_page(page);
1877 break;
1878 }
1879
1880 if (next && (page->index != next)) {
1881 /* Not next consecutive page */
1882 unlock_page(page);
1883 break;
1884 }
1885
1886 if (wbc->sync_mode != WB_SYNC_NONE)
1887 wait_on_page_writeback(page);
1888
1889 if (PageWriteback(page) ||
1890 !clear_page_dirty_for_io(page)) {
1891 unlock_page(page);
1892 break;
1893 }
1894
1895 /*
1896 * This actually clears the dirty bit in the radix tree.
1897 * See cifs_writepage() for more commentary.
1898 */
1899 set_page_writeback(page);
1900
1901 if (page_offset(page) >= i_size_read(mapping->host)) {
1902 done = true;
1903 unlock_page(page);
1904 end_page_writeback(page);
1905 break;
1906 }
1907
1908 wdata->pages[i] = page;
1909 next = page->index + 1;
1910 ++nr_pages;
1911 }
1912
1913 /* reset index to refind any pages skipped */
1914 if (nr_pages == 0)
1915 index = wdata->pages[0]->index + 1;
1916
1917 /* put any pages we aren't going to use */
1918 for (i = nr_pages; i < found_pages; i++) {
1919 page_cache_release(wdata->pages[i]);
1920 wdata->pages[i] = NULL;
1921 }
1922
1923 /* nothing to write? */
1924 if (nr_pages == 0) {
1925 kref_put(&wdata->refcount, cifs_writedata_release);
1926 continue;
1927 }
1928
1929 wdata->sync_mode = wbc->sync_mode;
1930 wdata->nr_pages = nr_pages;
1931 wdata->offset = page_offset(wdata->pages[0]);
1932 wdata->pagesz = PAGE_CACHE_SIZE;
1933 wdata->tailsz =
1934 min(i_size_read(mapping->host) -
1935 page_offset(wdata->pages[nr_pages - 1]),
1936 (loff_t)PAGE_CACHE_SIZE);
1937 wdata->bytes = ((nr_pages - 1) * PAGE_CACHE_SIZE) +
1938 wdata->tailsz;
1939
1940 do {
1941 if (wdata->cfile != NULL)
1942 cifsFileInfo_put(wdata->cfile);
1943 wdata->cfile = find_writable_file(CIFS_I(mapping->host),
1944 false);
1945 if (!wdata->cfile) {
1946 cERROR(1, "No writable handles for inode");
1947 rc = -EBADF;
1948 break;
1949 }
1950 wdata->pid = wdata->cfile->pid;
1951 server = tlink_tcon(wdata->cfile->tlink)->ses->server;
1952 rc = server->ops->async_writev(wdata);
1953 } while (wbc->sync_mode == WB_SYNC_ALL && rc == -EAGAIN);
1954
1955 for (i = 0; i < nr_pages; ++i)
1956 unlock_page(wdata->pages[i]);
1957
1958 /* send failure -- clean up the mess */
1959 if (rc != 0) {
1960 for (i = 0; i < nr_pages; ++i) {
1961 if (rc == -EAGAIN)
1962 redirty_page_for_writepage(wbc,
1963 wdata->pages[i]);
1964 else
1965 SetPageError(wdata->pages[i]);
1966 end_page_writeback(wdata->pages[i]);
1967 page_cache_release(wdata->pages[i]);
1968 }
1969 if (rc != -EAGAIN)
1970 mapping_set_error(mapping, rc);
1971 }
1972 kref_put(&wdata->refcount, cifs_writedata_release);
1973
1974 wbc->nr_to_write -= nr_pages;
1975 if (wbc->nr_to_write <= 0)
1976 done = true;
1977
1978 index = next;
1979 }
1980
1981 if (!scanned && !done) {
1982 /*
1983 * We hit the last page and there is more work to be done: wrap
1984 * back to the start of the file
1985 */
1986 scanned = true;
1987 index = 0;
1988 goto retry;
1989 }
1990
1991 if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0))
1992 mapping->writeback_index = index;
1993
1994 return rc;
1995 }
1996
1997 static int
1998 cifs_writepage_locked(struct page *page, struct writeback_control *wbc)
1999 {
2000 int rc;
2001 unsigned int xid;
2002
2003 xid = get_xid();
2004 /* BB add check for wbc flags */
2005 page_cache_get(page);
2006 if (!PageUptodate(page))
2007 cFYI(1, "ppw - page not up to date");
2008
2009 /*
2010 * Set the "writeback" flag, and clear "dirty" in the radix tree.
2011 *
2012 * A writepage() implementation always needs to do either this,
2013 * or re-dirty the page with "redirty_page_for_writepage()" in
2014 * the case of a failure.
2015 *
2016 * Just unlocking the page will cause the radix tree tag-bits
2017 * to fail to update with the state of the page correctly.
2018 */
2019 set_page_writeback(page);
2020 retry_write:
2021 rc = cifs_partialpagewrite(page, 0, PAGE_CACHE_SIZE);
2022 if (rc == -EAGAIN && wbc->sync_mode == WB_SYNC_ALL)
2023 goto retry_write;
2024 else if (rc == -EAGAIN)
2025 redirty_page_for_writepage(wbc, page);
2026 else if (rc != 0)
2027 SetPageError(page);
2028 else
2029 SetPageUptodate(page);
2030 end_page_writeback(page);
2031 page_cache_release(page);
2032 free_xid(xid);
2033 return rc;
2034 }
2035
2036 static int cifs_writepage(struct page *page, struct writeback_control *wbc)
2037 {
2038 int rc = cifs_writepage_locked(page, wbc);
2039 unlock_page(page);
2040 return rc;
2041 }
2042
2043 static int cifs_write_end(struct file *file, struct address_space *mapping,
2044 loff_t pos, unsigned len, unsigned copied,
2045 struct page *page, void *fsdata)
2046 {
2047 int rc;
2048 struct inode *inode = mapping->host;
2049 struct cifsFileInfo *cfile = file->private_data;
2050 struct cifs_sb_info *cifs_sb = CIFS_SB(cfile->dentry->d_sb);
2051 __u32 pid;
2052
2053 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD)
2054 pid = cfile->pid;
2055 else
2056 pid = current->tgid;
2057
2058 cFYI(1, "write_end for page %p from pos %lld with %d bytes",
2059 page, pos, copied);
2060
2061 if (PageChecked(page)) {
2062 if (copied == len)
2063 SetPageUptodate(page);
2064 ClearPageChecked(page);
2065 } else if (!PageUptodate(page) && copied == PAGE_CACHE_SIZE)
2066 SetPageUptodate(page);
2067
2068 if (!PageUptodate(page)) {
2069 char *page_data;
2070 unsigned offset = pos & (PAGE_CACHE_SIZE - 1);
2071 unsigned int xid;
2072
2073 xid = get_xid();
2074 /* this is probably better than directly calling
2075 partialpage_write since in this function the file handle is
2076 known which we might as well leverage */
2077 /* BB check if anything else missing out of ppw
2078 such as updating last write time */
2079 page_data = kmap(page);
2080 rc = cifs_write(cfile, pid, page_data + offset, copied, &pos);
2081 /* if (rc < 0) should we set writebehind rc? */
2082 kunmap(page);
2083
2084 free_xid(xid);
2085 } else {
2086 rc = copied;
2087 pos += copied;
2088 set_page_dirty(page);
2089 }
2090
2091 if (rc > 0) {
2092 spin_lock(&inode->i_lock);
2093 if (pos > inode->i_size)
2094 i_size_write(inode, pos);
2095 spin_unlock(&inode->i_lock);
2096 }
2097
2098 unlock_page(page);
2099 page_cache_release(page);
2100
2101 return rc;
2102 }
2103
2104 int cifs_strict_fsync(struct file *file, loff_t start, loff_t end,
2105 int datasync)
2106 {
2107 unsigned int xid;
2108 int rc = 0;
2109 struct cifs_tcon *tcon;
2110 struct TCP_Server_Info *server;
2111 struct cifsFileInfo *smbfile = file->private_data;
2112 struct inode *inode = file->f_path.dentry->d_inode;
2113 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2114
2115 rc = filemap_write_and_wait_range(inode->i_mapping, start, end);
2116 if (rc)
2117 return rc;
2118 mutex_lock(&inode->i_mutex);
2119
2120 xid = get_xid();
2121
2122 cFYI(1, "Sync file - name: %s datasync: 0x%x",
2123 file->f_path.dentry->d_name.name, datasync);
2124
2125 if (!CIFS_I(inode)->clientCanCacheRead) {
2126 rc = cifs_invalidate_mapping(inode);
2127 if (rc) {
2128 cFYI(1, "rc: %d during invalidate phase", rc);
2129 rc = 0; /* don't care about it in fsync */
2130 }
2131 }
2132
2133 tcon = tlink_tcon(smbfile->tlink);
2134 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC)) {
2135 server = tcon->ses->server;
2136 if (server->ops->flush)
2137 rc = server->ops->flush(xid, tcon, &smbfile->fid);
2138 else
2139 rc = -ENOSYS;
2140 }
2141
2142 free_xid(xid);
2143 mutex_unlock(&inode->i_mutex);
2144 return rc;
2145 }
2146
2147 int cifs_fsync(struct file *file, loff_t start, loff_t end, int datasync)
2148 {
2149 unsigned int xid;
2150 int rc = 0;
2151 struct cifs_tcon *tcon;
2152 struct TCP_Server_Info *server;
2153 struct cifsFileInfo *smbfile = file->private_data;
2154 struct cifs_sb_info *cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
2155 struct inode *inode = file->f_mapping->host;
2156
2157 rc = filemap_write_and_wait_range(inode->i_mapping, start, end);
2158 if (rc)
2159 return rc;
2160 mutex_lock(&inode->i_mutex);
2161
2162 xid = get_xid();
2163
2164 cFYI(1, "Sync file - name: %s datasync: 0x%x",
2165 file->f_path.dentry->d_name.name, datasync);
2166
2167 tcon = tlink_tcon(smbfile->tlink);
2168 if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC)) {
2169 server = tcon->ses->server;
2170 if (server->ops->flush)
2171 rc = server->ops->flush(xid, tcon, &smbfile->fid);
2172 else
2173 rc = -ENOSYS;
2174 }
2175
2176 free_xid(xid);
2177 mutex_unlock(&inode->i_mutex);
2178 return rc;
2179 }
2180
2181 /*
2182 * As file closes, flush all cached write data for this inode checking
2183 * for write behind errors.
2184 */
2185 int cifs_flush(struct file *file, fl_owner_t id)
2186 {
2187 struct inode *inode = file->f_path.dentry->d_inode;
2188 int rc = 0;
2189
2190 if (file->f_mode & FMODE_WRITE)
2191 rc = filemap_write_and_wait(inode->i_mapping);
2192
2193 cFYI(1, "Flush inode %p file %p rc %d", inode, file, rc);
2194
2195 return rc;
2196 }
2197
2198 static int
2199 cifs_write_allocate_pages(struct page **pages, unsigned long num_pages)
2200 {
2201 int rc = 0;
2202 unsigned long i;
2203
2204 for (i = 0; i < num_pages; i++) {
2205 pages[i] = alloc_page(GFP_KERNEL|__GFP_HIGHMEM);
2206 if (!pages[i]) {
2207 /*
2208 * save number of pages we have already allocated and
2209 * return with ENOMEM error
2210 */
2211 num_pages = i;
2212 rc = -ENOMEM;
2213 break;
2214 }
2215 }
2216
2217 if (rc) {
2218 for (i = 0; i < num_pages; i++)
2219 put_page(pages[i]);
2220 }
2221 return rc;
2222 }
2223
2224 static inline
2225 size_t get_numpages(const size_t wsize, const size_t len, size_t *cur_len)
2226 {
2227 size_t num_pages;
2228 size_t clen;
2229
2230 clen = min_t(const size_t, len, wsize);
2231 num_pages = DIV_ROUND_UP(clen, PAGE_SIZE);
2232
2233 if (cur_len)
2234 *cur_len = clen;
2235
2236 return num_pages;
2237 }
2238
2239 static void
2240 cifs_uncached_writev_complete(struct work_struct *work)
2241 {
2242 int i;
2243 struct cifs_writedata *wdata = container_of(work,
2244 struct cifs_writedata, work);
2245 struct inode *inode = wdata->cfile->dentry->d_inode;
2246 struct cifsInodeInfo *cifsi = CIFS_I(inode);
2247
2248 spin_lock(&inode->i_lock);
2249 cifs_update_eof(cifsi, wdata->offset, wdata->bytes);
2250 if (cifsi->server_eof > inode->i_size)
2251 i_size_write(inode, cifsi->server_eof);
2252 spin_unlock(&inode->i_lock);
2253
2254 complete(&wdata->done);
2255
2256 if (wdata->result != -EAGAIN) {
2257 for (i = 0; i < wdata->nr_pages; i++)
2258 put_page(wdata->pages[i]);
2259 }
2260
2261 kref_put(&wdata->refcount, cifs_writedata_release);
2262 }
2263
2264 /* attempt to send write to server, retry on any -EAGAIN errors */
2265 static int
2266 cifs_uncached_retry_writev(struct cifs_writedata *wdata)
2267 {
2268 int rc;
2269 struct TCP_Server_Info *server;
2270
2271 server = tlink_tcon(wdata->cfile->tlink)->ses->server;
2272
2273 do {
2274 if (wdata->cfile->invalidHandle) {
2275 rc = cifs_reopen_file(wdata->cfile, false);
2276 if (rc != 0)
2277 continue;
2278 }
2279 rc = server->ops->async_writev(wdata);
2280 } while (rc == -EAGAIN);
2281
2282 return rc;
2283 }
2284
2285 static ssize_t
2286 cifs_iovec_write(struct file *file, const struct iovec *iov,
2287 unsigned long nr_segs, loff_t *poffset)
2288 {
2289 unsigned long nr_pages, i;
2290 size_t copied, len, cur_len;
2291 ssize_t total_written = 0;
2292 loff_t offset;
2293 struct iov_iter it;
2294 struct cifsFileInfo *open_file;
2295 struct cifs_tcon *tcon;
2296 struct cifs_sb_info *cifs_sb;
2297 struct cifs_writedata *wdata, *tmp;
2298 struct list_head wdata_list;
2299 int rc;
2300 pid_t pid;
2301
2302 len = iov_length(iov, nr_segs);
2303 if (!len)
2304 return 0;
2305
2306 rc = generic_write_checks(file, poffset, &len, 0);
2307 if (rc)
2308 return rc;
2309
2310 INIT_LIST_HEAD(&wdata_list);
2311 cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
2312 open_file = file->private_data;
2313 tcon = tlink_tcon(open_file->tlink);
2314
2315 if (!tcon->ses->server->ops->async_writev)
2316 return -ENOSYS;
2317
2318 offset = *poffset;
2319
2320 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD)
2321 pid = open_file->pid;
2322 else
2323 pid = current->tgid;
2324
2325 iov_iter_init(&it, iov, nr_segs, len, 0);
2326 do {
2327 size_t save_len;
2328
2329 nr_pages = get_numpages(cifs_sb->wsize, len, &cur_len);
2330 wdata = cifs_writedata_alloc(nr_pages,
2331 cifs_uncached_writev_complete);
2332 if (!wdata) {
2333 rc = -ENOMEM;
2334 break;
2335 }
2336
2337 rc = cifs_write_allocate_pages(wdata->pages, nr_pages);
2338 if (rc) {
2339 kfree(wdata);
2340 break;
2341 }
2342
2343 save_len = cur_len;
2344 for (i = 0; i < nr_pages; i++) {
2345 copied = min_t(const size_t, cur_len, PAGE_SIZE);
2346 copied = iov_iter_copy_from_user(wdata->pages[i], &it,
2347 0, copied);
2348 cur_len -= copied;
2349 iov_iter_advance(&it, copied);
2350 }
2351 cur_len = save_len - cur_len;
2352
2353 wdata->sync_mode = WB_SYNC_ALL;
2354 wdata->nr_pages = nr_pages;
2355 wdata->offset = (__u64)offset;
2356 wdata->cfile = cifsFileInfo_get(open_file);
2357 wdata->pid = pid;
2358 wdata->bytes = cur_len;
2359 wdata->pagesz = PAGE_SIZE;
2360 wdata->tailsz = cur_len - ((nr_pages - 1) * PAGE_SIZE);
2361 rc = cifs_uncached_retry_writev(wdata);
2362 if (rc) {
2363 kref_put(&wdata->refcount, cifs_writedata_release);
2364 break;
2365 }
2366
2367 list_add_tail(&wdata->list, &wdata_list);
2368 offset += cur_len;
2369 len -= cur_len;
2370 } while (len > 0);
2371
2372 /*
2373 * If at least one write was successfully sent, then discard any rc
2374 * value from the later writes. If the other write succeeds, then
2375 * we'll end up returning whatever was written. If it fails, then
2376 * we'll get a new rc value from that.
2377 */
2378 if (!list_empty(&wdata_list))
2379 rc = 0;
2380
2381 /*
2382 * Wait for and collect replies for any successful sends in order of
2383 * increasing offset. Once an error is hit or we get a fatal signal
2384 * while waiting, then return without waiting for any more replies.
2385 */
2386 restart_loop:
2387 list_for_each_entry_safe(wdata, tmp, &wdata_list, list) {
2388 if (!rc) {
2389 /* FIXME: freezable too? */
2390 rc = wait_for_completion_killable(&wdata->done);
2391 if (rc)
2392 rc = -EINTR;
2393 else if (wdata->result)
2394 rc = wdata->result;
2395 else
2396 total_written += wdata->bytes;
2397
2398 /* resend call if it's a retryable error */
2399 if (rc == -EAGAIN) {
2400 rc = cifs_uncached_retry_writev(wdata);
2401 goto restart_loop;
2402 }
2403 }
2404 list_del_init(&wdata->list);
2405 kref_put(&wdata->refcount, cifs_writedata_release);
2406 }
2407
2408 if (total_written > 0)
2409 *poffset += total_written;
2410
2411 cifs_stats_bytes_written(tcon, total_written);
2412 return total_written ? total_written : (ssize_t)rc;
2413 }
2414
2415 ssize_t cifs_user_writev(struct kiocb *iocb, const struct iovec *iov,
2416 unsigned long nr_segs, loff_t pos)
2417 {
2418 ssize_t written;
2419 struct inode *inode;
2420
2421 inode = iocb->ki_filp->f_path.dentry->d_inode;
2422
2423 /*
2424 * BB - optimize the way when signing is disabled. We can drop this
2425 * extra memory-to-memory copying and use iovec buffers for constructing
2426 * write request.
2427 */
2428
2429 written = cifs_iovec_write(iocb->ki_filp, iov, nr_segs, &pos);
2430 if (written > 0) {
2431 CIFS_I(inode)->invalid_mapping = true;
2432 iocb->ki_pos = pos;
2433 }
2434
2435 return written;
2436 }
2437
2438 static ssize_t
2439 cifs_writev(struct kiocb *iocb, const struct iovec *iov,
2440 unsigned long nr_segs, loff_t pos)
2441 {
2442 struct file *file = iocb->ki_filp;
2443 struct cifsFileInfo *cfile = (struct cifsFileInfo *)file->private_data;
2444 struct inode *inode = file->f_mapping->host;
2445 struct cifsInodeInfo *cinode = CIFS_I(inode);
2446 struct TCP_Server_Info *server = tlink_tcon(cfile->tlink)->ses->server;
2447 ssize_t rc = -EACCES;
2448
2449 BUG_ON(iocb->ki_pos != pos);
2450
2451 sb_start_write(inode->i_sb);
2452
2453 /*
2454 * We need to hold the sem to be sure nobody modifies lock list
2455 * with a brlock that prevents writing.
2456 */
2457 down_read(&cinode->lock_sem);
2458 if (!cifs_find_lock_conflict(cfile, pos, iov_length(iov, nr_segs),
2459 server->vals->exclusive_lock_type, NULL,
2460 true)) {
2461 mutex_lock(&inode->i_mutex);
2462 rc = __generic_file_aio_write(iocb, iov, nr_segs,
2463 &iocb->ki_pos);
2464 mutex_unlock(&inode->i_mutex);
2465 }
2466
2467 if (rc > 0 || rc == -EIOCBQUEUED) {
2468 ssize_t err;
2469
2470 err = generic_write_sync(file, pos, rc);
2471 if (err < 0 && rc > 0)
2472 rc = err;
2473 }
2474
2475 up_read(&cinode->lock_sem);
2476 sb_end_write(inode->i_sb);
2477 return rc;
2478 }
2479
2480 ssize_t
2481 cifs_strict_writev(struct kiocb *iocb, const struct iovec *iov,
2482 unsigned long nr_segs, loff_t pos)
2483 {
2484 struct inode *inode = iocb->ki_filp->f_path.dentry->d_inode;
2485 struct cifsInodeInfo *cinode = CIFS_I(inode);
2486 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2487 struct cifsFileInfo *cfile = (struct cifsFileInfo *)
2488 iocb->ki_filp->private_data;
2489 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
2490
2491 #ifdef CONFIG_CIFS_SMB2
2492 /*
2493 * If we have an oplock for read and want to write a data to the file
2494 * we need to store it in the page cache and then push it to the server
2495 * to be sure the next read will get a valid data.
2496 */
2497 if (!cinode->clientCanCacheAll && cinode->clientCanCacheRead) {
2498 ssize_t written;
2499 int rc;
2500
2501 written = generic_file_aio_write(iocb, iov, nr_segs, pos);
2502 rc = filemap_fdatawrite(inode->i_mapping);
2503 if (rc)
2504 return (ssize_t)rc;
2505
2506 return written;
2507 }
2508 #endif
2509
2510 /*
2511 * For non-oplocked files in strict cache mode we need to write the data
2512 * to the server exactly from the pos to pos+len-1 rather than flush all
2513 * affected pages because it may cause a error with mandatory locks on
2514 * these pages but not on the region from pos to ppos+len-1.
2515 */
2516
2517 if (!cinode->clientCanCacheAll)
2518 return cifs_user_writev(iocb, iov, nr_segs, pos);
2519
2520 if (cap_unix(tcon->ses) &&
2521 (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) &&
2522 ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0))
2523 return generic_file_aio_write(iocb, iov, nr_segs, pos);
2524
2525 return cifs_writev(iocb, iov, nr_segs, pos);
2526 }
2527
2528 static struct cifs_readdata *
2529 cifs_readdata_alloc(unsigned int nr_pages, work_func_t complete)
2530 {
2531 struct cifs_readdata *rdata;
2532
2533 rdata = kzalloc(sizeof(*rdata) + (sizeof(struct page *) * nr_pages),
2534 GFP_KERNEL);
2535 if (rdata != NULL) {
2536 kref_init(&rdata->refcount);
2537 INIT_LIST_HEAD(&rdata->list);
2538 init_completion(&rdata->done);
2539 INIT_WORK(&rdata->work, complete);
2540 }
2541
2542 return rdata;
2543 }
2544
2545 void
2546 cifs_readdata_release(struct kref *refcount)
2547 {
2548 struct cifs_readdata *rdata = container_of(refcount,
2549 struct cifs_readdata, refcount);
2550
2551 if (rdata->cfile)
2552 cifsFileInfo_put(rdata->cfile);
2553
2554 kfree(rdata);
2555 }
2556
2557 static int
2558 cifs_read_allocate_pages(struct cifs_readdata *rdata, unsigned int nr_pages)
2559 {
2560 int rc = 0;
2561 struct page *page;
2562 unsigned int i;
2563
2564 for (i = 0; i < nr_pages; i++) {
2565 page = alloc_page(GFP_KERNEL|__GFP_HIGHMEM);
2566 if (!page) {
2567 rc = -ENOMEM;
2568 break;
2569 }
2570 rdata->pages[i] = page;
2571 }
2572
2573 if (rc) {
2574 for (i = 0; i < nr_pages; i++) {
2575 put_page(rdata->pages[i]);
2576 rdata->pages[i] = NULL;
2577 }
2578 }
2579 return rc;
2580 }
2581
2582 static void
2583 cifs_uncached_readdata_release(struct kref *refcount)
2584 {
2585 struct cifs_readdata *rdata = container_of(refcount,
2586 struct cifs_readdata, refcount);
2587 unsigned int i;
2588
2589 for (i = 0; i < rdata->nr_pages; i++) {
2590 put_page(rdata->pages[i]);
2591 rdata->pages[i] = NULL;
2592 }
2593 cifs_readdata_release(refcount);
2594 }
2595
2596 static int
2597 cifs_retry_async_readv(struct cifs_readdata *rdata)
2598 {
2599 int rc;
2600 struct TCP_Server_Info *server;
2601
2602 server = tlink_tcon(rdata->cfile->tlink)->ses->server;
2603
2604 do {
2605 if (rdata->cfile->invalidHandle) {
2606 rc = cifs_reopen_file(rdata->cfile, true);
2607 if (rc != 0)
2608 continue;
2609 }
2610 rc = server->ops->async_readv(rdata);
2611 } while (rc == -EAGAIN);
2612
2613 return rc;
2614 }
2615
2616 /**
2617 * cifs_readdata_to_iov - copy data from pages in response to an iovec
2618 * @rdata: the readdata response with list of pages holding data
2619 * @iov: vector in which we should copy the data
2620 * @nr_segs: number of segments in vector
2621 * @offset: offset into file of the first iovec
2622 * @copied: used to return the amount of data copied to the iov
2623 *
2624 * This function copies data from a list of pages in a readdata response into
2625 * an array of iovecs. It will first calculate where the data should go
2626 * based on the info in the readdata and then copy the data into that spot.
2627 */
2628 static ssize_t
2629 cifs_readdata_to_iov(struct cifs_readdata *rdata, const struct iovec *iov,
2630 unsigned long nr_segs, loff_t offset, ssize_t *copied)
2631 {
2632 int rc = 0;
2633 struct iov_iter ii;
2634 size_t pos = rdata->offset - offset;
2635 ssize_t remaining = rdata->bytes;
2636 unsigned char *pdata;
2637 unsigned int i;
2638
2639 /* set up iov_iter and advance to the correct offset */
2640 iov_iter_init(&ii, iov, nr_segs, iov_length(iov, nr_segs), 0);
2641 iov_iter_advance(&ii, pos);
2642
2643 *copied = 0;
2644 for (i = 0; i < rdata->nr_pages; i++) {
2645 ssize_t copy;
2646 struct page *page = rdata->pages[i];
2647
2648 /* copy a whole page or whatever's left */
2649 copy = min_t(ssize_t, remaining, PAGE_SIZE);
2650
2651 /* ...but limit it to whatever space is left in the iov */
2652 copy = min_t(ssize_t, copy, iov_iter_count(&ii));
2653
2654 /* go while there's data to be copied and no errors */
2655 if (copy && !rc) {
2656 pdata = kmap(page);
2657 rc = memcpy_toiovecend(ii.iov, pdata, ii.iov_offset,
2658 (int)copy);
2659 kunmap(page);
2660 if (!rc) {
2661 *copied += copy;
2662 remaining -= copy;
2663 iov_iter_advance(&ii, copy);
2664 }
2665 }
2666 }
2667
2668 return rc;
2669 }
2670
2671 static void
2672 cifs_uncached_readv_complete(struct work_struct *work)
2673 {
2674 struct cifs_readdata *rdata = container_of(work,
2675 struct cifs_readdata, work);
2676
2677 complete(&rdata->done);
2678 kref_put(&rdata->refcount, cifs_uncached_readdata_release);
2679 }
2680
2681 static int
2682 cifs_uncached_read_into_pages(struct TCP_Server_Info *server,
2683 struct cifs_readdata *rdata, unsigned int len)
2684 {
2685 int total_read = 0, result = 0;
2686 unsigned int i;
2687 unsigned int nr_pages = rdata->nr_pages;
2688 struct kvec iov;
2689
2690 rdata->tailsz = PAGE_SIZE;
2691 for (i = 0; i < nr_pages; i++) {
2692 struct page *page = rdata->pages[i];
2693
2694 if (len >= PAGE_SIZE) {
2695 /* enough data to fill the page */
2696 iov.iov_base = kmap(page);
2697 iov.iov_len = PAGE_SIZE;
2698 cFYI(1, "%u: iov_base=%p iov_len=%zu",
2699 i, iov.iov_base, iov.iov_len);
2700 len -= PAGE_SIZE;
2701 } else if (len > 0) {
2702 /* enough for partial page, fill and zero the rest */
2703 iov.iov_base = kmap(page);
2704 iov.iov_len = len;
2705 cFYI(1, "%u: iov_base=%p iov_len=%zu",
2706 i, iov.iov_base, iov.iov_len);
2707 memset(iov.iov_base + len, '\0', PAGE_SIZE - len);
2708 rdata->tailsz = len;
2709 len = 0;
2710 } else {
2711 /* no need to hold page hostage */
2712 rdata->pages[i] = NULL;
2713 rdata->nr_pages--;
2714 put_page(page);
2715 continue;
2716 }
2717
2718 result = cifs_readv_from_socket(server, &iov, 1, iov.iov_len);
2719 kunmap(page);
2720 if (result < 0)
2721 break;
2722
2723 total_read += result;
2724 }
2725
2726 return total_read > 0 ? total_read : result;
2727 }
2728
2729 static ssize_t
2730 cifs_iovec_read(struct file *file, const struct iovec *iov,
2731 unsigned long nr_segs, loff_t *poffset)
2732 {
2733 ssize_t rc;
2734 size_t len, cur_len;
2735 ssize_t total_read = 0;
2736 loff_t offset = *poffset;
2737 unsigned int npages;
2738 struct cifs_sb_info *cifs_sb;
2739 struct cifs_tcon *tcon;
2740 struct cifsFileInfo *open_file;
2741 struct cifs_readdata *rdata, *tmp;
2742 struct list_head rdata_list;
2743 pid_t pid;
2744
2745 if (!nr_segs)
2746 return 0;
2747
2748 len = iov_length(iov, nr_segs);
2749 if (!len)
2750 return 0;
2751
2752 INIT_LIST_HEAD(&rdata_list);
2753 cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
2754 open_file = file->private_data;
2755 tcon = tlink_tcon(open_file->tlink);
2756
2757 if (!tcon->ses->server->ops->async_readv)
2758 return -ENOSYS;
2759
2760 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD)
2761 pid = open_file->pid;
2762 else
2763 pid = current->tgid;
2764
2765 if ((file->f_flags & O_ACCMODE) == O_WRONLY)
2766 cFYI(1, "attempting read on write only file instance");
2767
2768 do {
2769 cur_len = min_t(const size_t, len - total_read, cifs_sb->rsize);
2770 npages = DIV_ROUND_UP(cur_len, PAGE_SIZE);
2771
2772 /* allocate a readdata struct */
2773 rdata = cifs_readdata_alloc(npages,
2774 cifs_uncached_readv_complete);
2775 if (!rdata) {
2776 rc = -ENOMEM;
2777 goto error;
2778 }
2779
2780 rc = cifs_read_allocate_pages(rdata, npages);
2781 if (rc)
2782 goto error;
2783
2784 rdata->cfile = cifsFileInfo_get(open_file);
2785 rdata->nr_pages = npages;
2786 rdata->offset = offset;
2787 rdata->bytes = cur_len;
2788 rdata->pid = pid;
2789 rdata->pagesz = PAGE_SIZE;
2790 rdata->read_into_pages = cifs_uncached_read_into_pages;
2791
2792 rc = cifs_retry_async_readv(rdata);
2793 error:
2794 if (rc) {
2795 kref_put(&rdata->refcount,
2796 cifs_uncached_readdata_release);
2797 break;
2798 }
2799
2800 list_add_tail(&rdata->list, &rdata_list);
2801 offset += cur_len;
2802 len -= cur_len;
2803 } while (len > 0);
2804
2805 /* if at least one read request send succeeded, then reset rc */
2806 if (!list_empty(&rdata_list))
2807 rc = 0;
2808
2809 /* the loop below should proceed in the order of increasing offsets */
2810 restart_loop:
2811 list_for_each_entry_safe(rdata, tmp, &rdata_list, list) {
2812 if (!rc) {
2813 ssize_t copied;
2814
2815 /* FIXME: freezable sleep too? */
2816 rc = wait_for_completion_killable(&rdata->done);
2817 if (rc)
2818 rc = -EINTR;
2819 else if (rdata->result)
2820 rc = rdata->result;
2821 else {
2822 rc = cifs_readdata_to_iov(rdata, iov,
2823 nr_segs, *poffset,
2824 &copied);
2825 total_read += copied;
2826 }
2827
2828 /* resend call if it's a retryable error */
2829 if (rc == -EAGAIN) {
2830 rc = cifs_retry_async_readv(rdata);
2831 goto restart_loop;
2832 }
2833 }
2834 list_del_init(&rdata->list);
2835 kref_put(&rdata->refcount, cifs_uncached_readdata_release);
2836 }
2837
2838 cifs_stats_bytes_read(tcon, total_read);
2839 *poffset += total_read;
2840
2841 /* mask nodata case */
2842 if (rc == -ENODATA)
2843 rc = 0;
2844
2845 return total_read ? total_read : rc;
2846 }
2847
2848 ssize_t cifs_user_readv(struct kiocb *iocb, const struct iovec *iov,
2849 unsigned long nr_segs, loff_t pos)
2850 {
2851 ssize_t read;
2852
2853 read = cifs_iovec_read(iocb->ki_filp, iov, nr_segs, &pos);
2854 if (read > 0)
2855 iocb->ki_pos = pos;
2856
2857 return read;
2858 }
2859
2860 ssize_t
2861 cifs_strict_readv(struct kiocb *iocb, const struct iovec *iov,
2862 unsigned long nr_segs, loff_t pos)
2863 {
2864 struct inode *inode = iocb->ki_filp->f_path.dentry->d_inode;
2865 struct cifsInodeInfo *cinode = CIFS_I(inode);
2866 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
2867 struct cifsFileInfo *cfile = (struct cifsFileInfo *)
2868 iocb->ki_filp->private_data;
2869 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
2870 int rc = -EACCES;
2871
2872 /*
2873 * In strict cache mode we need to read from the server all the time
2874 * if we don't have level II oplock because the server can delay mtime
2875 * change - so we can't make a decision about inode invalidating.
2876 * And we can also fail with pagereading if there are mandatory locks
2877 * on pages affected by this read but not on the region from pos to
2878 * pos+len-1.
2879 */
2880 if (!cinode->clientCanCacheRead)
2881 return cifs_user_readv(iocb, iov, nr_segs, pos);
2882
2883 if (cap_unix(tcon->ses) &&
2884 (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) &&
2885 ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0))
2886 return generic_file_aio_read(iocb, iov, nr_segs, pos);
2887
2888 /*
2889 * We need to hold the sem to be sure nobody modifies lock list
2890 * with a brlock that prevents reading.
2891 */
2892 down_read(&cinode->lock_sem);
2893 if (!cifs_find_lock_conflict(cfile, pos, iov_length(iov, nr_segs),
2894 tcon->ses->server->vals->shared_lock_type,
2895 NULL, true))
2896 rc = generic_file_aio_read(iocb, iov, nr_segs, pos);
2897 up_read(&cinode->lock_sem);
2898 return rc;
2899 }
2900
2901 static ssize_t
2902 cifs_read(struct file *file, char *read_data, size_t read_size, loff_t *offset)
2903 {
2904 int rc = -EACCES;
2905 unsigned int bytes_read = 0;
2906 unsigned int total_read;
2907 unsigned int current_read_size;
2908 unsigned int rsize;
2909 struct cifs_sb_info *cifs_sb;
2910 struct cifs_tcon *tcon;
2911 struct TCP_Server_Info *server;
2912 unsigned int xid;
2913 char *cur_offset;
2914 struct cifsFileInfo *open_file;
2915 struct cifs_io_parms io_parms;
2916 int buf_type = CIFS_NO_BUFFER;
2917 __u32 pid;
2918
2919 xid = get_xid();
2920 cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
2921
2922 /* FIXME: set up handlers for larger reads and/or convert to async */
2923 rsize = min_t(unsigned int, cifs_sb->rsize, CIFSMaxBufSize);
2924
2925 if (file->private_data == NULL) {
2926 rc = -EBADF;
2927 free_xid(xid);
2928 return rc;
2929 }
2930 open_file = file->private_data;
2931 tcon = tlink_tcon(open_file->tlink);
2932 server = tcon->ses->server;
2933
2934 if (!server->ops->sync_read) {
2935 free_xid(xid);
2936 return -ENOSYS;
2937 }
2938
2939 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD)
2940 pid = open_file->pid;
2941 else
2942 pid = current->tgid;
2943
2944 if ((file->f_flags & O_ACCMODE) == O_WRONLY)
2945 cFYI(1, "attempting read on write only file instance");
2946
2947 for (total_read = 0, cur_offset = read_data; read_size > total_read;
2948 total_read += bytes_read, cur_offset += bytes_read) {
2949 current_read_size = min_t(uint, read_size - total_read, rsize);
2950 /*
2951 * For windows me and 9x we do not want to request more than it
2952 * negotiated since it will refuse the read then.
2953 */
2954 if ((tcon->ses) && !(tcon->ses->capabilities &
2955 tcon->ses->server->vals->cap_large_files)) {
2956 current_read_size = min_t(uint, current_read_size,
2957 CIFSMaxBufSize);
2958 }
2959 rc = -EAGAIN;
2960 while (rc == -EAGAIN) {
2961 if (open_file->invalidHandle) {
2962 rc = cifs_reopen_file(open_file, true);
2963 if (rc != 0)
2964 break;
2965 }
2966 io_parms.pid = pid;
2967 io_parms.tcon = tcon;
2968 io_parms.offset = *offset;
2969 io_parms.length = current_read_size;
2970 rc = server->ops->sync_read(xid, open_file, &io_parms,
2971 &bytes_read, &cur_offset,
2972 &buf_type);
2973 }
2974 if (rc || (bytes_read == 0)) {
2975 if (total_read) {
2976 break;
2977 } else {
2978 free_xid(xid);
2979 return rc;
2980 }
2981 } else {
2982 cifs_stats_bytes_read(tcon, total_read);
2983 *offset += bytes_read;
2984 }
2985 }
2986 free_xid(xid);
2987 return total_read;
2988 }
2989
2990 /*
2991 * If the page is mmap'ed into a process' page tables, then we need to make
2992 * sure that it doesn't change while being written back.
2993 */
2994 static int
2995 cifs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
2996 {
2997 struct page *page = vmf->page;
2998
2999 lock_page(page);
3000 return VM_FAULT_LOCKED;
3001 }
3002
3003 static struct vm_operations_struct cifs_file_vm_ops = {
3004 .fault = filemap_fault,
3005 .page_mkwrite = cifs_page_mkwrite,
3006 .remap_pages = generic_file_remap_pages,
3007 };
3008
3009 int cifs_file_strict_mmap(struct file *file, struct vm_area_struct *vma)
3010 {
3011 int rc, xid;
3012 struct inode *inode = file->f_path.dentry->d_inode;
3013
3014 xid = get_xid();
3015
3016 if (!CIFS_I(inode)->clientCanCacheRead) {
3017 rc = cifs_invalidate_mapping(inode);
3018 if (rc)
3019 return rc;
3020 }
3021
3022 rc = generic_file_mmap(file, vma);
3023 if (rc == 0)
3024 vma->vm_ops = &cifs_file_vm_ops;
3025 free_xid(xid);
3026 return rc;
3027 }
3028
3029 int cifs_file_mmap(struct file *file, struct vm_area_struct *vma)
3030 {
3031 int rc, xid;
3032
3033 xid = get_xid();
3034 rc = cifs_revalidate_file(file);
3035 if (rc) {
3036 cFYI(1, "Validation prior to mmap failed, error=%d", rc);
3037 free_xid(xid);
3038 return rc;
3039 }
3040 rc = generic_file_mmap(file, vma);
3041 if (rc == 0)
3042 vma->vm_ops = &cifs_file_vm_ops;
3043 free_xid(xid);
3044 return rc;
3045 }
3046
3047 static void
3048 cifs_readv_complete(struct work_struct *work)
3049 {
3050 unsigned int i;
3051 struct cifs_readdata *rdata = container_of(work,
3052 struct cifs_readdata, work);
3053
3054 for (i = 0; i < rdata->nr_pages; i++) {
3055 struct page *page = rdata->pages[i];
3056
3057 lru_cache_add_file(page);
3058
3059 if (rdata->result == 0) {
3060 flush_dcache_page(page);
3061 SetPageUptodate(page);
3062 }
3063
3064 unlock_page(page);
3065
3066 if (rdata->result == 0)
3067 cifs_readpage_to_fscache(rdata->mapping->host, page);
3068
3069 page_cache_release(page);
3070 rdata->pages[i] = NULL;
3071 }
3072 kref_put(&rdata->refcount, cifs_readdata_release);
3073 }
3074
3075 static int
3076 cifs_readpages_read_into_pages(struct TCP_Server_Info *server,
3077 struct cifs_readdata *rdata, unsigned int len)
3078 {
3079 int total_read = 0, result = 0;
3080 unsigned int i;
3081 u64 eof;
3082 pgoff_t eof_index;
3083 unsigned int nr_pages = rdata->nr_pages;
3084 struct kvec iov;
3085
3086 /* determine the eof that the server (probably) has */
3087 eof = CIFS_I(rdata->mapping->host)->server_eof;
3088 eof_index = eof ? (eof - 1) >> PAGE_CACHE_SHIFT : 0;
3089 cFYI(1, "eof=%llu eof_index=%lu", eof, eof_index);
3090
3091 rdata->tailsz = PAGE_CACHE_SIZE;
3092 for (i = 0; i < nr_pages; i++) {
3093 struct page *page = rdata->pages[i];
3094
3095 if (len >= PAGE_CACHE_SIZE) {
3096 /* enough data to fill the page */
3097 iov.iov_base = kmap(page);
3098 iov.iov_len = PAGE_CACHE_SIZE;
3099 cFYI(1, "%u: idx=%lu iov_base=%p iov_len=%zu",
3100 i, page->index, iov.iov_base, iov.iov_len);
3101 len -= PAGE_CACHE_SIZE;
3102 } else if (len > 0) {
3103 /* enough for partial page, fill and zero the rest */
3104 iov.iov_base = kmap(page);
3105 iov.iov_len = len;
3106 cFYI(1, "%u: idx=%lu iov_base=%p iov_len=%zu",
3107 i, page->index, iov.iov_base, iov.iov_len);
3108 memset(iov.iov_base + len,
3109 '\0', PAGE_CACHE_SIZE - len);
3110 rdata->tailsz = len;
3111 len = 0;
3112 } else if (page->index > eof_index) {
3113 /*
3114 * The VFS will not try to do readahead past the
3115 * i_size, but it's possible that we have outstanding
3116 * writes with gaps in the middle and the i_size hasn't
3117 * caught up yet. Populate those with zeroed out pages
3118 * to prevent the VFS from repeatedly attempting to
3119 * fill them until the writes are flushed.
3120 */
3121 zero_user(page, 0, PAGE_CACHE_SIZE);
3122 lru_cache_add_file(page);
3123 flush_dcache_page(page);
3124 SetPageUptodate(page);
3125 unlock_page(page);
3126 page_cache_release(page);
3127 rdata->pages[i] = NULL;
3128 rdata->nr_pages--;
3129 continue;
3130 } else {
3131 /* no need to hold page hostage */
3132 lru_cache_add_file(page);
3133 unlock_page(page);
3134 page_cache_release(page);
3135 rdata->pages[i] = NULL;
3136 rdata->nr_pages--;
3137 continue;
3138 }
3139
3140 result = cifs_readv_from_socket(server, &iov, 1, iov.iov_len);
3141 kunmap(page);
3142 if (result < 0)
3143 break;
3144
3145 total_read += result;
3146 }
3147
3148 return total_read > 0 ? total_read : result;
3149 }
3150
3151 static int cifs_readpages(struct file *file, struct address_space *mapping,
3152 struct list_head *page_list, unsigned num_pages)
3153 {
3154 int rc;
3155 struct list_head tmplist;
3156 struct cifsFileInfo *open_file = file->private_data;
3157 struct cifs_sb_info *cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
3158 unsigned int rsize = cifs_sb->rsize;
3159 pid_t pid;
3160
3161 /*
3162 * Give up immediately if rsize is too small to read an entire page.
3163 * The VFS will fall back to readpage. We should never reach this
3164 * point however since we set ra_pages to 0 when the rsize is smaller
3165 * than a cache page.
3166 */
3167 if (unlikely(rsize < PAGE_CACHE_SIZE))
3168 return 0;
3169
3170 /*
3171 * Reads as many pages as possible from fscache. Returns -ENOBUFS
3172 * immediately if the cookie is negative
3173 */
3174 rc = cifs_readpages_from_fscache(mapping->host, mapping, page_list,
3175 &num_pages);
3176 if (rc == 0)
3177 return rc;
3178
3179 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RWPIDFORWARD)
3180 pid = open_file->pid;
3181 else
3182 pid = current->tgid;
3183
3184 rc = 0;
3185 INIT_LIST_HEAD(&tmplist);
3186
3187 cFYI(1, "%s: file=%p mapping=%p num_pages=%u", __func__, file,
3188 mapping, num_pages);
3189
3190 /*
3191 * Start with the page at end of list and move it to private
3192 * list. Do the same with any following pages until we hit
3193 * the rsize limit, hit an index discontinuity, or run out of
3194 * pages. Issue the async read and then start the loop again
3195 * until the list is empty.
3196 *
3197 * Note that list order is important. The page_list is in
3198 * the order of declining indexes. When we put the pages in
3199 * the rdata->pages, then we want them in increasing order.
3200 */
3201 while (!list_empty(page_list)) {
3202 unsigned int i;
3203 unsigned int bytes = PAGE_CACHE_SIZE;
3204 unsigned int expected_index;
3205 unsigned int nr_pages = 1;
3206 loff_t offset;
3207 struct page *page, *tpage;
3208 struct cifs_readdata *rdata;
3209
3210 page = list_entry(page_list->prev, struct page, lru);
3211
3212 /*
3213 * Lock the page and put it in the cache. Since no one else
3214 * should have access to this page, we're safe to simply set
3215 * PG_locked without checking it first.
3216 */
3217 __set_page_locked(page);
3218 rc = add_to_page_cache_locked(page, mapping,
3219 page->index, GFP_KERNEL);
3220
3221 /* give up if we can't stick it in the cache */
3222 if (rc) {
3223 __clear_page_locked(page);
3224 break;
3225 }
3226
3227 /* move first page to the tmplist */
3228 offset = (loff_t)page->index << PAGE_CACHE_SHIFT;
3229 list_move_tail(&page->lru, &tmplist);
3230
3231 /* now try and add more pages onto the request */
3232 expected_index = page->index + 1;
3233 list_for_each_entry_safe_reverse(page, tpage, page_list, lru) {
3234 /* discontinuity ? */
3235 if (page->index != expected_index)
3236 break;
3237
3238 /* would this page push the read over the rsize? */
3239 if (bytes + PAGE_CACHE_SIZE > rsize)
3240 break;
3241
3242 __set_page_locked(page);
3243 if (add_to_page_cache_locked(page, mapping,
3244 page->index, GFP_KERNEL)) {
3245 __clear_page_locked(page);
3246 break;
3247 }
3248 list_move_tail(&page->lru, &tmplist);
3249 bytes += PAGE_CACHE_SIZE;
3250 expected_index++;
3251 nr_pages++;
3252 }
3253
3254 rdata = cifs_readdata_alloc(nr_pages, cifs_readv_complete);
3255 if (!rdata) {
3256 /* best to give up if we're out of mem */
3257 list_for_each_entry_safe(page, tpage, &tmplist, lru) {
3258 list_del(&page->lru);
3259 lru_cache_add_file(page);
3260 unlock_page(page);
3261 page_cache_release(page);
3262 }
3263 rc = -ENOMEM;
3264 break;
3265 }
3266
3267 rdata->cfile = cifsFileInfo_get(open_file);
3268 rdata->mapping = mapping;
3269 rdata->offset = offset;
3270 rdata->bytes = bytes;
3271 rdata->pid = pid;
3272 rdata->pagesz = PAGE_CACHE_SIZE;
3273 rdata->read_into_pages = cifs_readpages_read_into_pages;
3274
3275 list_for_each_entry_safe(page, tpage, &tmplist, lru) {
3276 list_del(&page->lru);
3277 rdata->pages[rdata->nr_pages++] = page;
3278 }
3279
3280 rc = cifs_retry_async_readv(rdata);
3281 if (rc != 0) {
3282 for (i = 0; i < rdata->nr_pages; i++) {
3283 page = rdata->pages[i];
3284 lru_cache_add_file(page);
3285 unlock_page(page);
3286 page_cache_release(page);
3287 }
3288 kref_put(&rdata->refcount, cifs_readdata_release);
3289 break;
3290 }
3291
3292 kref_put(&rdata->refcount, cifs_readdata_release);
3293 }
3294
3295 return rc;
3296 }
3297
3298 static int cifs_readpage_worker(struct file *file, struct page *page,
3299 loff_t *poffset)
3300 {
3301 char *read_data;
3302 int rc;
3303
3304 /* Is the page cached? */
3305 rc = cifs_readpage_from_fscache(file->f_path.dentry->d_inode, page);
3306 if (rc == 0)
3307 goto read_complete;
3308
3309 page_cache_get(page);
3310 read_data = kmap(page);
3311 /* for reads over a certain size could initiate async read ahead */
3312
3313 rc = cifs_read(file, read_data, PAGE_CACHE_SIZE, poffset);
3314
3315 if (rc < 0)
3316 goto io_error;
3317 else
3318 cFYI(1, "Bytes read %d", rc);
3319
3320 file->f_path.dentry->d_inode->i_atime =
3321 current_fs_time(file->f_path.dentry->d_inode->i_sb);
3322
3323 if (PAGE_CACHE_SIZE > rc)
3324 memset(read_data + rc, 0, PAGE_CACHE_SIZE - rc);
3325
3326 flush_dcache_page(page);
3327 SetPageUptodate(page);
3328
3329 /* send this page to the cache */
3330 cifs_readpage_to_fscache(file->f_path.dentry->d_inode, page);
3331
3332 rc = 0;
3333
3334 io_error:
3335 kunmap(page);
3336 page_cache_release(page);
3337
3338 read_complete:
3339 return rc;
3340 }
3341
3342 static int cifs_readpage(struct file *file, struct page *page)
3343 {
3344 loff_t offset = (loff_t)page->index << PAGE_CACHE_SHIFT;
3345 int rc = -EACCES;
3346 unsigned int xid;
3347
3348 xid = get_xid();
3349
3350 if (file->private_data == NULL) {
3351 rc = -EBADF;
3352 free_xid(xid);
3353 return rc;
3354 }
3355
3356 cFYI(1, "readpage %p at offset %d 0x%x",
3357 page, (int)offset, (int)offset);
3358
3359 rc = cifs_readpage_worker(file, page, &offset);
3360
3361 unlock_page(page);
3362
3363 free_xid(xid);
3364 return rc;
3365 }
3366
3367 static int is_inode_writable(struct cifsInodeInfo *cifs_inode)
3368 {
3369 struct cifsFileInfo *open_file;
3370
3371 spin_lock(&cifs_file_list_lock);
3372 list_for_each_entry(open_file, &cifs_inode->openFileList, flist) {
3373 if (OPEN_FMODE(open_file->f_flags) & FMODE_WRITE) {
3374 spin_unlock(&cifs_file_list_lock);
3375 return 1;
3376 }
3377 }
3378 spin_unlock(&cifs_file_list_lock);
3379 return 0;
3380 }
3381
3382 /* We do not want to update the file size from server for inodes
3383 open for write - to avoid races with writepage extending
3384 the file - in the future we could consider allowing
3385 refreshing the inode only on increases in the file size
3386 but this is tricky to do without racing with writebehind
3387 page caching in the current Linux kernel design */
3388 bool is_size_safe_to_change(struct cifsInodeInfo *cifsInode, __u64 end_of_file)
3389 {
3390 if (!cifsInode)
3391 return true;
3392
3393 if (is_inode_writable(cifsInode)) {
3394 /* This inode is open for write at least once */
3395 struct cifs_sb_info *cifs_sb;
3396
3397 cifs_sb = CIFS_SB(cifsInode->vfs_inode.i_sb);
3398 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) {
3399 /* since no page cache to corrupt on directio
3400 we can change size safely */
3401 return true;
3402 }
3403
3404 if (i_size_read(&cifsInode->vfs_inode) < end_of_file)
3405 return true;
3406
3407 return false;
3408 } else
3409 return true;
3410 }
3411
3412 static int cifs_write_begin(struct file *file, struct address_space *mapping,
3413 loff_t pos, unsigned len, unsigned flags,
3414 struct page **pagep, void **fsdata)
3415 {
3416 pgoff_t index = pos >> PAGE_CACHE_SHIFT;
3417 loff_t offset = pos & (PAGE_CACHE_SIZE - 1);
3418 loff_t page_start = pos & PAGE_MASK;
3419 loff_t i_size;
3420 struct page *page;
3421 int rc = 0;
3422
3423 cFYI(1, "write_begin from %lld len %d", (long long)pos, len);
3424
3425 page = grab_cache_page_write_begin(mapping, index, flags);
3426 if (!page) {
3427 rc = -ENOMEM;
3428 goto out;
3429 }
3430
3431 if (PageUptodate(page))
3432 goto out;
3433
3434 /*
3435 * If we write a full page it will be up to date, no need to read from
3436 * the server. If the write is short, we'll end up doing a sync write
3437 * instead.
3438 */
3439 if (len == PAGE_CACHE_SIZE)
3440 goto out;
3441
3442 /*
3443 * optimize away the read when we have an oplock, and we're not
3444 * expecting to use any of the data we'd be reading in. That
3445 * is, when the page lies beyond the EOF, or straddles the EOF
3446 * and the write will cover all of the existing data.
3447 */
3448 if (CIFS_I(mapping->host)->clientCanCacheRead) {
3449 i_size = i_size_read(mapping->host);
3450 if (page_start >= i_size ||
3451 (offset == 0 && (pos + len) >= i_size)) {
3452 zero_user_segments(page, 0, offset,
3453 offset + len,
3454 PAGE_CACHE_SIZE);
3455 /*
3456 * PageChecked means that the parts of the page
3457 * to which we're not writing are considered up
3458 * to date. Once the data is copied to the
3459 * page, it can be set uptodate.
3460 */
3461 SetPageChecked(page);
3462 goto out;
3463 }
3464 }
3465
3466 if ((file->f_flags & O_ACCMODE) != O_WRONLY) {
3467 /*
3468 * might as well read a page, it is fast enough. If we get
3469 * an error, we don't need to return it. cifs_write_end will
3470 * do a sync write instead since PG_uptodate isn't set.
3471 */
3472 cifs_readpage_worker(file, page, &page_start);
3473 } else {
3474 /* we could try using another file handle if there is one -
3475 but how would we lock it to prevent close of that handle
3476 racing with this read? In any case
3477 this will be written out by write_end so is fine */
3478 }
3479 out:
3480 *pagep = page;
3481 return rc;
3482 }
3483
3484 static int cifs_release_page(struct page *page, gfp_t gfp)
3485 {
3486 if (PagePrivate(page))
3487 return 0;
3488
3489 return cifs_fscache_release_page(page, gfp);
3490 }
3491
3492 static void cifs_invalidate_page(struct page *page, unsigned long offset)
3493 {
3494 struct cifsInodeInfo *cifsi = CIFS_I(page->mapping->host);
3495
3496 if (offset == 0)
3497 cifs_fscache_invalidate_page(page, &cifsi->vfs_inode);
3498 }
3499
3500 static int cifs_launder_page(struct page *page)
3501 {
3502 int rc = 0;
3503 loff_t range_start = page_offset(page);
3504 loff_t range_end = range_start + (loff_t)(PAGE_CACHE_SIZE - 1);
3505 struct writeback_control wbc = {
3506 .sync_mode = WB_SYNC_ALL,
3507 .nr_to_write = 0,
3508 .range_start = range_start,
3509 .range_end = range_end,
3510 };
3511
3512 cFYI(1, "Launder page: %p", page);
3513
3514 if (clear_page_dirty_for_io(page))
3515 rc = cifs_writepage_locked(page, &wbc);
3516
3517 cifs_fscache_invalidate_page(page, page->mapping->host);
3518 return rc;
3519 }
3520
3521 void cifs_oplock_break(struct work_struct *work)
3522 {
3523 struct cifsFileInfo *cfile = container_of(work, struct cifsFileInfo,
3524 oplock_break);
3525 struct inode *inode = cfile->dentry->d_inode;
3526 struct cifsInodeInfo *cinode = CIFS_I(inode);
3527 struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
3528 int rc = 0;
3529
3530 if (inode && S_ISREG(inode->i_mode)) {
3531 if (cinode->clientCanCacheRead)
3532 break_lease(inode, O_RDONLY);
3533 else
3534 break_lease(inode, O_WRONLY);
3535 rc = filemap_fdatawrite(inode->i_mapping);
3536 if (cinode->clientCanCacheRead == 0) {
3537 rc = filemap_fdatawait(inode->i_mapping);
3538 mapping_set_error(inode->i_mapping, rc);
3539 invalidate_remote_inode(inode);
3540 }
3541 cFYI(1, "Oplock flush inode %p rc %d", inode, rc);
3542 }
3543
3544 rc = cifs_push_locks(cfile);
3545 if (rc)
3546 cERROR(1, "Push locks rc = %d", rc);
3547
3548 /*
3549 * releasing stale oplock after recent reconnect of smb session using
3550 * a now incorrect file handle is not a data integrity issue but do
3551 * not bother sending an oplock release if session to server still is
3552 * disconnected since oplock already released by the server
3553 */
3554 if (!cfile->oplock_break_cancelled) {
3555 rc = tcon->ses->server->ops->oplock_response(tcon, &cfile->fid,
3556 cinode);
3557 cFYI(1, "Oplock release rc = %d", rc);
3558 }
3559 }
3560
3561 const struct address_space_operations cifs_addr_ops = {
3562 .readpage = cifs_readpage,
3563 .readpages = cifs_readpages,
3564 .writepage = cifs_writepage,
3565 .writepages = cifs_writepages,
3566 .write_begin = cifs_write_begin,
3567 .write_end = cifs_write_end,
3568 .set_page_dirty = __set_page_dirty_nobuffers,
3569 .releasepage = cifs_release_page,
3570 .invalidatepage = cifs_invalidate_page,
3571 .launder_page = cifs_launder_page,
3572 };
3573
3574 /*
3575 * cifs_readpages requires the server to support a buffer large enough to
3576 * contain the header plus one complete page of data. Otherwise, we need
3577 * to leave cifs_readpages out of the address space operations.
3578 */
3579 const struct address_space_operations cifs_addr_ops_smallbuf = {
3580 .readpage = cifs_readpage,
3581 .writepage = cifs_writepage,
3582 .writepages = cifs_writepages,
3583 .write_begin = cifs_write_begin,
3584 .write_end = cifs_write_end,
3585 .set_page_dirty = __set_page_dirty_nobuffers,
3586 .releasepage = cifs_release_page,
3587 .invalidatepage = cifs_invalidate_page,
3588 .launder_page = cifs_launder_page,
3589 };
This page took 0.276576 seconds and 5 git commands to generate.