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