cifs: vary timeout on writes past EOF based on offset (try #5)
[linux-2.6] / fs / cifs / file.c
1 /*
2  *   fs/cifs/file.c
3  *
4  *   vfs operations that deal with files
5  *
6  *   Copyright (C) International Business Machines  Corp., 2002,2007
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 <asm/div64.h>
34 #include "cifsfs.h"
35 #include "cifspdu.h"
36 #include "cifsglob.h"
37 #include "cifsproto.h"
38 #include "cifs_unicode.h"
39 #include "cifs_debug.h"
40 #include "cifs_fs_sb.h"
41
42 static inline struct cifsFileInfo *cifs_init_private(
43         struct cifsFileInfo *private_data, struct inode *inode,
44         struct file *file, __u16 netfid)
45 {
46         memset(private_data, 0, sizeof(struct cifsFileInfo));
47         private_data->netfid = netfid;
48         private_data->pid = current->tgid;
49         init_MUTEX(&private_data->fh_sem);
50         mutex_init(&private_data->lock_mutex);
51         INIT_LIST_HEAD(&private_data->llist);
52         private_data->pfile = file; /* needed for writepage */
53         private_data->pInode = inode;
54         private_data->invalidHandle = false;
55         private_data->closePend = false;
56         /* we have to track num writers to the inode, since writepages
57         does not tell us which handle the write is for so there can
58         be a close (overlapping with write) of the filehandle that
59         cifs_writepages chose to use */
60         atomic_set(&private_data->wrtPending, 0);
61
62         return private_data;
63 }
64
65 static inline int cifs_convert_flags(unsigned int flags)
66 {
67         if ((flags & O_ACCMODE) == O_RDONLY)
68                 return GENERIC_READ;
69         else if ((flags & O_ACCMODE) == O_WRONLY)
70                 return GENERIC_WRITE;
71         else if ((flags & O_ACCMODE) == O_RDWR) {
72                 /* GENERIC_ALL is too much permission to request
73                    can cause unnecessary access denied on create */
74                 /* return GENERIC_ALL; */
75                 return (GENERIC_READ | GENERIC_WRITE);
76         }
77
78         return (READ_CONTROL | FILE_WRITE_ATTRIBUTES | FILE_READ_ATTRIBUTES |
79                 FILE_WRITE_EA | FILE_APPEND_DATA | FILE_WRITE_DATA |
80                 FILE_READ_DATA);
81 }
82
83 static inline fmode_t cifs_posix_convert_flags(unsigned int flags)
84 {
85         fmode_t posix_flags = 0;
86
87         if ((flags & O_ACCMODE) == O_RDONLY)
88                 posix_flags = FMODE_READ;
89         else if ((flags & O_ACCMODE) == O_WRONLY)
90                 posix_flags = FMODE_WRITE;
91         else if ((flags & O_ACCMODE) == O_RDWR) {
92                 /* GENERIC_ALL is too much permission to request
93                    can cause unnecessary access denied on create */
94                 /* return GENERIC_ALL; */
95                 posix_flags = FMODE_READ | FMODE_WRITE;
96         }
97         /* can not map O_CREAT or O_EXCL or O_TRUNC flags when
98            reopening a file.  They had their effect on the original open */
99         if (flags & O_APPEND)
100                 posix_flags |= (fmode_t)O_APPEND;
101         if (flags & O_SYNC)
102                 posix_flags |= (fmode_t)O_SYNC;
103         if (flags & O_DIRECTORY)
104                 posix_flags |= (fmode_t)O_DIRECTORY;
105         if (flags & O_NOFOLLOW)
106                 posix_flags |= (fmode_t)O_NOFOLLOW;
107         if (flags & O_DIRECT)
108                 posix_flags |= (fmode_t)O_DIRECT;
109
110         return posix_flags;
111 }
112
113 static inline int cifs_get_disposition(unsigned int flags)
114 {
115         if ((flags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL))
116                 return FILE_CREATE;
117         else if ((flags & (O_CREAT | O_TRUNC)) == (O_CREAT | O_TRUNC))
118                 return FILE_OVERWRITE_IF;
119         else if ((flags & O_CREAT) == O_CREAT)
120                 return FILE_OPEN_IF;
121         else if ((flags & O_TRUNC) == O_TRUNC)
122                 return FILE_OVERWRITE;
123         else
124                 return FILE_OPEN;
125 }
126
127 /* all arguments to this function must be checked for validity in caller */
128 static inline int cifs_posix_open_inode_helper(struct inode *inode,
129                         struct file *file, struct cifsInodeInfo *pCifsInode,
130                         struct cifsFileInfo *pCifsFile, int oplock, u16 netfid)
131 {
132         struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
133 /*      struct timespec temp; */   /* BB REMOVEME BB */
134
135         file->private_data = kmalloc(sizeof(struct cifsFileInfo), GFP_KERNEL);
136         if (file->private_data == NULL)
137                 return -ENOMEM;
138         pCifsFile = cifs_init_private(file->private_data, inode, file, netfid);
139         write_lock(&GlobalSMBSeslock);
140         list_add(&pCifsFile->tlist, &cifs_sb->tcon->openFileList);
141
142         pCifsInode = CIFS_I(file->f_path.dentry->d_inode);
143         if (pCifsInode == NULL) {
144                 write_unlock(&GlobalSMBSeslock);
145                 return -EINVAL;
146         }
147
148         /* want handles we can use to read with first
149            in the list so we do not have to walk the
150            list to search for one in write_begin */
151         if ((file->f_flags & O_ACCMODE) == O_WRONLY) {
152                 list_add_tail(&pCifsFile->flist,
153                               &pCifsInode->openFileList);
154         } else {
155                 list_add(&pCifsFile->flist,
156                          &pCifsInode->openFileList);
157         }
158
159         if (pCifsInode->clientCanCacheRead) {
160                 /* we have the inode open somewhere else
161                    no need to discard cache data */
162                 goto psx_client_can_cache;
163         }
164
165         /* BB FIXME need to fix this check to move it earlier into posix_open
166            BB  fIX following section BB FIXME */
167
168         /* if not oplocked, invalidate inode pages if mtime or file
169            size changed */
170 /*      temp = cifs_NTtimeToUnix(le64_to_cpu(buf->LastWriteTime));
171         if (timespec_equal(&file->f_path.dentry->d_inode->i_mtime, &temp) &&
172                            (file->f_path.dentry->d_inode->i_size ==
173                             (loff_t)le64_to_cpu(buf->EndOfFile))) {
174                 cFYI(1, ("inode unchanged on server"));
175         } else {
176                 if (file->f_path.dentry->d_inode->i_mapping) {
177                         rc = filemap_write_and_wait(file->f_path.dentry->d_inode->i_mapping);
178                         if (rc != 0)
179                                 CIFS_I(file->f_path.dentry->d_inode)->write_behind_rc = rc;
180                 }
181                 cFYI(1, ("invalidating remote inode since open detected it "
182                          "changed"));
183                 invalidate_remote_inode(file->f_path.dentry->d_inode);
184         } */
185
186 psx_client_can_cache:
187         if ((oplock & 0xF) == OPLOCK_EXCLUSIVE) {
188                 pCifsInode->clientCanCacheAll = true;
189                 pCifsInode->clientCanCacheRead = true;
190                 cFYI(1, ("Exclusive Oplock granted on inode %p",
191                          file->f_path.dentry->d_inode));
192         } else if ((oplock & 0xF) == OPLOCK_READ)
193                 pCifsInode->clientCanCacheRead = true;
194
195         /* will have to change the unlock if we reenable the
196            filemap_fdatawrite (which does not seem necessary */
197         write_unlock(&GlobalSMBSeslock);
198         return 0;
199 }
200
201 /* all arguments to this function must be checked for validity in caller */
202 static inline int cifs_open_inode_helper(struct inode *inode, struct file *file,
203         struct cifsInodeInfo *pCifsInode, struct cifsFileInfo *pCifsFile,
204         struct cifsTconInfo *pTcon, int *oplock, FILE_ALL_INFO *buf,
205         char *full_path, int xid)
206 {
207         struct timespec temp;
208         int rc;
209
210         /* want handles we can use to read with first
211            in the list so we do not have to walk the
212            list to search for one in write_begin */
213         if ((file->f_flags & O_ACCMODE) == O_WRONLY) {
214                 list_add_tail(&pCifsFile->flist,
215                               &pCifsInode->openFileList);
216         } else {
217                 list_add(&pCifsFile->flist,
218                          &pCifsInode->openFileList);
219         }
220         write_unlock(&GlobalSMBSeslock);
221         if (pCifsInode->clientCanCacheRead) {
222                 /* we have the inode open somewhere else
223                    no need to discard cache data */
224                 goto client_can_cache;
225         }
226
227         /* BB need same check in cifs_create too? */
228         /* if not oplocked, invalidate inode pages if mtime or file
229            size changed */
230         temp = cifs_NTtimeToUnix(le64_to_cpu(buf->LastWriteTime));
231         if (timespec_equal(&file->f_path.dentry->d_inode->i_mtime, &temp) &&
232                            (file->f_path.dentry->d_inode->i_size ==
233                             (loff_t)le64_to_cpu(buf->EndOfFile))) {
234                 cFYI(1, ("inode unchanged on server"));
235         } else {
236                 if (file->f_path.dentry->d_inode->i_mapping) {
237                 /* BB no need to lock inode until after invalidate
238                    since namei code should already have it locked? */
239                         rc = filemap_write_and_wait(file->f_path.dentry->d_inode->i_mapping);
240                         if (rc != 0)
241                                 CIFS_I(file->f_path.dentry->d_inode)->write_behind_rc = rc;
242                 }
243                 cFYI(1, ("invalidating remote inode since open detected it "
244                          "changed"));
245                 invalidate_remote_inode(file->f_path.dentry->d_inode);
246         }
247
248 client_can_cache:
249         if (pTcon->unix_ext)
250                 rc = cifs_get_inode_info_unix(&file->f_path.dentry->d_inode,
251                         full_path, inode->i_sb, xid);
252         else
253                 rc = cifs_get_inode_info(&file->f_path.dentry->d_inode,
254                         full_path, buf, inode->i_sb, xid, NULL);
255
256         if ((*oplock & 0xF) == OPLOCK_EXCLUSIVE) {
257                 pCifsInode->clientCanCacheAll = true;
258                 pCifsInode->clientCanCacheRead = true;
259                 cFYI(1, ("Exclusive Oplock granted on inode %p",
260                          file->f_path.dentry->d_inode));
261         } else if ((*oplock & 0xF) == OPLOCK_READ)
262                 pCifsInode->clientCanCacheRead = true;
263
264         return rc;
265 }
266
267 int cifs_open(struct inode *inode, struct file *file)
268 {
269         int rc = -EACCES;
270         int xid, oplock;
271         struct cifs_sb_info *cifs_sb;
272         struct cifsTconInfo *tcon;
273         struct cifsFileInfo *pCifsFile;
274         struct cifsInodeInfo *pCifsInode;
275         struct list_head *tmp;
276         char *full_path = NULL;
277         int desiredAccess;
278         int disposition;
279         __u16 netfid;
280         FILE_ALL_INFO *buf = NULL;
281
282         xid = GetXid();
283
284         cifs_sb = CIFS_SB(inode->i_sb);
285         tcon = cifs_sb->tcon;
286
287         if (file->f_flags & O_CREAT) {
288                 /* search inode for this file and fill in file->private_data */
289                 pCifsInode = CIFS_I(file->f_path.dentry->d_inode);
290                 read_lock(&GlobalSMBSeslock);
291                 list_for_each(tmp, &pCifsInode->openFileList) {
292                         pCifsFile = list_entry(tmp, struct cifsFileInfo,
293                                                flist);
294                         if ((pCifsFile->pfile == NULL) &&
295                             (pCifsFile->pid == current->tgid)) {
296                                 /* mode set in cifs_create */
297
298                                 /* needed for writepage */
299                                 pCifsFile->pfile = file;
300
301                                 file->private_data = pCifsFile;
302                                 break;
303                         }
304                 }
305                 read_unlock(&GlobalSMBSeslock);
306                 if (file->private_data != NULL) {
307                         rc = 0;
308                         FreeXid(xid);
309                         return rc;
310                 } else {
311                         if (file->f_flags & O_EXCL)
312                                 cERROR(1, ("could not find file instance for "
313                                            "new file %p", file));
314                 }
315         }
316
317         full_path = build_path_from_dentry(file->f_path.dentry);
318         if (full_path == NULL) {
319                 FreeXid(xid);
320                 return -ENOMEM;
321         }
322
323         cFYI(1, ("inode = 0x%p file flags are 0x%x for %s",
324                  inode, file->f_flags, full_path));
325
326         if (oplockEnabled)
327                 oplock = REQ_OPLOCK;
328         else
329                 oplock = 0;
330
331         if (!tcon->broken_posix_open && tcon->unix_ext &&
332             (tcon->ses->capabilities & CAP_UNIX) &&
333             (CIFS_UNIX_POSIX_PATH_OPS_CAP &
334                         le64_to_cpu(tcon->fsUnixInfo.Capability))) {
335                 int oflags = (int) cifs_posix_convert_flags(file->f_flags);
336                 /* can not refresh inode info since size could be stale */
337                 rc = cifs_posix_open(full_path, &inode, inode->i_sb,
338                                      cifs_sb->mnt_file_mode /* ignored */,
339                                      oflags, &oplock, &netfid, xid);
340                 if (rc == 0) {
341                         cFYI(1, ("posix open succeeded"));
342                         /* no need for special case handling of setting mode
343                            on read only files needed here */
344
345                         cifs_posix_open_inode_helper(inode, file, pCifsInode,
346                                                      pCifsFile, oplock, netfid);
347                         goto out;
348                 } else if ((rc == -EINVAL) || (rc == -EOPNOTSUPP)) {
349                         if (tcon->ses->serverNOS)
350                                 cERROR(1, ("server %s of type %s returned"
351                                            " unexpected error on SMB posix open"
352                                            ", disabling posix open support."
353                                            " Check if server update available.",
354                                            tcon->ses->serverName,
355                                            tcon->ses->serverNOS));
356                         tcon->broken_posix_open = true;
357                 } else if ((rc != -EIO) && (rc != -EREMOTE) &&
358                          (rc != -EOPNOTSUPP)) /* path not found or net err */
359                         goto out;
360                 /* else fallthrough to retry open the old way on network i/o
361                    or DFS errors */
362         }
363
364         desiredAccess = cifs_convert_flags(file->f_flags);
365
366 /*********************************************************************
367  *  open flag mapping table:
368  *
369  *      POSIX Flag            CIFS Disposition
370  *      ----------            ----------------
371  *      O_CREAT               FILE_OPEN_IF
372  *      O_CREAT | O_EXCL      FILE_CREATE
373  *      O_CREAT | O_TRUNC     FILE_OVERWRITE_IF
374  *      O_TRUNC               FILE_OVERWRITE
375  *      none of the above     FILE_OPEN
376  *
377  *      Note that there is not a direct match between disposition
378  *      FILE_SUPERSEDE (ie create whether or not file exists although
379  *      O_CREAT | O_TRUNC is similar but truncates the existing
380  *      file rather than creating a new file as FILE_SUPERSEDE does
381  *      (which uses the attributes / metadata passed in on open call)
382  *?
383  *?  O_SYNC is a reasonable match to CIFS writethrough flag
384  *?  and the read write flags match reasonably.  O_LARGEFILE
385  *?  is irrelevant because largefile support is always used
386  *?  by this client. Flags O_APPEND, O_DIRECT, O_DIRECTORY,
387  *       O_FASYNC, O_NOFOLLOW, O_NONBLOCK need further investigation
388  *********************************************************************/
389
390         disposition = cifs_get_disposition(file->f_flags);
391
392         /* BB pass O_SYNC flag through on file attributes .. BB */
393
394         /* Also refresh inode by passing in file_info buf returned by SMBOpen
395            and calling get_inode_info with returned buf (at least helps
396            non-Unix server case) */
397
398         /* BB we can not do this if this is the second open of a file
399            and the first handle has writebehind data, we might be
400            able to simply do a filemap_fdatawrite/filemap_fdatawait first */
401         buf = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
402         if (!buf) {
403                 rc = -ENOMEM;
404                 goto out;
405         }
406
407         if (cifs_sb->tcon->ses->capabilities & CAP_NT_SMBS)
408                 rc = CIFSSMBOpen(xid, tcon, full_path, disposition,
409                          desiredAccess, CREATE_NOT_DIR, &netfid, &oplock, buf,
410                          cifs_sb->local_nls, cifs_sb->mnt_cifs_flags
411                                  & CIFS_MOUNT_MAP_SPECIAL_CHR);
412         else
413                 rc = -EIO; /* no NT SMB support fall into legacy open below */
414
415         if (rc == -EIO) {
416                 /* Old server, try legacy style OpenX */
417                 rc = SMBLegacyOpen(xid, tcon, full_path, disposition,
418                         desiredAccess, CREATE_NOT_DIR, &netfid, &oplock, buf,
419                         cifs_sb->local_nls, cifs_sb->mnt_cifs_flags
420                                 & CIFS_MOUNT_MAP_SPECIAL_CHR);
421         }
422         if (rc) {
423                 cFYI(1, ("cifs_open returned 0x%x", rc));
424                 goto out;
425         }
426         file->private_data =
427                 kmalloc(sizeof(struct cifsFileInfo), GFP_KERNEL);
428         if (file->private_data == NULL) {
429                 rc = -ENOMEM;
430                 goto out;
431         }
432         pCifsFile = cifs_init_private(file->private_data, inode, file, netfid);
433         write_lock(&GlobalSMBSeslock);
434         list_add(&pCifsFile->tlist, &tcon->openFileList);
435
436         pCifsInode = CIFS_I(file->f_path.dentry->d_inode);
437         if (pCifsInode) {
438                 rc = cifs_open_inode_helper(inode, file, pCifsInode,
439                                             pCifsFile, tcon,
440                                             &oplock, buf, full_path, xid);
441         } else {
442                 write_unlock(&GlobalSMBSeslock);
443         }
444
445         if (oplock & CIFS_CREATE_ACTION) {
446                 /* time to set mode which we can not set earlier due to
447                    problems creating new read-only files */
448                 if (tcon->unix_ext) {
449                         struct cifs_unix_set_info_args args = {
450                                 .mode   = inode->i_mode,
451                                 .uid    = NO_CHANGE_64,
452                                 .gid    = NO_CHANGE_64,
453                                 .ctime  = NO_CHANGE_64,
454                                 .atime  = NO_CHANGE_64,
455                                 .mtime  = NO_CHANGE_64,
456                                 .device = 0,
457                         };
458                         CIFSSMBUnixSetInfo(xid, tcon, full_path, &args,
459                                             cifs_sb->local_nls,
460                                             cifs_sb->mnt_cifs_flags &
461                                                 CIFS_MOUNT_MAP_SPECIAL_CHR);
462                 }
463         }
464
465 out:
466         kfree(buf);
467         kfree(full_path);
468         FreeXid(xid);
469         return rc;
470 }
471
472 /* Try to reacquire byte range locks that were released when session */
473 /* to server was lost */
474 static int cifs_relock_file(struct cifsFileInfo *cifsFile)
475 {
476         int rc = 0;
477
478 /* BB list all locks open on this file and relock */
479
480         return rc;
481 }
482
483 static int cifs_reopen_file(struct file *file, bool can_flush)
484 {
485         int rc = -EACCES;
486         int xid, oplock;
487         struct cifs_sb_info *cifs_sb;
488         struct cifsTconInfo *tcon;
489         struct cifsFileInfo *pCifsFile;
490         struct cifsInodeInfo *pCifsInode;
491         struct inode *inode;
492         char *full_path = NULL;
493         int desiredAccess;
494         int disposition = FILE_OPEN;
495         __u16 netfid;
496
497         if (file->private_data)
498                 pCifsFile = (struct cifsFileInfo *)file->private_data;
499         else
500                 return -EBADF;
501
502         xid = GetXid();
503         down(&pCifsFile->fh_sem);
504         if (!pCifsFile->invalidHandle) {
505                 up(&pCifsFile->fh_sem);
506                 FreeXid(xid);
507                 return 0;
508         }
509
510         if (file->f_path.dentry == NULL) {
511                 cERROR(1, ("no valid name if dentry freed"));
512                 dump_stack();
513                 rc = -EBADF;
514                 goto reopen_error_exit;
515         }
516
517         inode = file->f_path.dentry->d_inode;
518         if (inode == NULL) {
519                 cERROR(1, ("inode not valid"));
520                 dump_stack();
521                 rc = -EBADF;
522                 goto reopen_error_exit;
523         }
524
525         cifs_sb = CIFS_SB(inode->i_sb);
526         tcon = cifs_sb->tcon;
527
528 /* can not grab rename sem here because various ops, including
529    those that already have the rename sem can end up causing writepage
530    to get called and if the server was down that means we end up here,
531    and we can never tell if the caller already has the rename_sem */
532         full_path = build_path_from_dentry(file->f_path.dentry);
533         if (full_path == NULL) {
534                 rc = -ENOMEM;
535 reopen_error_exit:
536                 up(&pCifsFile->fh_sem);
537                 FreeXid(xid);
538                 return rc;
539         }
540
541         cFYI(1, ("inode = 0x%p file flags 0x%x for %s",
542                  inode, file->f_flags, full_path));
543
544         if (oplockEnabled)
545                 oplock = REQ_OPLOCK;
546         else
547                 oplock = 0;
548
549         if (tcon->unix_ext && (tcon->ses->capabilities & CAP_UNIX) &&
550             (CIFS_UNIX_POSIX_PATH_OPS_CAP &
551                         le64_to_cpu(tcon->fsUnixInfo.Capability))) {
552                 int oflags = (int) cifs_posix_convert_flags(file->f_flags);
553                 /* can not refresh inode info since size could be stale */
554                 rc = cifs_posix_open(full_path, NULL, inode->i_sb,
555                                      cifs_sb->mnt_file_mode /* ignored */,
556                                      oflags, &oplock, &netfid, xid);
557                 if (rc == 0) {
558                         cFYI(1, ("posix reopen succeeded"));
559                         goto reopen_success;
560                 }
561                 /* fallthrough to retry open the old way on errors, especially
562                    in the reconnect path it is important to retry hard */
563         }
564
565         desiredAccess = cifs_convert_flags(file->f_flags);
566
567         /* Can not refresh inode by passing in file_info buf to be returned
568            by SMBOpen and then calling get_inode_info with returned buf
569            since file might have write behind data that needs to be flushed
570            and server version of file size can be stale. If we knew for sure
571            that inode was not dirty locally we could do this */
572
573         rc = CIFSSMBOpen(xid, tcon, full_path, disposition, desiredAccess,
574                          CREATE_NOT_DIR, &netfid, &oplock, NULL,
575                          cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
576                                 CIFS_MOUNT_MAP_SPECIAL_CHR);
577         if (rc) {
578                 up(&pCifsFile->fh_sem);
579                 cFYI(1, ("cifs_open returned 0x%x", rc));
580                 cFYI(1, ("oplock: %d", oplock));
581         } else {
582 reopen_success:
583                 pCifsFile->netfid = netfid;
584                 pCifsFile->invalidHandle = false;
585                 up(&pCifsFile->fh_sem);
586                 pCifsInode = CIFS_I(inode);
587                 if (pCifsInode) {
588                         if (can_flush) {
589                                 rc = filemap_write_and_wait(inode->i_mapping);
590                                 if (rc != 0)
591                                         CIFS_I(inode)->write_behind_rc = rc;
592                         /* temporarily disable caching while we
593                            go to server to get inode info */
594                                 pCifsInode->clientCanCacheAll = false;
595                                 pCifsInode->clientCanCacheRead = false;
596                                 if (tcon->unix_ext)
597                                         rc = cifs_get_inode_info_unix(&inode,
598                                                 full_path, inode->i_sb, xid);
599                                 else
600                                         rc = cifs_get_inode_info(&inode,
601                                                 full_path, NULL, inode->i_sb,
602                                                 xid, NULL);
603                         } /* else we are writing out data to server already
604                              and could deadlock if we tried to flush data, and
605                              since we do not know if we have data that would
606                              invalidate the current end of file on the server
607                              we can not go to the server to get the new inod
608                              info */
609                         if ((oplock & 0xF) == OPLOCK_EXCLUSIVE) {
610                                 pCifsInode->clientCanCacheAll = true;
611                                 pCifsInode->clientCanCacheRead = true;
612                                 cFYI(1, ("Exclusive Oplock granted on inode %p",
613                                          file->f_path.dentry->d_inode));
614                         } else if ((oplock & 0xF) == OPLOCK_READ) {
615                                 pCifsInode->clientCanCacheRead = true;
616                                 pCifsInode->clientCanCacheAll = false;
617                         } else {
618                                 pCifsInode->clientCanCacheRead = false;
619                                 pCifsInode->clientCanCacheAll = false;
620                         }
621                         cifs_relock_file(pCifsFile);
622                 }
623         }
624         kfree(full_path);
625         FreeXid(xid);
626         return rc;
627 }
628
629 int cifs_close(struct inode *inode, struct file *file)
630 {
631         int rc = 0;
632         int xid, timeout;
633         struct cifs_sb_info *cifs_sb;
634         struct cifsTconInfo *pTcon;
635         struct cifsFileInfo *pSMBFile =
636                 (struct cifsFileInfo *)file->private_data;
637
638         xid = GetXid();
639
640         cifs_sb = CIFS_SB(inode->i_sb);
641         pTcon = cifs_sb->tcon;
642         if (pSMBFile) {
643                 struct cifsLockInfo *li, *tmp;
644                 write_lock(&GlobalSMBSeslock);
645                 pSMBFile->closePend = true;
646                 if (pTcon) {
647                         /* no sense reconnecting to close a file that is
648                            already closed */
649                         if (!pTcon->need_reconnect) {
650                                 write_unlock(&GlobalSMBSeslock);
651                                 timeout = 2;
652                                 while ((atomic_read(&pSMBFile->wrtPending) != 0)
653                                         && (timeout <= 2048)) {
654                                         /* Give write a better chance to get to
655                                         server ahead of the close.  We do not
656                                         want to add a wait_q here as it would
657                                         increase the memory utilization as
658                                         the struct would be in each open file,
659                                         but this should give enough time to
660                                         clear the socket */
661                                         cFYI(DBG2,
662                                                 ("close delay, write pending"));
663                                         msleep(timeout);
664                                         timeout *= 4;
665                                 }
666                                 if (atomic_read(&pSMBFile->wrtPending))
667                                         cERROR(1, ("close with pending write"));
668                                 if (!pTcon->need_reconnect &&
669                                     !pSMBFile->invalidHandle)
670                                         rc = CIFSSMBClose(xid, pTcon,
671                                                   pSMBFile->netfid);
672                         } else
673                                 write_unlock(&GlobalSMBSeslock);
674                 } else
675                         write_unlock(&GlobalSMBSeslock);
676
677                 /* Delete any outstanding lock records.
678                    We'll lose them when the file is closed anyway. */
679                 mutex_lock(&pSMBFile->lock_mutex);
680                 list_for_each_entry_safe(li, tmp, &pSMBFile->llist, llist) {
681                         list_del(&li->llist);
682                         kfree(li);
683                 }
684                 mutex_unlock(&pSMBFile->lock_mutex);
685
686                 write_lock(&GlobalSMBSeslock);
687                 list_del(&pSMBFile->flist);
688                 list_del(&pSMBFile->tlist);
689                 write_unlock(&GlobalSMBSeslock);
690                 timeout = 10;
691                 /* We waited above to give the SMBWrite a chance to issue
692                    on the wire (so we do not get SMBWrite returning EBADF
693                    if writepages is racing with close.  Note that writepages
694                    does not specify a file handle, so it is possible for a file
695                    to be opened twice, and the application close the "wrong"
696                    file handle - in these cases we delay long enough to allow
697                    the SMBWrite to get on the wire before the SMB Close.
698                    We allow total wait here over 45 seconds, more than
699                    oplock break time, and more than enough to allow any write
700                    to complete on the server, or to time out on the client */
701                 while ((atomic_read(&pSMBFile->wrtPending) != 0)
702                                 && (timeout <= 50000)) {
703                         cERROR(1, ("writes pending, delay free of handle"));
704                         msleep(timeout);
705                         timeout *= 8;
706                 }
707                 kfree(file->private_data);
708                 file->private_data = NULL;
709         } else
710                 rc = -EBADF;
711
712         read_lock(&GlobalSMBSeslock);
713         if (list_empty(&(CIFS_I(inode)->openFileList))) {
714                 cFYI(1, ("closing last open instance for inode %p", inode));
715                 /* if the file is not open we do not know if we can cache info
716                    on this inode, much less write behind and read ahead */
717                 CIFS_I(inode)->clientCanCacheRead = false;
718                 CIFS_I(inode)->clientCanCacheAll  = false;
719         }
720         read_unlock(&GlobalSMBSeslock);
721         if ((rc == 0) && CIFS_I(inode)->write_behind_rc)
722                 rc = CIFS_I(inode)->write_behind_rc;
723         FreeXid(xid);
724         return rc;
725 }
726
727 int cifs_closedir(struct inode *inode, struct file *file)
728 {
729         int rc = 0;
730         int xid;
731         struct cifsFileInfo *pCFileStruct =
732             (struct cifsFileInfo *)file->private_data;
733         char *ptmp;
734
735         cFYI(1, ("Closedir inode = 0x%p", inode));
736
737         xid = GetXid();
738
739         if (pCFileStruct) {
740                 struct cifsTconInfo *pTcon;
741                 struct cifs_sb_info *cifs_sb =
742                         CIFS_SB(file->f_path.dentry->d_sb);
743
744                 pTcon = cifs_sb->tcon;
745
746                 cFYI(1, ("Freeing private data in close dir"));
747                 write_lock(&GlobalSMBSeslock);
748                 if (!pCFileStruct->srch_inf.endOfSearch &&
749                     !pCFileStruct->invalidHandle) {
750                         pCFileStruct->invalidHandle = true;
751                         write_unlock(&GlobalSMBSeslock);
752                         rc = CIFSFindClose(xid, pTcon, pCFileStruct->netfid);
753                         cFYI(1, ("Closing uncompleted readdir with rc %d",
754                                  rc));
755                         /* not much we can do if it fails anyway, ignore rc */
756                         rc = 0;
757                 } else
758                         write_unlock(&GlobalSMBSeslock);
759                 ptmp = pCFileStruct->srch_inf.ntwrk_buf_start;
760                 if (ptmp) {
761                         cFYI(1, ("closedir free smb buf in srch struct"));
762                         pCFileStruct->srch_inf.ntwrk_buf_start = NULL;
763                         if (pCFileStruct->srch_inf.smallBuf)
764                                 cifs_small_buf_release(ptmp);
765                         else
766                                 cifs_buf_release(ptmp);
767                 }
768                 kfree(file->private_data);
769                 file->private_data = NULL;
770         }
771         /* BB can we lock the filestruct while this is going on? */
772         FreeXid(xid);
773         return rc;
774 }
775
776 static int store_file_lock(struct cifsFileInfo *fid, __u64 len,
777                                 __u64 offset, __u8 lockType)
778 {
779         struct cifsLockInfo *li =
780                 kmalloc(sizeof(struct cifsLockInfo), GFP_KERNEL);
781         if (li == NULL)
782                 return -ENOMEM;
783         li->offset = offset;
784         li->length = len;
785         li->type = lockType;
786         mutex_lock(&fid->lock_mutex);
787         list_add(&li->llist, &fid->llist);
788         mutex_unlock(&fid->lock_mutex);
789         return 0;
790 }
791
792 int cifs_lock(struct file *file, int cmd, struct file_lock *pfLock)
793 {
794         int rc, xid;
795         __u32 numLock = 0;
796         __u32 numUnlock = 0;
797         __u64 length;
798         bool wait_flag = false;
799         struct cifs_sb_info *cifs_sb;
800         struct cifsTconInfo *tcon;
801         __u16 netfid;
802         __u8 lockType = LOCKING_ANDX_LARGE_FILES;
803         bool posix_locking = 0;
804
805         length = 1 + pfLock->fl_end - pfLock->fl_start;
806         rc = -EACCES;
807         xid = GetXid();
808
809         cFYI(1, ("Lock parm: 0x%x flockflags: "
810                  "0x%x flocktype: 0x%x start: %lld end: %lld",
811                 cmd, pfLock->fl_flags, pfLock->fl_type, pfLock->fl_start,
812                 pfLock->fl_end));
813
814         if (pfLock->fl_flags & FL_POSIX)
815                 cFYI(1, ("Posix"));
816         if (pfLock->fl_flags & FL_FLOCK)
817                 cFYI(1, ("Flock"));
818         if (pfLock->fl_flags & FL_SLEEP) {
819                 cFYI(1, ("Blocking lock"));
820                 wait_flag = true;
821         }
822         if (pfLock->fl_flags & FL_ACCESS)
823                 cFYI(1, ("Process suspended by mandatory locking - "
824                          "not implemented yet"));
825         if (pfLock->fl_flags & FL_LEASE)
826                 cFYI(1, ("Lease on file - not implemented yet"));
827         if (pfLock->fl_flags &
828             (~(FL_POSIX | FL_FLOCK | FL_SLEEP | FL_ACCESS | FL_LEASE)))
829                 cFYI(1, ("Unknown lock flags 0x%x", pfLock->fl_flags));
830
831         if (pfLock->fl_type == F_WRLCK) {
832                 cFYI(1, ("F_WRLCK "));
833                 numLock = 1;
834         } else if (pfLock->fl_type == F_UNLCK) {
835                 cFYI(1, ("F_UNLCK"));
836                 numUnlock = 1;
837                 /* Check if unlock includes more than
838                 one lock range */
839         } else if (pfLock->fl_type == F_RDLCK) {
840                 cFYI(1, ("F_RDLCK"));
841                 lockType |= LOCKING_ANDX_SHARED_LOCK;
842                 numLock = 1;
843         } else if (pfLock->fl_type == F_EXLCK) {
844                 cFYI(1, ("F_EXLCK"));
845                 numLock = 1;
846         } else if (pfLock->fl_type == F_SHLCK) {
847                 cFYI(1, ("F_SHLCK"));
848                 lockType |= LOCKING_ANDX_SHARED_LOCK;
849                 numLock = 1;
850         } else
851                 cFYI(1, ("Unknown type of lock"));
852
853         cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
854         tcon = cifs_sb->tcon;
855
856         if (file->private_data == NULL) {
857                 FreeXid(xid);
858                 return -EBADF;
859         }
860         netfid = ((struct cifsFileInfo *)file->private_data)->netfid;
861
862         if ((tcon->ses->capabilities & CAP_UNIX) &&
863             (CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) &&
864             ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0))
865                 posix_locking = 1;
866         /* BB add code here to normalize offset and length to
867         account for negative length which we can not accept over the
868         wire */
869         if (IS_GETLK(cmd)) {
870                 if (posix_locking) {
871                         int posix_lock_type;
872                         if (lockType & LOCKING_ANDX_SHARED_LOCK)
873                                 posix_lock_type = CIFS_RDLCK;
874                         else
875                                 posix_lock_type = CIFS_WRLCK;
876                         rc = CIFSSMBPosixLock(xid, tcon, netfid, 1 /* get */,
877                                         length, pfLock,
878                                         posix_lock_type, wait_flag);
879                         FreeXid(xid);
880                         return rc;
881                 }
882
883                 /* BB we could chain these into one lock request BB */
884                 rc = CIFSSMBLock(xid, tcon, netfid, length, pfLock->fl_start,
885                                  0, 1, lockType, 0 /* wait flag */ );
886                 if (rc == 0) {
887                         rc = CIFSSMBLock(xid, tcon, netfid, length,
888                                          pfLock->fl_start, 1 /* numUnlock */ ,
889                                          0 /* numLock */ , lockType,
890                                          0 /* wait flag */ );
891                         pfLock->fl_type = F_UNLCK;
892                         if (rc != 0)
893                                 cERROR(1, ("Error unlocking previously locked "
894                                            "range %d during test of lock", rc));
895                         rc = 0;
896
897                 } else {
898                         /* if rc == ERR_SHARING_VIOLATION ? */
899                         rc = 0; /* do not change lock type to unlock
900                                    since range in use */
901                 }
902
903                 FreeXid(xid);
904                 return rc;
905         }
906
907         if (!numLock && !numUnlock) {
908                 /* if no lock or unlock then nothing
909                 to do since we do not know what it is */
910                 FreeXid(xid);
911                 return -EOPNOTSUPP;
912         }
913
914         if (posix_locking) {
915                 int posix_lock_type;
916                 if (lockType & LOCKING_ANDX_SHARED_LOCK)
917                         posix_lock_type = CIFS_RDLCK;
918                 else
919                         posix_lock_type = CIFS_WRLCK;
920
921                 if (numUnlock == 1)
922                         posix_lock_type = CIFS_UNLCK;
923
924                 rc = CIFSSMBPosixLock(xid, tcon, netfid, 0 /* set */,
925                                       length, pfLock,
926                                       posix_lock_type, wait_flag);
927         } else {
928                 struct cifsFileInfo *fid =
929                         (struct cifsFileInfo *)file->private_data;
930
931                 if (numLock) {
932                         rc = CIFSSMBLock(xid, tcon, netfid, length,
933                                         pfLock->fl_start,
934                                         0, numLock, lockType, wait_flag);
935
936                         if (rc == 0) {
937                                 /* For Windows locks we must store them. */
938                                 rc = store_file_lock(fid, length,
939                                                 pfLock->fl_start, lockType);
940                         }
941                 } else if (numUnlock) {
942                         /* For each stored lock that this unlock overlaps
943                            completely, unlock it. */
944                         int stored_rc = 0;
945                         struct cifsLockInfo *li, *tmp;
946
947                         rc = 0;
948                         mutex_lock(&fid->lock_mutex);
949                         list_for_each_entry_safe(li, tmp, &fid->llist, llist) {
950                                 if (pfLock->fl_start <= li->offset &&
951                                                 (pfLock->fl_start + length) >=
952                                                 (li->offset + li->length)) {
953                                         stored_rc = CIFSSMBLock(xid, tcon,
954                                                         netfid,
955                                                         li->length, li->offset,
956                                                         1, 0, li->type, false);
957                                         if (stored_rc)
958                                                 rc = stored_rc;
959
960                                         list_del(&li->llist);
961                                         kfree(li);
962                                 }
963                         }
964                         mutex_unlock(&fid->lock_mutex);
965                 }
966         }
967
968         if (pfLock->fl_flags & FL_POSIX)
969                 posix_lock_file_wait(file, pfLock);
970         FreeXid(xid);
971         return rc;
972 }
973
974 /*
975  * Set the timeout on write requests past EOF. For some servers (Windows)
976  * these calls can be very long.
977  *
978  * If we're writing >10M past the EOF we give a 180s timeout. Anything less
979  * than that gets a 45s timeout. Writes not past EOF get 15s timeouts.
980  * The 10M cutoff is totally arbitrary. A better scheme for this would be
981  * welcome if someone wants to suggest one.
982  *
983  * We may be able to do a better job with this if there were some way to
984  * declare that a file should be sparse.
985  */
986 static int
987 cifs_write_timeout(struct cifsInodeInfo *cifsi, loff_t offset)
988 {
989         if (offset <= cifsi->server_eof)
990                 return CIFS_STD_OP;
991         else if (offset > (cifsi->server_eof + (10 * 1024 * 1024)))
992                 return CIFS_VLONG_OP;
993         else
994                 return CIFS_LONG_OP;
995 }
996
997 /* update the file size (if needed) after a write */
998 static void
999 cifs_update_eof(struct cifsInodeInfo *cifsi, loff_t offset,
1000                       unsigned int bytes_written)
1001 {
1002         loff_t end_of_write = offset + bytes_written;
1003
1004         if (end_of_write > cifsi->server_eof)
1005                 cifsi->server_eof = end_of_write;
1006 }
1007
1008 ssize_t cifs_user_write(struct file *file, const char __user *write_data,
1009         size_t write_size, loff_t *poffset)
1010 {
1011         int rc = 0;
1012         unsigned int bytes_written = 0;
1013         unsigned int total_written;
1014         struct cifs_sb_info *cifs_sb;
1015         struct cifsTconInfo *pTcon;
1016         int xid, long_op;
1017         struct cifsFileInfo *open_file;
1018         struct cifsInodeInfo *cifsi = CIFS_I(file->f_path.dentry->d_inode);
1019
1020         cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
1021
1022         pTcon = cifs_sb->tcon;
1023
1024         /* cFYI(1,
1025            (" write %d bytes to offset %lld of %s", write_size,
1026            *poffset, file->f_path.dentry->d_name.name)); */
1027
1028         if (file->private_data == NULL)
1029                 return -EBADF;
1030         open_file = (struct cifsFileInfo *) file->private_data;
1031
1032         rc = generic_write_checks(file, poffset, &write_size, 0);
1033         if (rc)
1034                 return rc;
1035
1036         xid = GetXid();
1037
1038         long_op = cifs_write_timeout(cifsi, *poffset);
1039         for (total_written = 0; write_size > total_written;
1040              total_written += bytes_written) {
1041                 rc = -EAGAIN;
1042                 while (rc == -EAGAIN) {
1043                         if (file->private_data == NULL) {
1044                                 /* file has been closed on us */
1045                                 FreeXid(xid);
1046                         /* if we have gotten here we have written some data
1047                            and blocked, and the file has been freed on us while
1048                            we blocked so return what we managed to write */
1049                                 return total_written;
1050                         }
1051                         if (open_file->closePend) {
1052                                 FreeXid(xid);
1053                                 if (total_written)
1054                                         return total_written;
1055                                 else
1056                                         return -EBADF;
1057                         }
1058                         if (open_file->invalidHandle) {
1059                                 /* we could deadlock if we called
1060                                    filemap_fdatawait from here so tell
1061                                    reopen_file not to flush data to server
1062                                    now */
1063                                 rc = cifs_reopen_file(file, false);
1064                                 if (rc != 0)
1065                                         break;
1066                         }
1067
1068                         rc = CIFSSMBWrite(xid, pTcon,
1069                                 open_file->netfid,
1070                                 min_t(const int, cifs_sb->wsize,
1071                                       write_size - total_written),
1072                                 *poffset, &bytes_written,
1073                                 NULL, write_data + total_written, long_op);
1074                 }
1075                 if (rc || (bytes_written == 0)) {
1076                         if (total_written)
1077                                 break;
1078                         else {
1079                                 FreeXid(xid);
1080                                 return rc;
1081                         }
1082                 } else {
1083                         cifs_update_eof(cifsi, *poffset, bytes_written);
1084                         *poffset += bytes_written;
1085                 }
1086                 long_op = CIFS_STD_OP; /* subsequent writes fast -
1087                                     15 seconds is plenty */
1088         }
1089
1090         cifs_stats_bytes_written(pTcon, total_written);
1091
1092         /* since the write may have blocked check these pointers again */
1093         if ((file->f_path.dentry) && (file->f_path.dentry->d_inode)) {
1094                 struct inode *inode = file->f_path.dentry->d_inode;
1095 /* Do not update local mtime - server will set its actual value on write
1096  *              inode->i_ctime = inode->i_mtime =
1097  *                      current_fs_time(inode->i_sb);*/
1098                 if (total_written > 0) {
1099                         spin_lock(&inode->i_lock);
1100                         if (*poffset > file->f_path.dentry->d_inode->i_size)
1101                                 i_size_write(file->f_path.dentry->d_inode,
1102                                         *poffset);
1103                         spin_unlock(&inode->i_lock);
1104                 }
1105                 mark_inode_dirty_sync(file->f_path.dentry->d_inode);
1106         }
1107         FreeXid(xid);
1108         return total_written;
1109 }
1110
1111 static ssize_t cifs_write(struct file *file, const char *write_data,
1112                           size_t write_size, loff_t *poffset)
1113 {
1114         int rc = 0;
1115         unsigned int bytes_written = 0;
1116         unsigned int total_written;
1117         struct cifs_sb_info *cifs_sb;
1118         struct cifsTconInfo *pTcon;
1119         int xid, long_op;
1120         struct cifsFileInfo *open_file;
1121         struct cifsInodeInfo *cifsi = CIFS_I(file->f_path.dentry->d_inode);
1122
1123         cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
1124
1125         pTcon = cifs_sb->tcon;
1126
1127         cFYI(1, ("write %zd bytes to offset %lld of %s", write_size,
1128            *poffset, file->f_path.dentry->d_name.name));
1129
1130         if (file->private_data == NULL)
1131                 return -EBADF;
1132         open_file = (struct cifsFileInfo *)file->private_data;
1133
1134         xid = GetXid();
1135
1136         long_op = cifs_write_timeout(cifsi, *poffset);
1137         for (total_written = 0; write_size > total_written;
1138              total_written += bytes_written) {
1139                 rc = -EAGAIN;
1140                 while (rc == -EAGAIN) {
1141                         if (file->private_data == NULL) {
1142                                 /* file has been closed on us */
1143                                 FreeXid(xid);
1144                         /* if we have gotten here we have written some data
1145                            and blocked, and the file has been freed on us
1146                            while we blocked so return what we managed to
1147                            write */
1148                                 return total_written;
1149                         }
1150                         if (open_file->closePend) {
1151                                 FreeXid(xid);
1152                                 if (total_written)
1153                                         return total_written;
1154                                 else
1155                                         return -EBADF;
1156                         }
1157                         if (open_file->invalidHandle) {
1158                                 /* we could deadlock if we called
1159                                    filemap_fdatawait from here so tell
1160                                    reopen_file not to flush data to
1161                                    server now */
1162                                 rc = cifs_reopen_file(file, false);
1163                                 if (rc != 0)
1164                                         break;
1165                         }
1166                         if (experimEnabled || (pTcon->ses->server &&
1167                                 ((pTcon->ses->server->secMode &
1168                                 (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
1169                                 == 0))) {
1170                                 struct kvec iov[2];
1171                                 unsigned int len;
1172
1173                                 len = min((size_t)cifs_sb->wsize,
1174                                           write_size - total_written);
1175                                 /* iov[0] is reserved for smb header */
1176                                 iov[1].iov_base = (char *)write_data +
1177                                                   total_written;
1178                                 iov[1].iov_len = len;
1179                                 rc = CIFSSMBWrite2(xid, pTcon,
1180                                                 open_file->netfid, len,
1181                                                 *poffset, &bytes_written,
1182                                                 iov, 1, long_op);
1183                         } else
1184                                 rc = CIFSSMBWrite(xid, pTcon,
1185                                          open_file->netfid,
1186                                          min_t(const int, cifs_sb->wsize,
1187                                                write_size - total_written),
1188                                          *poffset, &bytes_written,
1189                                          write_data + total_written,
1190                                          NULL, long_op);
1191                 }
1192                 if (rc || (bytes_written == 0)) {
1193                         if (total_written)
1194                                 break;
1195                         else {
1196                                 FreeXid(xid);
1197                                 return rc;
1198                         }
1199                 } else {
1200                         cifs_update_eof(cifsi, *poffset, bytes_written);
1201                         *poffset += bytes_written;
1202                 }
1203                 long_op = CIFS_STD_OP; /* subsequent writes fast -
1204                                     15 seconds is plenty */
1205         }
1206
1207         cifs_stats_bytes_written(pTcon, total_written);
1208
1209         /* since the write may have blocked check these pointers again */
1210         if ((file->f_path.dentry) && (file->f_path.dentry->d_inode)) {
1211 /*BB We could make this contingent on superblock ATIME flag too */
1212 /*              file->f_path.dentry->d_inode->i_ctime =
1213                 file->f_path.dentry->d_inode->i_mtime = CURRENT_TIME;*/
1214                 if (total_written > 0) {
1215                         spin_lock(&file->f_path.dentry->d_inode->i_lock);
1216                         if (*poffset > file->f_path.dentry->d_inode->i_size)
1217                                 i_size_write(file->f_path.dentry->d_inode,
1218                                              *poffset);
1219                         spin_unlock(&file->f_path.dentry->d_inode->i_lock);
1220                 }
1221                 mark_inode_dirty_sync(file->f_path.dentry->d_inode);
1222         }
1223         FreeXid(xid);
1224         return total_written;
1225 }
1226
1227 #ifdef CONFIG_CIFS_EXPERIMENTAL
1228 struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *cifs_inode)
1229 {
1230         struct cifsFileInfo *open_file = NULL;
1231
1232         read_lock(&GlobalSMBSeslock);
1233         /* we could simply get the first_list_entry since write-only entries
1234            are always at the end of the list but since the first entry might
1235            have a close pending, we go through the whole list */
1236         list_for_each_entry(open_file, &cifs_inode->openFileList, flist) {
1237                 if (open_file->closePend)
1238                         continue;
1239                 if (open_file->pfile && ((open_file->pfile->f_flags & O_RDWR) ||
1240                     (open_file->pfile->f_flags & O_RDONLY))) {
1241                         if (!open_file->invalidHandle) {
1242                                 /* found a good file */
1243                                 /* lock it so it will not be closed on us */
1244                                 atomic_inc(&open_file->wrtPending);
1245                                 read_unlock(&GlobalSMBSeslock);
1246                                 return open_file;
1247                         } /* else might as well continue, and look for
1248                              another, or simply have the caller reopen it
1249                              again rather than trying to fix this handle */
1250                 } else /* write only file */
1251                         break; /* write only files are last so must be done */
1252         }
1253         read_unlock(&GlobalSMBSeslock);
1254         return NULL;
1255 }
1256 #endif
1257
1258 struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *cifs_inode)
1259 {
1260         struct cifsFileInfo *open_file;
1261         bool any_available = false;
1262         int rc;
1263
1264         /* Having a null inode here (because mapping->host was set to zero by
1265         the VFS or MM) should not happen but we had reports of on oops (due to
1266         it being zero) during stress testcases so we need to check for it */
1267
1268         if (cifs_inode == NULL) {
1269                 cERROR(1, ("Null inode passed to cifs_writeable_file"));
1270                 dump_stack();
1271                 return NULL;
1272         }
1273
1274         read_lock(&GlobalSMBSeslock);
1275 refind_writable:
1276         list_for_each_entry(open_file, &cifs_inode->openFileList, flist) {
1277                 if (open_file->closePend ||
1278                     (!any_available && open_file->pid != current->tgid))
1279                         continue;
1280
1281                 if (open_file->pfile &&
1282                     ((open_file->pfile->f_flags & O_RDWR) ||
1283                      (open_file->pfile->f_flags & O_WRONLY))) {
1284                         atomic_inc(&open_file->wrtPending);
1285
1286                         if (!open_file->invalidHandle) {
1287                                 /* found a good writable file */
1288                                 read_unlock(&GlobalSMBSeslock);
1289                                 return open_file;
1290                         }
1291
1292                         read_unlock(&GlobalSMBSeslock);
1293                         /* Had to unlock since following call can block */
1294                         rc = cifs_reopen_file(open_file->pfile, false);
1295                         if (!rc) {
1296                                 if (!open_file->closePend)
1297                                         return open_file;
1298                                 else { /* start over in case this was deleted */
1299                                        /* since the list could be modified */
1300                                         read_lock(&GlobalSMBSeslock);
1301                                         atomic_dec(&open_file->wrtPending);
1302                                         goto refind_writable;
1303                                 }
1304                         }
1305
1306                         /* if it fails, try another handle if possible -
1307                         (we can not do this if closePending since
1308                         loop could be modified - in which case we
1309                         have to start at the beginning of the list
1310                         again. Note that it would be bad
1311                         to hold up writepages here (rather than
1312                         in caller) with continuous retries */
1313                         cFYI(1, ("wp failed on reopen file"));
1314                         read_lock(&GlobalSMBSeslock);
1315                         /* can not use this handle, no write
1316                            pending on this one after all */
1317                         atomic_dec(&open_file->wrtPending);
1318
1319                         if (open_file->closePend) /* list could have changed */
1320                                 goto refind_writable;
1321                         /* else we simply continue to the next entry. Thus
1322                            we do not loop on reopen errors.  If we
1323                            can not reopen the file, for example if we
1324                            reconnected to a server with another client
1325                            racing to delete or lock the file we would not
1326                            make progress if we restarted before the beginning
1327                            of the loop here. */
1328                 }
1329         }
1330         /* couldn't find useable FH with same pid, try any available */
1331         if (!any_available) {
1332                 any_available = true;
1333                 goto refind_writable;
1334         }
1335         read_unlock(&GlobalSMBSeslock);
1336         return NULL;
1337 }
1338
1339 static int cifs_partialpagewrite(struct page *page, unsigned from, unsigned to)
1340 {
1341         struct address_space *mapping = page->mapping;
1342         loff_t offset = (loff_t)page->index << PAGE_CACHE_SHIFT;
1343         char *write_data;
1344         int rc = -EFAULT;
1345         int bytes_written = 0;
1346         struct cifs_sb_info *cifs_sb;
1347         struct cifsTconInfo *pTcon;
1348         struct inode *inode;
1349         struct cifsFileInfo *open_file;
1350
1351         if (!mapping || !mapping->host)
1352                 return -EFAULT;
1353
1354         inode = page->mapping->host;
1355         cifs_sb = CIFS_SB(inode->i_sb);
1356         pTcon = cifs_sb->tcon;
1357
1358         offset += (loff_t)from;
1359         write_data = kmap(page);
1360         write_data += from;
1361
1362         if ((to > PAGE_CACHE_SIZE) || (from > to)) {
1363                 kunmap(page);
1364                 return -EIO;
1365         }
1366
1367         /* racing with truncate? */
1368         if (offset > mapping->host->i_size) {
1369                 kunmap(page);
1370                 return 0; /* don't care */
1371         }
1372
1373         /* check to make sure that we are not extending the file */
1374         if (mapping->host->i_size - offset < (loff_t)to)
1375                 to = (unsigned)(mapping->host->i_size - offset);
1376
1377         open_file = find_writable_file(CIFS_I(mapping->host));
1378         if (open_file) {
1379                 bytes_written = cifs_write(open_file->pfile, write_data,
1380                                            to-from, &offset);
1381                 atomic_dec(&open_file->wrtPending);
1382                 /* Does mm or vfs already set times? */
1383                 inode->i_atime = inode->i_mtime = current_fs_time(inode->i_sb);
1384                 if ((bytes_written > 0) && (offset))
1385                         rc = 0;
1386                 else if (bytes_written < 0)
1387                         rc = bytes_written;
1388         } else {
1389                 cFYI(1, ("No writeable filehandles for inode"));
1390                 rc = -EIO;
1391         }
1392
1393         kunmap(page);
1394         return rc;
1395 }
1396
1397 static int cifs_writepages(struct address_space *mapping,
1398                            struct writeback_control *wbc)
1399 {
1400         struct backing_dev_info *bdi = mapping->backing_dev_info;
1401         unsigned int bytes_to_write;
1402         unsigned int bytes_written;
1403         struct cifs_sb_info *cifs_sb;
1404         int done = 0;
1405         pgoff_t end;
1406         pgoff_t index;
1407         int range_whole = 0;
1408         struct kvec *iov;
1409         int len;
1410         int n_iov = 0;
1411         pgoff_t next;
1412         int nr_pages;
1413         __u64 offset = 0;
1414         struct cifsFileInfo *open_file;
1415         struct cifsInodeInfo *cifsi = CIFS_I(mapping->host);
1416         struct page *page;
1417         struct pagevec pvec;
1418         int rc = 0;
1419         int scanned = 0;
1420         int xid, long_op;
1421
1422         cifs_sb = CIFS_SB(mapping->host->i_sb);
1423
1424         /*
1425          * If wsize is smaller that the page cache size, default to writing
1426          * one page at a time via cifs_writepage
1427          */
1428         if (cifs_sb->wsize < PAGE_CACHE_SIZE)
1429                 return generic_writepages(mapping, wbc);
1430
1431         if ((cifs_sb->tcon->ses) && (cifs_sb->tcon->ses->server))
1432                 if (cifs_sb->tcon->ses->server->secMode &
1433                                 (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
1434                         if (!experimEnabled)
1435                                 return generic_writepages(mapping, wbc);
1436
1437         iov = kmalloc(32 * sizeof(struct kvec), GFP_KERNEL);
1438         if (iov == NULL)
1439                 return generic_writepages(mapping, wbc);
1440
1441
1442         /*
1443          * BB: Is this meaningful for a non-block-device file system?
1444          * If it is, we should test it again after we do I/O
1445          */
1446         if (wbc->nonblocking && bdi_write_congested(bdi)) {
1447                 wbc->encountered_congestion = 1;
1448                 kfree(iov);
1449                 return 0;
1450         }
1451
1452         xid = GetXid();
1453
1454         pagevec_init(&pvec, 0);
1455         if (wbc->range_cyclic) {
1456                 index = mapping->writeback_index; /* Start from prev offset */
1457                 end = -1;
1458         } else {
1459                 index = wbc->range_start >> PAGE_CACHE_SHIFT;
1460                 end = wbc->range_end >> PAGE_CACHE_SHIFT;
1461                 if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX)
1462                         range_whole = 1;
1463                 scanned = 1;
1464         }
1465 retry:
1466         while (!done && (index <= end) &&
1467                (nr_pages = pagevec_lookup_tag(&pvec, mapping, &index,
1468                         PAGECACHE_TAG_DIRTY,
1469                         min(end - index, (pgoff_t)PAGEVEC_SIZE - 1) + 1))) {
1470                 int first;
1471                 unsigned int i;
1472
1473                 first = -1;
1474                 next = 0;
1475                 n_iov = 0;
1476                 bytes_to_write = 0;
1477
1478                 for (i = 0; i < nr_pages; i++) {
1479                         page = pvec.pages[i];
1480                         /*
1481                          * At this point we hold neither mapping->tree_lock nor
1482                          * lock on the page itself: the page may be truncated or
1483                          * invalidated (changing page->mapping to NULL), or even
1484                          * swizzled back from swapper_space to tmpfs file
1485                          * mapping
1486                          */
1487
1488                         if (first < 0)
1489                                 lock_page(page);
1490                         else if (!trylock_page(page))
1491                                 break;
1492
1493                         if (unlikely(page->mapping != mapping)) {
1494                                 unlock_page(page);
1495                                 break;
1496                         }
1497
1498                         if (!wbc->range_cyclic && page->index > end) {
1499                                 done = 1;
1500                                 unlock_page(page);
1501                                 break;
1502                         }
1503
1504                         if (next && (page->index != next)) {
1505                                 /* Not next consecutive page */
1506                                 unlock_page(page);
1507                                 break;
1508                         }
1509
1510                         if (wbc->sync_mode != WB_SYNC_NONE)
1511                                 wait_on_page_writeback(page);
1512
1513                         if (PageWriteback(page) ||
1514                                         !clear_page_dirty_for_io(page)) {
1515                                 unlock_page(page);
1516                                 break;
1517                         }
1518
1519                         /*
1520                          * This actually clears the dirty bit in the radix tree.
1521                          * See cifs_writepage() for more commentary.
1522                          */
1523                         set_page_writeback(page);
1524
1525                         if (page_offset(page) >= mapping->host->i_size) {
1526                                 done = 1;
1527                                 unlock_page(page);
1528                                 end_page_writeback(page);
1529                                 break;
1530                         }
1531
1532                         /*
1533                          * BB can we get rid of this?  pages are held by pvec
1534                          */
1535                         page_cache_get(page);
1536
1537                         len = min(mapping->host->i_size - page_offset(page),
1538                                   (loff_t)PAGE_CACHE_SIZE);
1539
1540                         /* reserve iov[0] for the smb header */
1541                         n_iov++;
1542                         iov[n_iov].iov_base = kmap(page);
1543                         iov[n_iov].iov_len = len;
1544                         bytes_to_write += len;
1545
1546                         if (first < 0) {
1547                                 first = i;
1548                                 offset = page_offset(page);
1549                         }
1550                         next = page->index + 1;
1551                         if (bytes_to_write + PAGE_CACHE_SIZE > cifs_sb->wsize)
1552                                 break;
1553                 }
1554                 if (n_iov) {
1555                         /* Search for a writable handle every time we call
1556                          * CIFSSMBWrite2.  We can't rely on the last handle
1557                          * we used to still be valid
1558                          */
1559                         open_file = find_writable_file(CIFS_I(mapping->host));
1560                         if (!open_file) {
1561                                 cERROR(1, ("No writable handles for inode"));
1562                                 rc = -EBADF;
1563                         } else {
1564                                 long_op = cifs_write_timeout(cifsi, offset);
1565                                 rc = CIFSSMBWrite2(xid, cifs_sb->tcon,
1566                                                    open_file->netfid,
1567                                                    bytes_to_write, offset,
1568                                                    &bytes_written, iov, n_iov,
1569                                                    long_op);
1570                                 atomic_dec(&open_file->wrtPending);
1571                                 cifs_update_eof(cifsi, offset, bytes_written);
1572
1573                                 if (rc || bytes_written < bytes_to_write) {
1574                                         cERROR(1, ("Write2 ret %d, wrote %d",
1575                                                   rc, bytes_written));
1576                                         /* BB what if continued retry is
1577                                            requested via mount flags? */
1578                                         if (rc == -ENOSPC)
1579                                                 set_bit(AS_ENOSPC, &mapping->flags);
1580                                         else
1581                                                 set_bit(AS_EIO, &mapping->flags);
1582                                 } else {
1583                                         cifs_stats_bytes_written(cifs_sb->tcon,
1584                                                                  bytes_written);
1585                                 }
1586                         }
1587                         for (i = 0; i < n_iov; i++) {
1588                                 page = pvec.pages[first + i];
1589                                 /* Should we also set page error on
1590                                 success rc but too little data written? */
1591                                 /* BB investigate retry logic on temporary
1592                                 server crash cases and how recovery works
1593                                 when page marked as error */
1594                                 if (rc)
1595                                         SetPageError(page);
1596                                 kunmap(page);
1597                                 unlock_page(page);
1598                                 end_page_writeback(page);
1599                                 page_cache_release(page);
1600                         }
1601                         if ((wbc->nr_to_write -= n_iov) <= 0)
1602                                 done = 1;
1603                         index = next;
1604                 } else
1605                         /* Need to re-find the pages we skipped */
1606                         index = pvec.pages[0]->index + 1;
1607
1608                 pagevec_release(&pvec);
1609         }
1610         if (!scanned && !done) {
1611                 /*
1612                  * We hit the last page and there is more work to be done: wrap
1613                  * back to the start of the file
1614                  */
1615                 scanned = 1;
1616                 index = 0;
1617                 goto retry;
1618         }
1619         if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0))
1620                 mapping->writeback_index = index;
1621
1622         FreeXid(xid);
1623         kfree(iov);
1624         return rc;
1625 }
1626
1627 static int cifs_writepage(struct page *page, struct writeback_control *wbc)
1628 {
1629         int rc = -EFAULT;
1630         int xid;
1631
1632         xid = GetXid();
1633 /* BB add check for wbc flags */
1634         page_cache_get(page);
1635         if (!PageUptodate(page))
1636                 cFYI(1, ("ppw - page not up to date"));
1637
1638         /*
1639          * Set the "writeback" flag, and clear "dirty" in the radix tree.
1640          *
1641          * A writepage() implementation always needs to do either this,
1642          * or re-dirty the page with "redirty_page_for_writepage()" in
1643          * the case of a failure.
1644          *
1645          * Just unlocking the page will cause the radix tree tag-bits
1646          * to fail to update with the state of the page correctly.
1647          */
1648         set_page_writeback(page);
1649         rc = cifs_partialpagewrite(page, 0, PAGE_CACHE_SIZE);
1650         SetPageUptodate(page); /* BB add check for error and Clearuptodate? */
1651         unlock_page(page);
1652         end_page_writeback(page);
1653         page_cache_release(page);
1654         FreeXid(xid);
1655         return rc;
1656 }
1657
1658 static int cifs_write_end(struct file *file, struct address_space *mapping,
1659                         loff_t pos, unsigned len, unsigned copied,
1660                         struct page *page, void *fsdata)
1661 {
1662         int rc;
1663         struct inode *inode = mapping->host;
1664
1665         cFYI(1, ("write_end for page %p from pos %lld with %d bytes",
1666                  page, pos, copied));
1667
1668         if (PageChecked(page)) {
1669                 if (copied == len)
1670                         SetPageUptodate(page);
1671                 ClearPageChecked(page);
1672         } else if (!PageUptodate(page) && copied == PAGE_CACHE_SIZE)
1673                 SetPageUptodate(page);
1674
1675         if (!PageUptodate(page)) {
1676                 char *page_data;
1677                 unsigned offset = pos & (PAGE_CACHE_SIZE - 1);
1678                 int xid;
1679
1680                 xid = GetXid();
1681                 /* this is probably better than directly calling
1682                    partialpage_write since in this function the file handle is
1683                    known which we might as well leverage */
1684                 /* BB check if anything else missing out of ppw
1685                    such as updating last write time */
1686                 page_data = kmap(page);
1687                 rc = cifs_write(file, page_data + offset, copied, &pos);
1688                 /* if (rc < 0) should we set writebehind rc? */
1689                 kunmap(page);
1690
1691                 FreeXid(xid);
1692         } else {
1693                 rc = copied;
1694                 pos += copied;
1695                 set_page_dirty(page);
1696         }
1697
1698         if (rc > 0) {
1699                 spin_lock(&inode->i_lock);
1700                 if (pos > inode->i_size)
1701                         i_size_write(inode, pos);
1702                 spin_unlock(&inode->i_lock);
1703         }
1704
1705         unlock_page(page);
1706         page_cache_release(page);
1707
1708         return rc;
1709 }
1710
1711 int cifs_fsync(struct file *file, struct dentry *dentry, int datasync)
1712 {
1713         int xid;
1714         int rc = 0;
1715         struct cifsTconInfo *tcon;
1716         struct cifsFileInfo *smbfile =
1717                 (struct cifsFileInfo *)file->private_data;
1718         struct inode *inode = file->f_path.dentry->d_inode;
1719
1720         xid = GetXid();
1721
1722         cFYI(1, ("Sync file - name: %s datasync: 0x%x",
1723                 dentry->d_name.name, datasync));
1724
1725         rc = filemap_write_and_wait(inode->i_mapping);
1726         if (rc == 0) {
1727                 rc = CIFS_I(inode)->write_behind_rc;
1728                 CIFS_I(inode)->write_behind_rc = 0;
1729                 tcon = CIFS_SB(inode->i_sb)->tcon;
1730                 if (!rc && tcon && smbfile &&
1731                    !(CIFS_SB(inode->i_sb)->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC))
1732                         rc = CIFSSMBFlush(xid, tcon, smbfile->netfid);
1733         }
1734
1735         FreeXid(xid);
1736         return rc;
1737 }
1738
1739 /* static void cifs_sync_page(struct page *page)
1740 {
1741         struct address_space *mapping;
1742         struct inode *inode;
1743         unsigned long index = page->index;
1744         unsigned int rpages = 0;
1745         int rc = 0;
1746
1747         cFYI(1, ("sync page %p",page));
1748         mapping = page->mapping;
1749         if (!mapping)
1750                 return 0;
1751         inode = mapping->host;
1752         if (!inode)
1753                 return; */
1754
1755 /*      fill in rpages then
1756         result = cifs_pagein_inode(inode, index, rpages); */ /* BB finish */
1757
1758 /*      cFYI(1, ("rpages is %d for sync page of Index %ld", rpages, index));
1759
1760 #if 0
1761         if (rc < 0)
1762                 return rc;
1763         return 0;
1764 #endif
1765 } */
1766
1767 /*
1768  * As file closes, flush all cached write data for this inode checking
1769  * for write behind errors.
1770  */
1771 int cifs_flush(struct file *file, fl_owner_t id)
1772 {
1773         struct inode *inode = file->f_path.dentry->d_inode;
1774         int rc = 0;
1775
1776         /* Rather than do the steps manually:
1777            lock the inode for writing
1778            loop through pages looking for write behind data (dirty pages)
1779            coalesce into contiguous 16K (or smaller) chunks to write to server
1780            send to server (prefer in parallel)
1781            deal with writebehind errors
1782            unlock inode for writing
1783            filemapfdatawrite appears easier for the time being */
1784
1785         rc = filemap_fdatawrite(inode->i_mapping);
1786         /* reset wb rc if we were able to write out dirty pages */
1787         if (!rc) {
1788                 rc = CIFS_I(inode)->write_behind_rc;
1789                 CIFS_I(inode)->write_behind_rc = 0;
1790         }
1791
1792         cFYI(1, ("Flush inode %p file %p rc %d", inode, file, rc));
1793
1794         return rc;
1795 }
1796
1797 ssize_t cifs_user_read(struct file *file, char __user *read_data,
1798         size_t read_size, loff_t *poffset)
1799 {
1800         int rc = -EACCES;
1801         unsigned int bytes_read = 0;
1802         unsigned int total_read = 0;
1803         unsigned int current_read_size;
1804         struct cifs_sb_info *cifs_sb;
1805         struct cifsTconInfo *pTcon;
1806         int xid;
1807         struct cifsFileInfo *open_file;
1808         char *smb_read_data;
1809         char __user *current_offset;
1810         struct smb_com_read_rsp *pSMBr;
1811
1812         xid = GetXid();
1813         cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
1814         pTcon = cifs_sb->tcon;
1815
1816         if (file->private_data == NULL) {
1817                 FreeXid(xid);
1818                 return -EBADF;
1819         }
1820         open_file = (struct cifsFileInfo *)file->private_data;
1821
1822         if ((file->f_flags & O_ACCMODE) == O_WRONLY)
1823                 cFYI(1, ("attempting read on write only file instance"));
1824
1825         for (total_read = 0, current_offset = read_data;
1826              read_size > total_read;
1827              total_read += bytes_read, current_offset += bytes_read) {
1828                 current_read_size = min_t(const int, read_size - total_read,
1829                                           cifs_sb->rsize);
1830                 rc = -EAGAIN;
1831                 smb_read_data = NULL;
1832                 while (rc == -EAGAIN) {
1833                         int buf_type = CIFS_NO_BUFFER;
1834                         if ((open_file->invalidHandle) &&
1835                             (!open_file->closePend)) {
1836                                 rc = cifs_reopen_file(file, true);
1837                                 if (rc != 0)
1838                                         break;
1839                         }
1840                         rc = CIFSSMBRead(xid, pTcon,
1841                                          open_file->netfid,
1842                                          current_read_size, *poffset,
1843                                          &bytes_read, &smb_read_data,
1844                                          &buf_type);
1845                         pSMBr = (struct smb_com_read_rsp *)smb_read_data;
1846                         if (smb_read_data) {
1847                                 if (copy_to_user(current_offset,
1848                                                 smb_read_data +
1849                                                 4 /* RFC1001 length field */ +
1850                                                 le16_to_cpu(pSMBr->DataOffset),
1851                                                 bytes_read))
1852                                         rc = -EFAULT;
1853
1854                                 if (buf_type == CIFS_SMALL_BUFFER)
1855                                         cifs_small_buf_release(smb_read_data);
1856                                 else if (buf_type == CIFS_LARGE_BUFFER)
1857                                         cifs_buf_release(smb_read_data);
1858                                 smb_read_data = NULL;
1859                         }
1860                 }
1861                 if (rc || (bytes_read == 0)) {
1862                         if (total_read) {
1863                                 break;
1864                         } else {
1865                                 FreeXid(xid);
1866                                 return rc;
1867                         }
1868                 } else {
1869                         cifs_stats_bytes_read(pTcon, bytes_read);
1870                         *poffset += bytes_read;
1871                 }
1872         }
1873         FreeXid(xid);
1874         return total_read;
1875 }
1876
1877
1878 static ssize_t cifs_read(struct file *file, char *read_data, size_t read_size,
1879         loff_t *poffset)
1880 {
1881         int rc = -EACCES;
1882         unsigned int bytes_read = 0;
1883         unsigned int total_read;
1884         unsigned int current_read_size;
1885         struct cifs_sb_info *cifs_sb;
1886         struct cifsTconInfo *pTcon;
1887         int xid;
1888         char *current_offset;
1889         struct cifsFileInfo *open_file;
1890         int buf_type = CIFS_NO_BUFFER;
1891
1892         xid = GetXid();
1893         cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
1894         pTcon = cifs_sb->tcon;
1895
1896         if (file->private_data == NULL) {
1897                 FreeXid(xid);
1898                 return -EBADF;
1899         }
1900         open_file = (struct cifsFileInfo *)file->private_data;
1901
1902         if ((file->f_flags & O_ACCMODE) == O_WRONLY)
1903                 cFYI(1, ("attempting read on write only file instance"));
1904
1905         for (total_read = 0, current_offset = read_data;
1906              read_size > total_read;
1907              total_read += bytes_read, current_offset += bytes_read) {
1908                 current_read_size = min_t(const int, read_size - total_read,
1909                                           cifs_sb->rsize);
1910                 /* For windows me and 9x we do not want to request more
1911                 than it negotiated since it will refuse the read then */
1912                 if ((pTcon->ses) &&
1913                         !(pTcon->ses->capabilities & CAP_LARGE_FILES)) {
1914                         current_read_size = min_t(const int, current_read_size,
1915                                         pTcon->ses->server->maxBuf - 128);
1916                 }
1917                 rc = -EAGAIN;
1918                 while (rc == -EAGAIN) {
1919                         if ((open_file->invalidHandle) &&
1920                             (!open_file->closePend)) {
1921                                 rc = cifs_reopen_file(file, true);
1922                                 if (rc != 0)
1923                                         break;
1924                         }
1925                         rc = CIFSSMBRead(xid, pTcon,
1926                                          open_file->netfid,
1927                                          current_read_size, *poffset,
1928                                          &bytes_read, &current_offset,
1929                                          &buf_type);
1930                 }
1931                 if (rc || (bytes_read == 0)) {
1932                         if (total_read) {
1933                                 break;
1934                         } else {
1935                                 FreeXid(xid);
1936                                 return rc;
1937                         }
1938                 } else {
1939                         cifs_stats_bytes_read(pTcon, total_read);
1940                         *poffset += bytes_read;
1941                 }
1942         }
1943         FreeXid(xid);
1944         return total_read;
1945 }
1946
1947 int cifs_file_mmap(struct file *file, struct vm_area_struct *vma)
1948 {
1949         struct dentry *dentry = file->f_path.dentry;
1950         int rc, xid;
1951
1952         xid = GetXid();
1953         rc = cifs_revalidate(dentry);
1954         if (rc) {
1955                 cFYI(1, ("Validation prior to mmap failed, error=%d", rc));
1956                 FreeXid(xid);
1957                 return rc;
1958         }
1959         rc = generic_file_mmap(file, vma);
1960         FreeXid(xid);
1961         return rc;
1962 }
1963
1964
1965 static void cifs_copy_cache_pages(struct address_space *mapping,
1966         struct list_head *pages, int bytes_read, char *data,
1967         struct pagevec *plru_pvec)
1968 {
1969         struct page *page;
1970         char *target;
1971
1972         while (bytes_read > 0) {
1973                 if (list_empty(pages))
1974                         break;
1975
1976                 page = list_entry(pages->prev, struct page, lru);
1977                 list_del(&page->lru);
1978
1979                 if (add_to_page_cache(page, mapping, page->index,
1980                                       GFP_KERNEL)) {
1981                         page_cache_release(page);
1982                         cFYI(1, ("Add page cache failed"));
1983                         data += PAGE_CACHE_SIZE;
1984                         bytes_read -= PAGE_CACHE_SIZE;
1985                         continue;
1986                 }
1987
1988                 target = kmap_atomic(page, KM_USER0);
1989
1990                 if (PAGE_CACHE_SIZE > bytes_read) {
1991                         memcpy(target, data, bytes_read);
1992                         /* zero the tail end of this partial page */
1993                         memset(target + bytes_read, 0,
1994                                PAGE_CACHE_SIZE - bytes_read);
1995                         bytes_read = 0;
1996                 } else {
1997                         memcpy(target, data, PAGE_CACHE_SIZE);
1998                         bytes_read -= PAGE_CACHE_SIZE;
1999                 }
2000                 kunmap_atomic(target, KM_USER0);
2001
2002                 flush_dcache_page(page);
2003                 SetPageUptodate(page);
2004                 unlock_page(page);
2005                 if (!pagevec_add(plru_pvec, page))
2006                         __pagevec_lru_add_file(plru_pvec);
2007                 data += PAGE_CACHE_SIZE;
2008         }
2009         return;
2010 }
2011
2012 static int cifs_readpages(struct file *file, struct address_space *mapping,
2013         struct list_head *page_list, unsigned num_pages)
2014 {
2015         int rc = -EACCES;
2016         int xid;
2017         loff_t offset;
2018         struct page *page;
2019         struct cifs_sb_info *cifs_sb;
2020         struct cifsTconInfo *pTcon;
2021         unsigned int bytes_read = 0;
2022         unsigned int read_size, i;
2023         char *smb_read_data = NULL;
2024         struct smb_com_read_rsp *pSMBr;
2025         struct pagevec lru_pvec;
2026         struct cifsFileInfo *open_file;
2027         int buf_type = CIFS_NO_BUFFER;
2028
2029         xid = GetXid();
2030         if (file->private_data == NULL) {
2031                 FreeXid(xid);
2032                 return -EBADF;
2033         }
2034         open_file = (struct cifsFileInfo *)file->private_data;
2035         cifs_sb = CIFS_SB(file->f_path.dentry->d_sb);
2036         pTcon = cifs_sb->tcon;
2037
2038         pagevec_init(&lru_pvec, 0);
2039         cFYI(DBG2, ("rpages: num pages %d", num_pages));
2040         for (i = 0; i < num_pages; ) {
2041                 unsigned contig_pages;
2042                 struct page *tmp_page;
2043                 unsigned long expected_index;
2044
2045                 if (list_empty(page_list))
2046                         break;
2047
2048                 page = list_entry(page_list->prev, struct page, lru);
2049                 offset = (loff_t)page->index << PAGE_CACHE_SHIFT;
2050
2051                 /* count adjacent pages that we will read into */
2052                 contig_pages = 0;
2053                 expected_index =
2054                         list_entry(page_list->prev, struct page, lru)->index;
2055                 list_for_each_entry_reverse(tmp_page, page_list, lru) {
2056                         if (tmp_page->index == expected_index) {
2057                                 contig_pages++;
2058                                 expected_index++;
2059                         } else
2060                                 break;
2061                 }
2062                 if (contig_pages + i >  num_pages)
2063                         contig_pages = num_pages - i;
2064
2065                 /* for reads over a certain size could initiate async
2066                    read ahead */
2067
2068                 read_size = contig_pages * PAGE_CACHE_SIZE;
2069                 /* Read size needs to be in multiples of one page */
2070                 read_size = min_t(const unsigned int, read_size,
2071                                   cifs_sb->rsize & PAGE_CACHE_MASK);
2072                 cFYI(DBG2, ("rpages: read size 0x%x  contiguous pages %d",
2073                                 read_size, contig_pages));
2074                 rc = -EAGAIN;
2075                 while (rc == -EAGAIN) {
2076                         if ((open_file->invalidHandle) &&
2077                             (!open_file->closePend)) {
2078                                 rc = cifs_reopen_file(file, true);
2079                                 if (rc != 0)
2080                                         break;
2081                         }
2082
2083                         rc = CIFSSMBRead(xid, pTcon,
2084                                          open_file->netfid,
2085                                          read_size, offset,
2086                                          &bytes_read, &smb_read_data,
2087                                          &buf_type);
2088                         /* BB more RC checks ? */
2089                         if (rc == -EAGAIN) {
2090                                 if (smb_read_data) {
2091                                         if (buf_type == CIFS_SMALL_BUFFER)
2092                                                 cifs_small_buf_release(smb_read_data);
2093                                         else if (buf_type == CIFS_LARGE_BUFFER)
2094                                                 cifs_buf_release(smb_read_data);
2095                                         smb_read_data = NULL;
2096                                 }
2097                         }
2098                 }
2099                 if ((rc < 0) || (smb_read_data == NULL)) {
2100                         cFYI(1, ("Read error in readpages: %d", rc));
2101                         break;
2102                 } else if (bytes_read > 0) {
2103                         task_io_account_read(bytes_read);
2104                         pSMBr = (struct smb_com_read_rsp *)smb_read_data;
2105                         cifs_copy_cache_pages(mapping, page_list, bytes_read,
2106                                 smb_read_data + 4 /* RFC1001 hdr */ +
2107                                 le16_to_cpu(pSMBr->DataOffset), &lru_pvec);
2108
2109                         i +=  bytes_read >> PAGE_CACHE_SHIFT;
2110                         cifs_stats_bytes_read(pTcon, bytes_read);
2111                         if ((bytes_read & PAGE_CACHE_MASK) != bytes_read) {
2112                                 i++; /* account for partial page */
2113
2114                                 /* server copy of file can have smaller size
2115                                    than client */
2116                                 /* BB do we need to verify this common case ?
2117                                    this case is ok - if we are at server EOF
2118                                    we will hit it on next read */
2119
2120                                 /* break; */
2121                         }
2122                 } else {
2123                         cFYI(1, ("No bytes read (%d) at offset %lld . "
2124                                  "Cleaning remaining pages from readahead list",
2125                                  bytes_read, offset));
2126                         /* BB turn off caching and do new lookup on
2127                            file size at server? */
2128                         break;
2129                 }
2130                 if (smb_read_data) {
2131                         if (buf_type == CIFS_SMALL_BUFFER)
2132                                 cifs_small_buf_release(smb_read_data);
2133                         else if (buf_type == CIFS_LARGE_BUFFER)
2134                                 cifs_buf_release(smb_read_data);
2135                         smb_read_data = NULL;
2136                 }
2137                 bytes_read = 0;
2138         }
2139
2140         pagevec_lru_add_file(&lru_pvec);
2141
2142 /* need to free smb_read_data buf before exit */
2143         if (smb_read_data) {
2144                 if (buf_type == CIFS_SMALL_BUFFER)
2145                         cifs_small_buf_release(smb_read_data);
2146                 else if (buf_type == CIFS_LARGE_BUFFER)
2147                         cifs_buf_release(smb_read_data);
2148                 smb_read_data = NULL;
2149         }
2150
2151         FreeXid(xid);
2152         return rc;
2153 }
2154
2155 static int cifs_readpage_worker(struct file *file, struct page *page,
2156         loff_t *poffset)
2157 {
2158         char *read_data;
2159         int rc;
2160
2161         page_cache_get(page);
2162         read_data = kmap(page);
2163         /* for reads over a certain size could initiate async read ahead */
2164
2165         rc = cifs_read(file, read_data, PAGE_CACHE_SIZE, poffset);
2166
2167         if (rc < 0)
2168                 goto io_error;
2169         else
2170                 cFYI(1, ("Bytes read %d", rc));
2171
2172         file->f_path.dentry->d_inode->i_atime =
2173                 current_fs_time(file->f_path.dentry->d_inode->i_sb);
2174
2175         if (PAGE_CACHE_SIZE > rc)
2176                 memset(read_data + rc, 0, PAGE_CACHE_SIZE - rc);
2177
2178         flush_dcache_page(page);
2179         SetPageUptodate(page);
2180         rc = 0;
2181
2182 io_error:
2183         kunmap(page);
2184         page_cache_release(page);
2185         return rc;
2186 }
2187
2188 static int cifs_readpage(struct file *file, struct page *page)
2189 {
2190         loff_t offset = (loff_t)page->index << PAGE_CACHE_SHIFT;
2191         int rc = -EACCES;
2192         int xid;
2193
2194         xid = GetXid();
2195
2196         if (file->private_data == NULL) {
2197                 FreeXid(xid);
2198                 return -EBADF;
2199         }
2200
2201         cFYI(1, ("readpage %p at offset %d 0x%x\n",
2202                  page, (int)offset, (int)offset));
2203
2204         rc = cifs_readpage_worker(file, page, &offset);
2205
2206         unlock_page(page);
2207
2208         FreeXid(xid);
2209         return rc;
2210 }
2211
2212 static int is_inode_writable(struct cifsInodeInfo *cifs_inode)
2213 {
2214         struct cifsFileInfo *open_file;
2215
2216         read_lock(&GlobalSMBSeslock);
2217         list_for_each_entry(open_file, &cifs_inode->openFileList, flist) {
2218                 if (open_file->closePend)
2219                         continue;
2220                 if (open_file->pfile &&
2221                     ((open_file->pfile->f_flags & O_RDWR) ||
2222                      (open_file->pfile->f_flags & O_WRONLY))) {
2223                         read_unlock(&GlobalSMBSeslock);
2224                         return 1;
2225                 }
2226         }
2227         read_unlock(&GlobalSMBSeslock);
2228         return 0;
2229 }
2230
2231 /* We do not want to update the file size from server for inodes
2232    open for write - to avoid races with writepage extending
2233    the file - in the future we could consider allowing
2234    refreshing the inode only on increases in the file size
2235    but this is tricky to do without racing with writebehind
2236    page caching in the current Linux kernel design */
2237 bool is_size_safe_to_change(struct cifsInodeInfo *cifsInode, __u64 end_of_file)
2238 {
2239         if (!cifsInode)
2240                 return true;
2241
2242         if (is_inode_writable(cifsInode)) {
2243                 /* This inode is open for write at least once */
2244                 struct cifs_sb_info *cifs_sb;
2245
2246                 cifs_sb = CIFS_SB(cifsInode->vfs_inode.i_sb);
2247                 if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) {
2248                         /* since no page cache to corrupt on directio
2249                         we can change size safely */
2250                         return true;
2251                 }
2252
2253                 if (i_size_read(&cifsInode->vfs_inode) < end_of_file)
2254                         return true;
2255
2256                 return false;
2257         } else
2258                 return true;
2259 }
2260
2261 static int cifs_write_begin(struct file *file, struct address_space *mapping,
2262                         loff_t pos, unsigned len, unsigned flags,
2263                         struct page **pagep, void **fsdata)
2264 {
2265         pgoff_t index = pos >> PAGE_CACHE_SHIFT;
2266         loff_t offset = pos & (PAGE_CACHE_SIZE - 1);
2267         loff_t page_start = pos & PAGE_MASK;
2268         loff_t i_size;
2269         struct page *page;
2270         int rc = 0;
2271
2272         cFYI(1, ("write_begin from %lld len %d", (long long)pos, len));
2273
2274         page = grab_cache_page_write_begin(mapping, index, flags);
2275         if (!page) {
2276                 rc = -ENOMEM;
2277                 goto out;
2278         }
2279
2280         if (PageUptodate(page))
2281                 goto out;
2282
2283         /*
2284          * If we write a full page it will be up to date, no need to read from
2285          * the server. If the write is short, we'll end up doing a sync write
2286          * instead.
2287          */
2288         if (len == PAGE_CACHE_SIZE)
2289                 goto out;
2290
2291         /*
2292          * optimize away the read when we have an oplock, and we're not
2293          * expecting to use any of the data we'd be reading in. That
2294          * is, when the page lies beyond the EOF, or straddles the EOF
2295          * and the write will cover all of the existing data.
2296          */
2297         if (CIFS_I(mapping->host)->clientCanCacheRead) {
2298                 i_size = i_size_read(mapping->host);
2299                 if (page_start >= i_size ||
2300                     (offset == 0 && (pos + len) >= i_size)) {
2301                         zero_user_segments(page, 0, offset,
2302                                            offset + len,
2303                                            PAGE_CACHE_SIZE);
2304                         /*
2305                          * PageChecked means that the parts of the page
2306                          * to which we're not writing are considered up
2307                          * to date. Once the data is copied to the
2308                          * page, it can be set uptodate.
2309                          */
2310                         SetPageChecked(page);
2311                         goto out;
2312                 }
2313         }
2314
2315         if ((file->f_flags & O_ACCMODE) != O_WRONLY) {
2316                 /*
2317                  * might as well read a page, it is fast enough. If we get
2318                  * an error, we don't need to return it. cifs_write_end will
2319                  * do a sync write instead since PG_uptodate isn't set.
2320                  */
2321                 cifs_readpage_worker(file, page, &page_start);
2322         } else {
2323                 /* we could try using another file handle if there is one -
2324                    but how would we lock it to prevent close of that handle
2325                    racing with this read? In any case
2326                    this will be written out by write_end so is fine */
2327         }
2328 out:
2329         *pagep = page;
2330         return rc;
2331 }
2332
2333 const struct address_space_operations cifs_addr_ops = {
2334         .readpage = cifs_readpage,
2335         .readpages = cifs_readpages,
2336         .writepage = cifs_writepage,
2337         .writepages = cifs_writepages,
2338         .write_begin = cifs_write_begin,
2339         .write_end = cifs_write_end,
2340         .set_page_dirty = __set_page_dirty_nobuffers,
2341         /* .sync_page = cifs_sync_page, */
2342         /* .direct_IO = */
2343 };
2344
2345 /*
2346  * cifs_readpages requires the server to support a buffer large enough to
2347  * contain the header plus one complete page of data.  Otherwise, we need
2348  * to leave cifs_readpages out of the address space operations.
2349  */
2350 const struct address_space_operations cifs_addr_ops_smallbuf = {
2351         .readpage = cifs_readpage,
2352         .writepage = cifs_writepage,
2353         .writepages = cifs_writepages,
2354         .write_begin = cifs_write_begin,
2355         .write_end = cifs_write_end,
2356         .set_page_dirty = __set_page_dirty_nobuffers,
2357         /* .sync_page = cifs_sync_page, */
2358         /* .direct_IO = */
2359 };