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