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