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