4 * vfs operations that deal with files
6 * Copyright (C) International Business Machines Corp., 2002,2007
7 * Author(s): Steve French (sfrench@us.ibm.com)
8 * Jeremy Allison (jra@samba.org)
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.
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.
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
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>
37 #include "cifsproto.h"
38 #include "cifs_unicode.h"
39 #include "cifs_debug.h"
40 #include "cifs_fs_sb.h"
42 static inline struct cifsFileInfo
*cifs_init_private(
43 struct cifsFileInfo
*private_data
, struct inode
*inode
,
44 struct file
*file
, __u16 netfid
)
46 memset(private_data
, 0, sizeof(struct cifsFileInfo
));
47 private_data
->netfid
= netfid
;
48 private_data
->pid
= current
->tgid
;
49 mutex_init(&private_data
->fh_mutex
);
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 /* Initialize reference count to one. The private data is
57 freed on the release of the last reference */
58 atomic_set(&private_data
->count
, 1);
63 static inline int cifs_convert_flags(unsigned int flags
)
65 if ((flags
& O_ACCMODE
) == O_RDONLY
)
67 else if ((flags
& O_ACCMODE
) == O_WRONLY
)
69 else if ((flags
& O_ACCMODE
) == O_RDWR
) {
70 /* GENERIC_ALL is too much permission to request
71 can cause unnecessary access denied on create */
72 /* return GENERIC_ALL; */
73 return (GENERIC_READ
| GENERIC_WRITE
);
76 return (READ_CONTROL
| FILE_WRITE_ATTRIBUTES
| FILE_READ_ATTRIBUTES
|
77 FILE_WRITE_EA
| FILE_APPEND_DATA
| FILE_WRITE_DATA
|
81 static inline fmode_t
cifs_posix_convert_flags(unsigned int flags
)
83 fmode_t posix_flags
= 0;
85 if ((flags
& O_ACCMODE
) == O_RDONLY
)
86 posix_flags
= FMODE_READ
;
87 else if ((flags
& O_ACCMODE
) == O_WRONLY
)
88 posix_flags
= FMODE_WRITE
;
89 else if ((flags
& O_ACCMODE
) == O_RDWR
) {
90 /* GENERIC_ALL is too much permission to request
91 can cause unnecessary access denied on create */
92 /* return GENERIC_ALL; */
93 posix_flags
= FMODE_READ
| FMODE_WRITE
;
95 /* can not map O_CREAT or O_EXCL or O_TRUNC flags when
96 reopening a file. They had their effect on the original open */
98 posix_flags
|= (fmode_t
)O_APPEND
;
100 posix_flags
|= (fmode_t
)O_SYNC
;
101 if (flags
& O_DIRECTORY
)
102 posix_flags
|= (fmode_t
)O_DIRECTORY
;
103 if (flags
& O_NOFOLLOW
)
104 posix_flags
|= (fmode_t
)O_NOFOLLOW
;
105 if (flags
& O_DIRECT
)
106 posix_flags
|= (fmode_t
)O_DIRECT
;
111 static inline int cifs_get_disposition(unsigned int flags
)
113 if ((flags
& (O_CREAT
| O_EXCL
)) == (O_CREAT
| O_EXCL
))
115 else if ((flags
& (O_CREAT
| O_TRUNC
)) == (O_CREAT
| O_TRUNC
))
116 return FILE_OVERWRITE_IF
;
117 else if ((flags
& O_CREAT
) == O_CREAT
)
119 else if ((flags
& O_TRUNC
) == O_TRUNC
)
120 return FILE_OVERWRITE
;
125 /* all arguments to this function must be checked for validity in caller */
127 cifs_posix_open_inode_helper(struct inode
*inode
, struct file
*file
,
128 struct cifsInodeInfo
*pCifsInode
,
129 struct cifsFileInfo
*pCifsFile
, __u32 oplock
,
133 write_lock(&GlobalSMBSeslock
);
135 pCifsInode
= CIFS_I(file
->f_path
.dentry
->d_inode
);
136 if (pCifsInode
== NULL
) {
137 write_unlock(&GlobalSMBSeslock
);
141 if (pCifsInode
->clientCanCacheRead
) {
142 /* we have the inode open somewhere else
143 no need to discard cache data */
144 goto psx_client_can_cache
;
147 /* BB FIXME need to fix this check to move it earlier into posix_open
148 BB fIX following section BB FIXME */
150 /* if not oplocked, invalidate inode pages if mtime or file
152 /* temp = cifs_NTtimeToUnix(le64_to_cpu(buf->LastWriteTime));
153 if (timespec_equal(&file->f_path.dentry->d_inode->i_mtime, &temp) &&
154 (file->f_path.dentry->d_inode->i_size ==
155 (loff_t)le64_to_cpu(buf->EndOfFile))) {
156 cFYI(1, ("inode unchanged on server"));
158 if (file->f_path.dentry->d_inode->i_mapping) {
159 rc = filemap_write_and_wait(file->f_path.dentry->d_inode->i_mapping);
161 CIFS_I(file->f_path.dentry->d_inode)->write_behind_rc = rc;
163 cFYI(1, ("invalidating remote inode since open detected it "
165 invalidate_remote_inode(file->f_path.dentry->d_inode);
168 psx_client_can_cache
:
169 if ((oplock
& 0xF) == OPLOCK_EXCLUSIVE
) {
170 pCifsInode
->clientCanCacheAll
= true;
171 pCifsInode
->clientCanCacheRead
= true;
172 cFYI(1, ("Exclusive Oplock granted on inode %p",
173 file
->f_path
.dentry
->d_inode
));
174 } else if ((oplock
& 0xF) == OPLOCK_READ
)
175 pCifsInode
->clientCanCacheRead
= true;
177 /* will have to change the unlock if we reenable the
178 filemap_fdatawrite (which does not seem necessary */
179 write_unlock(&GlobalSMBSeslock
);
183 static struct cifsFileInfo
*
184 cifs_fill_filedata(struct file
*file
)
186 struct list_head
*tmp
;
187 struct cifsFileInfo
*pCifsFile
= NULL
;
188 struct cifsInodeInfo
*pCifsInode
= NULL
;
190 /* search inode for this file and fill in file->private_data */
191 pCifsInode
= CIFS_I(file
->f_path
.dentry
->d_inode
);
192 read_lock(&GlobalSMBSeslock
);
193 list_for_each(tmp
, &pCifsInode
->openFileList
) {
194 pCifsFile
= list_entry(tmp
, struct cifsFileInfo
, flist
);
195 if ((pCifsFile
->pfile
== NULL
) &&
196 (pCifsFile
->pid
== current
->tgid
)) {
197 /* mode set in cifs_create */
199 /* needed for writepage */
200 pCifsFile
->pfile
= file
;
201 file
->private_data
= pCifsFile
;
205 read_unlock(&GlobalSMBSeslock
);
207 if (file
->private_data
!= NULL
) {
209 } else if ((file
->f_flags
& O_CREAT
) && (file
->f_flags
& O_EXCL
))
210 cERROR(1, ("could not find file instance for "
211 "new file %p", file
));
215 /* all arguments to this function must be checked for validity in caller */
216 static inline int cifs_open_inode_helper(struct inode
*inode
, struct file
*file
,
217 struct cifsInodeInfo
*pCifsInode
, struct cifsFileInfo
*pCifsFile
,
218 struct cifsTconInfo
*pTcon
, int *oplock
, FILE_ALL_INFO
*buf
,
219 char *full_path
, int xid
)
221 struct timespec temp
;
224 /* want handles we can use to read with first
225 in the list so we do not have to walk the
226 list to search for one in write_begin */
227 if ((file
->f_flags
& O_ACCMODE
) == O_WRONLY
) {
228 list_add_tail(&pCifsFile
->flist
,
229 &pCifsInode
->openFileList
);
231 list_add(&pCifsFile
->flist
,
232 &pCifsInode
->openFileList
);
234 write_unlock(&GlobalSMBSeslock
);
235 if (pCifsInode
->clientCanCacheRead
) {
236 /* we have the inode open somewhere else
237 no need to discard cache data */
238 goto client_can_cache
;
241 /* BB need same check in cifs_create too? */
242 /* if not oplocked, invalidate inode pages if mtime or file
244 temp
= cifs_NTtimeToUnix(buf
->LastWriteTime
);
245 if (timespec_equal(&file
->f_path
.dentry
->d_inode
->i_mtime
, &temp
) &&
246 (file
->f_path
.dentry
->d_inode
->i_size
==
247 (loff_t
)le64_to_cpu(buf
->EndOfFile
))) {
248 cFYI(1, ("inode unchanged on server"));
250 if (file
->f_path
.dentry
->d_inode
->i_mapping
) {
251 /* BB no need to lock inode until after invalidate
252 since namei code should already have it locked? */
253 rc
= filemap_write_and_wait(file
->f_path
.dentry
->d_inode
->i_mapping
);
255 CIFS_I(file
->f_path
.dentry
->d_inode
)->write_behind_rc
= rc
;
257 cFYI(1, ("invalidating remote inode since open detected it "
259 invalidate_remote_inode(file
->f_path
.dentry
->d_inode
);
264 rc
= cifs_get_inode_info_unix(&file
->f_path
.dentry
->d_inode
,
265 full_path
, inode
->i_sb
, xid
);
267 rc
= cifs_get_inode_info(&file
->f_path
.dentry
->d_inode
,
268 full_path
, buf
, inode
->i_sb
, xid
, NULL
);
270 if ((*oplock
& 0xF) == OPLOCK_EXCLUSIVE
) {
271 pCifsInode
->clientCanCacheAll
= true;
272 pCifsInode
->clientCanCacheRead
= true;
273 cFYI(1, ("Exclusive Oplock granted on inode %p",
274 file
->f_path
.dentry
->d_inode
));
275 } else if ((*oplock
& 0xF) == OPLOCK_READ
)
276 pCifsInode
->clientCanCacheRead
= true;
281 int cifs_open(struct inode
*inode
, struct file
*file
)
286 struct cifs_sb_info
*cifs_sb
;
287 struct cifsTconInfo
*tcon
;
288 struct cifsFileInfo
*pCifsFile
;
289 struct cifsInodeInfo
*pCifsInode
;
290 char *full_path
= NULL
;
294 FILE_ALL_INFO
*buf
= NULL
;
298 cifs_sb
= CIFS_SB(inode
->i_sb
);
299 tcon
= cifs_sb
->tcon
;
301 pCifsInode
= CIFS_I(file
->f_path
.dentry
->d_inode
);
302 pCifsFile
= cifs_fill_filedata(file
);
309 full_path
= build_path_from_dentry(file
->f_path
.dentry
);
310 if (full_path
== NULL
) {
316 cFYI(1, ("inode = 0x%p file flags are 0x%x for %s",
317 inode
, file
->f_flags
, full_path
));
324 if (!tcon
->broken_posix_open
&& tcon
->unix_ext
&&
325 (tcon
->ses
->capabilities
& CAP_UNIX
) &&
326 (CIFS_UNIX_POSIX_PATH_OPS_CAP
&
327 le64_to_cpu(tcon
->fsUnixInfo
.Capability
))) {
328 int oflags
= (int) cifs_posix_convert_flags(file
->f_flags
);
329 /* can not refresh inode info since size could be stale */
330 rc
= cifs_posix_open(full_path
, &inode
, inode
->i_sb
,
331 cifs_sb
->mnt_file_mode
/* ignored */,
332 oflags
, &oplock
, &netfid
, xid
);
334 cFYI(1, ("posix open succeeded"));
335 /* no need for special case handling of setting mode
336 on read only files needed here */
338 pCifsFile
= cifs_fill_filedata(file
);
339 cifs_posix_open_inode_helper(inode
, file
, pCifsInode
,
340 pCifsFile
, oplock
, netfid
);
342 } else if ((rc
== -EINVAL
) || (rc
== -EOPNOTSUPP
)) {
343 if (tcon
->ses
->serverNOS
)
344 cERROR(1, ("server %s of type %s returned"
345 " unexpected error on SMB posix open"
346 ", disabling posix open support."
347 " Check if server update available.",
348 tcon
->ses
->serverName
,
349 tcon
->ses
->serverNOS
));
350 tcon
->broken_posix_open
= true;
351 } else if ((rc
!= -EIO
) && (rc
!= -EREMOTE
) &&
352 (rc
!= -EOPNOTSUPP
)) /* path not found or net err */
354 /* else fallthrough to retry open the old way on network i/o
358 desiredAccess
= cifs_convert_flags(file
->f_flags
);
360 /*********************************************************************
361 * open flag mapping table:
363 * POSIX Flag CIFS Disposition
364 * ---------- ----------------
365 * O_CREAT FILE_OPEN_IF
366 * O_CREAT | O_EXCL FILE_CREATE
367 * O_CREAT | O_TRUNC FILE_OVERWRITE_IF
368 * O_TRUNC FILE_OVERWRITE
369 * none of the above FILE_OPEN
371 * Note that there is not a direct match between disposition
372 * FILE_SUPERSEDE (ie create whether or not file exists although
373 * O_CREAT | O_TRUNC is similar but truncates the existing
374 * file rather than creating a new file as FILE_SUPERSEDE does
375 * (which uses the attributes / metadata passed in on open call)
377 *? O_SYNC is a reasonable match to CIFS writethrough flag
378 *? and the read write flags match reasonably. O_LARGEFILE
379 *? is irrelevant because largefile support is always used
380 *? by this client. Flags O_APPEND, O_DIRECT, O_DIRECTORY,
381 * O_FASYNC, O_NOFOLLOW, O_NONBLOCK need further investigation
382 *********************************************************************/
384 disposition
= cifs_get_disposition(file
->f_flags
);
386 /* BB pass O_SYNC flag through on file attributes .. BB */
388 /* Also refresh inode by passing in file_info buf returned by SMBOpen
389 and calling get_inode_info with returned buf (at least helps
390 non-Unix server case) */
392 /* BB we can not do this if this is the second open of a file
393 and the first handle has writebehind data, we might be
394 able to simply do a filemap_fdatawrite/filemap_fdatawait first */
395 buf
= kmalloc(sizeof(FILE_ALL_INFO
), GFP_KERNEL
);
401 if (cifs_sb
->tcon
->ses
->capabilities
& CAP_NT_SMBS
)
402 rc
= CIFSSMBOpen(xid
, tcon
, full_path
, disposition
,
403 desiredAccess
, CREATE_NOT_DIR
, &netfid
, &oplock
, buf
,
404 cifs_sb
->local_nls
, cifs_sb
->mnt_cifs_flags
405 & CIFS_MOUNT_MAP_SPECIAL_CHR
);
407 rc
= -EIO
; /* no NT SMB support fall into legacy open below */
410 /* Old server, try legacy style OpenX */
411 rc
= SMBLegacyOpen(xid
, tcon
, full_path
, disposition
,
412 desiredAccess
, CREATE_NOT_DIR
, &netfid
, &oplock
, buf
,
413 cifs_sb
->local_nls
, cifs_sb
->mnt_cifs_flags
414 & CIFS_MOUNT_MAP_SPECIAL_CHR
);
417 cFYI(1, ("cifs_open returned 0x%x", rc
));
421 kmalloc(sizeof(struct cifsFileInfo
), GFP_KERNEL
);
422 if (file
->private_data
== NULL
) {
426 pCifsFile
= cifs_init_private(file
->private_data
, inode
, file
, netfid
);
427 write_lock(&GlobalSMBSeslock
);
428 list_add(&pCifsFile
->tlist
, &tcon
->openFileList
);
430 pCifsInode
= CIFS_I(file
->f_path
.dentry
->d_inode
);
432 rc
= cifs_open_inode_helper(inode
, file
, pCifsInode
,
434 &oplock
, buf
, full_path
, xid
);
436 write_unlock(&GlobalSMBSeslock
);
439 if (oplock
& CIFS_CREATE_ACTION
) {
440 /* time to set mode which we can not set earlier due to
441 problems creating new read-only files */
442 if (tcon
->unix_ext
) {
443 struct cifs_unix_set_info_args args
= {
444 .mode
= inode
->i_mode
,
447 .ctime
= NO_CHANGE_64
,
448 .atime
= NO_CHANGE_64
,
449 .mtime
= NO_CHANGE_64
,
452 CIFSSMBUnixSetPathInfo(xid
, tcon
, full_path
, &args
,
454 cifs_sb
->mnt_cifs_flags
&
455 CIFS_MOUNT_MAP_SPECIAL_CHR
);
466 /* Try to reacquire byte range locks that were released when session */
467 /* to server was lost */
468 static int cifs_relock_file(struct cifsFileInfo
*cifsFile
)
472 /* BB list all locks open on this file and relock */
477 static int cifs_reopen_file(struct file
*file
, bool can_flush
)
482 struct cifs_sb_info
*cifs_sb
;
483 struct cifsTconInfo
*tcon
;
484 struct cifsFileInfo
*pCifsFile
;
485 struct cifsInodeInfo
*pCifsInode
;
487 char *full_path
= NULL
;
489 int disposition
= FILE_OPEN
;
492 if (file
->private_data
)
493 pCifsFile
= (struct cifsFileInfo
*)file
->private_data
;
498 mutex_lock(&pCifsFile
->fh_mutex
);
499 if (!pCifsFile
->invalidHandle
) {
500 mutex_unlock(&pCifsFile
->fh_mutex
);
506 if (file
->f_path
.dentry
== NULL
) {
507 cERROR(1, ("no valid name if dentry freed"));
510 goto reopen_error_exit
;
513 inode
= file
->f_path
.dentry
->d_inode
;
515 cERROR(1, ("inode not valid"));
518 goto reopen_error_exit
;
521 cifs_sb
= CIFS_SB(inode
->i_sb
);
522 tcon
= cifs_sb
->tcon
;
524 /* can not grab rename sem here because various ops, including
525 those that already have the rename sem can end up causing writepage
526 to get called and if the server was down that means we end up here,
527 and we can never tell if the caller already has the rename_sem */
528 full_path
= build_path_from_dentry(file
->f_path
.dentry
);
529 if (full_path
== NULL
) {
532 mutex_unlock(&pCifsFile
->fh_mutex
);
537 cFYI(1, ("inode = 0x%p file flags 0x%x for %s",
538 inode
, file
->f_flags
, full_path
));
545 if (tcon
->unix_ext
&& (tcon
->ses
->capabilities
& CAP_UNIX
) &&
546 (CIFS_UNIX_POSIX_PATH_OPS_CAP
&
547 le64_to_cpu(tcon
->fsUnixInfo
.Capability
))) {
548 int oflags
= (int) cifs_posix_convert_flags(file
->f_flags
);
549 /* can not refresh inode info since size could be stale */
550 rc
= cifs_posix_open(full_path
, NULL
, inode
->i_sb
,
551 cifs_sb
->mnt_file_mode
/* ignored */,
552 oflags
, &oplock
, &netfid
, xid
);
554 cFYI(1, ("posix reopen succeeded"));
557 /* fallthrough to retry open the old way on errors, especially
558 in the reconnect path it is important to retry hard */
561 desiredAccess
= cifs_convert_flags(file
->f_flags
);
563 /* Can not refresh inode by passing in file_info buf to be returned
564 by SMBOpen and then calling get_inode_info with returned buf
565 since file might have write behind data that needs to be flushed
566 and server version of file size can be stale. If we knew for sure
567 that inode was not dirty locally we could do this */
569 rc
= CIFSSMBOpen(xid
, tcon
, full_path
, disposition
, desiredAccess
,
570 CREATE_NOT_DIR
, &netfid
, &oplock
, NULL
,
571 cifs_sb
->local_nls
, cifs_sb
->mnt_cifs_flags
&
572 CIFS_MOUNT_MAP_SPECIAL_CHR
);
574 mutex_unlock(&pCifsFile
->fh_mutex
);
575 cFYI(1, ("cifs_open returned 0x%x", rc
));
576 cFYI(1, ("oplock: %d", oplock
));
579 pCifsFile
->netfid
= netfid
;
580 pCifsFile
->invalidHandle
= false;
581 mutex_unlock(&pCifsFile
->fh_mutex
);
582 pCifsInode
= CIFS_I(inode
);
585 rc
= filemap_write_and_wait(inode
->i_mapping
);
587 CIFS_I(inode
)->write_behind_rc
= rc
;
588 /* temporarily disable caching while we
589 go to server to get inode info */
590 pCifsInode
->clientCanCacheAll
= false;
591 pCifsInode
->clientCanCacheRead
= false;
593 rc
= cifs_get_inode_info_unix(&inode
,
594 full_path
, inode
->i_sb
, xid
);
596 rc
= cifs_get_inode_info(&inode
,
597 full_path
, NULL
, inode
->i_sb
,
599 } /* else we are writing out data to server already
600 and could deadlock if we tried to flush data, and
601 since we do not know if we have data that would
602 invalidate the current end of file on the server
603 we can not go to the server to get the new inod
605 if ((oplock
& 0xF) == OPLOCK_EXCLUSIVE
) {
606 pCifsInode
->clientCanCacheAll
= true;
607 pCifsInode
->clientCanCacheRead
= true;
608 cFYI(1, ("Exclusive Oplock granted on inode %p",
609 file
->f_path
.dentry
->d_inode
));
610 } else if ((oplock
& 0xF) == OPLOCK_READ
) {
611 pCifsInode
->clientCanCacheRead
= true;
612 pCifsInode
->clientCanCacheAll
= false;
614 pCifsInode
->clientCanCacheRead
= false;
615 pCifsInode
->clientCanCacheAll
= false;
617 cifs_relock_file(pCifsFile
);
625 int cifs_close(struct inode
*inode
, struct file
*file
)
629 struct cifs_sb_info
*cifs_sb
;
630 struct cifsTconInfo
*pTcon
;
631 struct cifsFileInfo
*pSMBFile
=
632 (struct cifsFileInfo
*)file
->private_data
;
636 cifs_sb
= CIFS_SB(inode
->i_sb
);
637 pTcon
= cifs_sb
->tcon
;
639 struct cifsLockInfo
*li
, *tmp
;
640 write_lock(&GlobalSMBSeslock
);
641 pSMBFile
->closePend
= true;
643 /* no sense reconnecting to close a file that is
645 if (!pTcon
->need_reconnect
) {
646 write_unlock(&GlobalSMBSeslock
);
648 while ((atomic_read(&pSMBFile
->count
) != 1)
649 && (timeout
<= 2048)) {
650 /* Give write a better chance to get to
651 server ahead of the close. We do not
652 want to add a wait_q here as it would
653 increase the memory utilization as
654 the struct would be in each open file,
655 but this should give enough time to
658 ("close delay, write pending"));
662 if (!pTcon
->need_reconnect
&&
663 !pSMBFile
->invalidHandle
)
664 rc
= CIFSSMBClose(xid
, pTcon
,
667 write_unlock(&GlobalSMBSeslock
);
669 write_unlock(&GlobalSMBSeslock
);
671 /* Delete any outstanding lock records.
672 We'll lose them when the file is closed anyway. */
673 mutex_lock(&pSMBFile
->lock_mutex
);
674 list_for_each_entry_safe(li
, tmp
, &pSMBFile
->llist
, llist
) {
675 list_del(&li
->llist
);
678 mutex_unlock(&pSMBFile
->lock_mutex
);
680 write_lock(&GlobalSMBSeslock
);
681 list_del(&pSMBFile
->flist
);
682 list_del(&pSMBFile
->tlist
);
683 write_unlock(&GlobalSMBSeslock
);
684 cifsFileInfo_put(file
->private_data
);
685 file
->private_data
= NULL
;
689 read_lock(&GlobalSMBSeslock
);
690 if (list_empty(&(CIFS_I(inode
)->openFileList
))) {
691 cFYI(1, ("closing last open instance for inode %p", inode
));
692 /* if the file is not open we do not know if we can cache info
693 on this inode, much less write behind and read ahead */
694 CIFS_I(inode
)->clientCanCacheRead
= false;
695 CIFS_I(inode
)->clientCanCacheAll
= false;
697 read_unlock(&GlobalSMBSeslock
);
698 if ((rc
== 0) && CIFS_I(inode
)->write_behind_rc
)
699 rc
= CIFS_I(inode
)->write_behind_rc
;
704 int cifs_closedir(struct inode
*inode
, struct file
*file
)
708 struct cifsFileInfo
*pCFileStruct
=
709 (struct cifsFileInfo
*)file
->private_data
;
712 cFYI(1, ("Closedir inode = 0x%p", inode
));
717 struct cifsTconInfo
*pTcon
;
718 struct cifs_sb_info
*cifs_sb
=
719 CIFS_SB(file
->f_path
.dentry
->d_sb
);
721 pTcon
= cifs_sb
->tcon
;
723 cFYI(1, ("Freeing private data in close dir"));
724 write_lock(&GlobalSMBSeslock
);
725 if (!pCFileStruct
->srch_inf
.endOfSearch
&&
726 !pCFileStruct
->invalidHandle
) {
727 pCFileStruct
->invalidHandle
= true;
728 write_unlock(&GlobalSMBSeslock
);
729 rc
= CIFSFindClose(xid
, pTcon
, pCFileStruct
->netfid
);
730 cFYI(1, ("Closing uncompleted readdir with rc %d",
732 /* not much we can do if it fails anyway, ignore rc */
735 write_unlock(&GlobalSMBSeslock
);
736 ptmp
= pCFileStruct
->srch_inf
.ntwrk_buf_start
;
738 cFYI(1, ("closedir free smb buf in srch struct"));
739 pCFileStruct
->srch_inf
.ntwrk_buf_start
= NULL
;
740 if (pCFileStruct
->srch_inf
.smallBuf
)
741 cifs_small_buf_release(ptmp
);
743 cifs_buf_release(ptmp
);
745 kfree(file
->private_data
);
746 file
->private_data
= NULL
;
748 /* BB can we lock the filestruct while this is going on? */
753 static int store_file_lock(struct cifsFileInfo
*fid
, __u64 len
,
754 __u64 offset
, __u8 lockType
)
756 struct cifsLockInfo
*li
=
757 kmalloc(sizeof(struct cifsLockInfo
), GFP_KERNEL
);
763 mutex_lock(&fid
->lock_mutex
);
764 list_add(&li
->llist
, &fid
->llist
);
765 mutex_unlock(&fid
->lock_mutex
);
769 int cifs_lock(struct file
*file
, int cmd
, struct file_lock
*pfLock
)
775 bool wait_flag
= false;
776 struct cifs_sb_info
*cifs_sb
;
777 struct cifsTconInfo
*tcon
;
779 __u8 lockType
= LOCKING_ANDX_LARGE_FILES
;
780 bool posix_locking
= 0;
782 length
= 1 + pfLock
->fl_end
- pfLock
->fl_start
;
786 cFYI(1, ("Lock parm: 0x%x flockflags: "
787 "0x%x flocktype: 0x%x start: %lld end: %lld",
788 cmd
, pfLock
->fl_flags
, pfLock
->fl_type
, pfLock
->fl_start
,
791 if (pfLock
->fl_flags
& FL_POSIX
)
793 if (pfLock
->fl_flags
& FL_FLOCK
)
795 if (pfLock
->fl_flags
& FL_SLEEP
) {
796 cFYI(1, ("Blocking lock"));
799 if (pfLock
->fl_flags
& FL_ACCESS
)
800 cFYI(1, ("Process suspended by mandatory locking - "
801 "not implemented yet"));
802 if (pfLock
->fl_flags
& FL_LEASE
)
803 cFYI(1, ("Lease on file - not implemented yet"));
804 if (pfLock
->fl_flags
&
805 (~(FL_POSIX
| FL_FLOCK
| FL_SLEEP
| FL_ACCESS
| FL_LEASE
)))
806 cFYI(1, ("Unknown lock flags 0x%x", pfLock
->fl_flags
));
808 if (pfLock
->fl_type
== F_WRLCK
) {
809 cFYI(1, ("F_WRLCK "));
811 } else if (pfLock
->fl_type
== F_UNLCK
) {
812 cFYI(1, ("F_UNLCK"));
814 /* Check if unlock includes more than
816 } else if (pfLock
->fl_type
== F_RDLCK
) {
817 cFYI(1, ("F_RDLCK"));
818 lockType
|= LOCKING_ANDX_SHARED_LOCK
;
820 } else if (pfLock
->fl_type
== F_EXLCK
) {
821 cFYI(1, ("F_EXLCK"));
823 } else if (pfLock
->fl_type
== F_SHLCK
) {
824 cFYI(1, ("F_SHLCK"));
825 lockType
|= LOCKING_ANDX_SHARED_LOCK
;
828 cFYI(1, ("Unknown type of lock"));
830 cifs_sb
= CIFS_SB(file
->f_path
.dentry
->d_sb
);
831 tcon
= cifs_sb
->tcon
;
833 if (file
->private_data
== NULL
) {
838 netfid
= ((struct cifsFileInfo
*)file
->private_data
)->netfid
;
840 if ((tcon
->ses
->capabilities
& CAP_UNIX
) &&
841 (CIFS_UNIX_FCNTL_CAP
& le64_to_cpu(tcon
->fsUnixInfo
.Capability
)) &&
842 ((cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_NOPOSIXBRL
) == 0))
844 /* BB add code here to normalize offset and length to
845 account for negative length which we can not accept over the
850 if (lockType
& LOCKING_ANDX_SHARED_LOCK
)
851 posix_lock_type
= CIFS_RDLCK
;
853 posix_lock_type
= CIFS_WRLCK
;
854 rc
= CIFSSMBPosixLock(xid
, tcon
, netfid
, 1 /* get */,
856 posix_lock_type
, wait_flag
);
861 /* BB we could chain these into one lock request BB */
862 rc
= CIFSSMBLock(xid
, tcon
, netfid
, length
, pfLock
->fl_start
,
863 0, 1, lockType
, 0 /* wait flag */ );
865 rc
= CIFSSMBLock(xid
, tcon
, netfid
, length
,
866 pfLock
->fl_start
, 1 /* numUnlock */ ,
867 0 /* numLock */ , lockType
,
869 pfLock
->fl_type
= F_UNLCK
;
871 cERROR(1, ("Error unlocking previously locked "
872 "range %d during test of lock", rc
));
876 /* if rc == ERR_SHARING_VIOLATION ? */
877 rc
= 0; /* do not change lock type to unlock
878 since range in use */
885 if (!numLock
&& !numUnlock
) {
886 /* if no lock or unlock then nothing
887 to do since we do not know what it is */
894 if (lockType
& LOCKING_ANDX_SHARED_LOCK
)
895 posix_lock_type
= CIFS_RDLCK
;
897 posix_lock_type
= CIFS_WRLCK
;
900 posix_lock_type
= CIFS_UNLCK
;
902 rc
= CIFSSMBPosixLock(xid
, tcon
, netfid
, 0 /* set */,
904 posix_lock_type
, wait_flag
);
906 struct cifsFileInfo
*fid
=
907 (struct cifsFileInfo
*)file
->private_data
;
910 rc
= CIFSSMBLock(xid
, tcon
, netfid
, length
,
912 0, numLock
, lockType
, wait_flag
);
915 /* For Windows locks we must store them. */
916 rc
= store_file_lock(fid
, length
,
917 pfLock
->fl_start
, lockType
);
919 } else if (numUnlock
) {
920 /* For each stored lock that this unlock overlaps
921 completely, unlock it. */
923 struct cifsLockInfo
*li
, *tmp
;
926 mutex_lock(&fid
->lock_mutex
);
927 list_for_each_entry_safe(li
, tmp
, &fid
->llist
, llist
) {
928 if (pfLock
->fl_start
<= li
->offset
&&
929 (pfLock
->fl_start
+ length
) >=
930 (li
->offset
+ li
->length
)) {
931 stored_rc
= CIFSSMBLock(xid
, tcon
,
933 li
->length
, li
->offset
,
934 1, 0, li
->type
, false);
938 list_del(&li
->llist
);
942 mutex_unlock(&fid
->lock_mutex
);
946 if (pfLock
->fl_flags
& FL_POSIX
)
947 posix_lock_file_wait(file
, pfLock
);
953 * Set the timeout on write requests past EOF. For some servers (Windows)
954 * these calls can be very long.
956 * If we're writing >10M past the EOF we give a 180s timeout. Anything less
957 * than that gets a 45s timeout. Writes not past EOF get 15s timeouts.
958 * The 10M cutoff is totally arbitrary. A better scheme for this would be
959 * welcome if someone wants to suggest one.
961 * We may be able to do a better job with this if there were some way to
962 * declare that a file should be sparse.
965 cifs_write_timeout(struct cifsInodeInfo
*cifsi
, loff_t offset
)
967 if (offset
<= cifsi
->server_eof
)
969 else if (offset
> (cifsi
->server_eof
+ (10 * 1024 * 1024)))
970 return CIFS_VLONG_OP
;
975 /* update the file size (if needed) after a write */
977 cifs_update_eof(struct cifsInodeInfo
*cifsi
, loff_t offset
,
978 unsigned int bytes_written
)
980 loff_t end_of_write
= offset
+ bytes_written
;
982 if (end_of_write
> cifsi
->server_eof
)
983 cifsi
->server_eof
= end_of_write
;
986 ssize_t
cifs_user_write(struct file
*file
, const char __user
*write_data
,
987 size_t write_size
, loff_t
*poffset
)
990 unsigned int bytes_written
= 0;
991 unsigned int total_written
;
992 struct cifs_sb_info
*cifs_sb
;
993 struct cifsTconInfo
*pTcon
;
995 struct cifsFileInfo
*open_file
;
996 struct cifsInodeInfo
*cifsi
= CIFS_I(file
->f_path
.dentry
->d_inode
);
998 cifs_sb
= CIFS_SB(file
->f_path
.dentry
->d_sb
);
1000 pTcon
= cifs_sb
->tcon
;
1003 (" write %d bytes to offset %lld of %s", write_size,
1004 *poffset, file->f_path.dentry->d_name.name)); */
1006 if (file
->private_data
== NULL
)
1008 open_file
= (struct cifsFileInfo
*) file
->private_data
;
1010 rc
= generic_write_checks(file
, poffset
, &write_size
, 0);
1016 long_op
= cifs_write_timeout(cifsi
, *poffset
);
1017 for (total_written
= 0; write_size
> total_written
;
1018 total_written
+= bytes_written
) {
1020 while (rc
== -EAGAIN
) {
1021 if (file
->private_data
== NULL
) {
1022 /* file has been closed on us */
1024 /* if we have gotten here we have written some data
1025 and blocked, and the file has been freed on us while
1026 we blocked so return what we managed to write */
1027 return total_written
;
1029 if (open_file
->closePend
) {
1032 return total_written
;
1036 if (open_file
->invalidHandle
) {
1037 /* we could deadlock if we called
1038 filemap_fdatawait from here so tell
1039 reopen_file not to flush data to server
1041 rc
= cifs_reopen_file(file
, false);
1046 rc
= CIFSSMBWrite(xid
, pTcon
,
1048 min_t(const int, cifs_sb
->wsize
,
1049 write_size
- total_written
),
1050 *poffset
, &bytes_written
,
1051 NULL
, write_data
+ total_written
, long_op
);
1053 if (rc
|| (bytes_written
== 0)) {
1061 cifs_update_eof(cifsi
, *poffset
, bytes_written
);
1062 *poffset
+= bytes_written
;
1064 long_op
= CIFS_STD_OP
; /* subsequent writes fast -
1065 15 seconds is plenty */
1068 cifs_stats_bytes_written(pTcon
, total_written
);
1070 /* since the write may have blocked check these pointers again */
1071 if ((file
->f_path
.dentry
) && (file
->f_path
.dentry
->d_inode
)) {
1072 struct inode
*inode
= file
->f_path
.dentry
->d_inode
;
1073 /* Do not update local mtime - server will set its actual value on write
1074 * inode->i_ctime = inode->i_mtime =
1075 * current_fs_time(inode->i_sb);*/
1076 if (total_written
> 0) {
1077 spin_lock(&inode
->i_lock
);
1078 if (*poffset
> file
->f_path
.dentry
->d_inode
->i_size
)
1079 i_size_write(file
->f_path
.dentry
->d_inode
,
1081 spin_unlock(&inode
->i_lock
);
1083 mark_inode_dirty_sync(file
->f_path
.dentry
->d_inode
);
1086 return total_written
;
1089 static ssize_t
cifs_write(struct file
*file
, const char *write_data
,
1090 size_t write_size
, loff_t
*poffset
)
1093 unsigned int bytes_written
= 0;
1094 unsigned int total_written
;
1095 struct cifs_sb_info
*cifs_sb
;
1096 struct cifsTconInfo
*pTcon
;
1098 struct cifsFileInfo
*open_file
;
1099 struct cifsInodeInfo
*cifsi
= CIFS_I(file
->f_path
.dentry
->d_inode
);
1101 cifs_sb
= CIFS_SB(file
->f_path
.dentry
->d_sb
);
1103 pTcon
= cifs_sb
->tcon
;
1105 cFYI(1, ("write %zd bytes to offset %lld of %s", write_size
,
1106 *poffset
, file
->f_path
.dentry
->d_name
.name
));
1108 if (file
->private_data
== NULL
)
1110 open_file
= (struct cifsFileInfo
*)file
->private_data
;
1114 long_op
= cifs_write_timeout(cifsi
, *poffset
);
1115 for (total_written
= 0; write_size
> total_written
;
1116 total_written
+= bytes_written
) {
1118 while (rc
== -EAGAIN
) {
1119 if (file
->private_data
== NULL
) {
1120 /* file has been closed on us */
1122 /* if we have gotten here we have written some data
1123 and blocked, and the file has been freed on us
1124 while we blocked so return what we managed to
1126 return total_written
;
1128 if (open_file
->closePend
) {
1131 return total_written
;
1135 if (open_file
->invalidHandle
) {
1136 /* we could deadlock if we called
1137 filemap_fdatawait from here so tell
1138 reopen_file not to flush data to
1140 rc
= cifs_reopen_file(file
, false);
1144 if (experimEnabled
|| (pTcon
->ses
->server
&&
1145 ((pTcon
->ses
->server
->secMode
&
1146 (SECMODE_SIGN_REQUIRED
| SECMODE_SIGN_ENABLED
))
1151 len
= min((size_t)cifs_sb
->wsize
,
1152 write_size
- total_written
);
1153 /* iov[0] is reserved for smb header */
1154 iov
[1].iov_base
= (char *)write_data
+
1156 iov
[1].iov_len
= len
;
1157 rc
= CIFSSMBWrite2(xid
, pTcon
,
1158 open_file
->netfid
, len
,
1159 *poffset
, &bytes_written
,
1162 rc
= CIFSSMBWrite(xid
, pTcon
,
1164 min_t(const int, cifs_sb
->wsize
,
1165 write_size
- total_written
),
1166 *poffset
, &bytes_written
,
1167 write_data
+ total_written
,
1170 if (rc
|| (bytes_written
== 0)) {
1178 cifs_update_eof(cifsi
, *poffset
, bytes_written
);
1179 *poffset
+= bytes_written
;
1181 long_op
= CIFS_STD_OP
; /* subsequent writes fast -
1182 15 seconds is plenty */
1185 cifs_stats_bytes_written(pTcon
, total_written
);
1187 /* since the write may have blocked check these pointers again */
1188 if ((file
->f_path
.dentry
) && (file
->f_path
.dentry
->d_inode
)) {
1189 /*BB We could make this contingent on superblock ATIME flag too */
1190 /* file->f_path.dentry->d_inode->i_ctime =
1191 file->f_path.dentry->d_inode->i_mtime = CURRENT_TIME;*/
1192 if (total_written
> 0) {
1193 spin_lock(&file
->f_path
.dentry
->d_inode
->i_lock
);
1194 if (*poffset
> file
->f_path
.dentry
->d_inode
->i_size
)
1195 i_size_write(file
->f_path
.dentry
->d_inode
,
1197 spin_unlock(&file
->f_path
.dentry
->d_inode
->i_lock
);
1199 mark_inode_dirty_sync(file
->f_path
.dentry
->d_inode
);
1202 return total_written
;
1205 #ifdef CONFIG_CIFS_EXPERIMENTAL
1206 struct cifsFileInfo
*find_readable_file(struct cifsInodeInfo
*cifs_inode
)
1208 struct cifsFileInfo
*open_file
= NULL
;
1210 read_lock(&GlobalSMBSeslock
);
1211 /* we could simply get the first_list_entry since write-only entries
1212 are always at the end of the list but since the first entry might
1213 have a close pending, we go through the whole list */
1214 list_for_each_entry(open_file
, &cifs_inode
->openFileList
, flist
) {
1215 if (open_file
->closePend
)
1217 if (open_file
->pfile
&& ((open_file
->pfile
->f_flags
& O_RDWR
) ||
1218 (open_file
->pfile
->f_flags
& O_RDONLY
))) {
1219 if (!open_file
->invalidHandle
) {
1220 /* found a good file */
1221 /* lock it so it will not be closed on us */
1222 cifsFileInfo_get(open_file
);
1223 read_unlock(&GlobalSMBSeslock
);
1225 } /* else might as well continue, and look for
1226 another, or simply have the caller reopen it
1227 again rather than trying to fix this handle */
1228 } else /* write only file */
1229 break; /* write only files are last so must be done */
1231 read_unlock(&GlobalSMBSeslock
);
1236 struct cifsFileInfo
*find_writable_file(struct cifsInodeInfo
*cifs_inode
)
1238 struct cifsFileInfo
*open_file
;
1239 bool any_available
= false;
1242 /* Having a null inode here (because mapping->host was set to zero by
1243 the VFS or MM) should not happen but we had reports of on oops (due to
1244 it being zero) during stress testcases so we need to check for it */
1246 if (cifs_inode
== NULL
) {
1247 cERROR(1, ("Null inode passed to cifs_writeable_file"));
1252 read_lock(&GlobalSMBSeslock
);
1254 list_for_each_entry(open_file
, &cifs_inode
->openFileList
, flist
) {
1255 if (open_file
->closePend
||
1256 (!any_available
&& open_file
->pid
!= current
->tgid
))
1259 if (open_file
->pfile
&&
1260 ((open_file
->pfile
->f_flags
& O_RDWR
) ||
1261 (open_file
->pfile
->f_flags
& O_WRONLY
))) {
1262 cifsFileInfo_get(open_file
);
1264 if (!open_file
->invalidHandle
) {
1265 /* found a good writable file */
1266 read_unlock(&GlobalSMBSeslock
);
1270 read_unlock(&GlobalSMBSeslock
);
1271 /* Had to unlock since following call can block */
1272 rc
= cifs_reopen_file(open_file
->pfile
, false);
1274 if (!open_file
->closePend
)
1276 else { /* start over in case this was deleted */
1277 /* since the list could be modified */
1278 read_lock(&GlobalSMBSeslock
);
1279 cifsFileInfo_put(open_file
);
1280 goto refind_writable
;
1284 /* if it fails, try another handle if possible -
1285 (we can not do this if closePending since
1286 loop could be modified - in which case we
1287 have to start at the beginning of the list
1288 again. Note that it would be bad
1289 to hold up writepages here (rather than
1290 in caller) with continuous retries */
1291 cFYI(1, ("wp failed on reopen file"));
1292 read_lock(&GlobalSMBSeslock
);
1293 /* can not use this handle, no write
1294 pending on this one after all */
1295 cifsFileInfo_put(open_file
);
1297 if (open_file
->closePend
) /* list could have changed */
1298 goto refind_writable
;
1299 /* else we simply continue to the next entry. Thus
1300 we do not loop on reopen errors. If we
1301 can not reopen the file, for example if we
1302 reconnected to a server with another client
1303 racing to delete or lock the file we would not
1304 make progress if we restarted before the beginning
1305 of the loop here. */
1308 /* couldn't find useable FH with same pid, try any available */
1309 if (!any_available
) {
1310 any_available
= true;
1311 goto refind_writable
;
1313 read_unlock(&GlobalSMBSeslock
);
1317 static int cifs_partialpagewrite(struct page
*page
, unsigned from
, unsigned to
)
1319 struct address_space
*mapping
= page
->mapping
;
1320 loff_t offset
= (loff_t
)page
->index
<< PAGE_CACHE_SHIFT
;
1323 int bytes_written
= 0;
1324 struct cifs_sb_info
*cifs_sb
;
1325 struct cifsTconInfo
*pTcon
;
1326 struct inode
*inode
;
1327 struct cifsFileInfo
*open_file
;
1329 if (!mapping
|| !mapping
->host
)
1332 inode
= page
->mapping
->host
;
1333 cifs_sb
= CIFS_SB(inode
->i_sb
);
1334 pTcon
= cifs_sb
->tcon
;
1336 offset
+= (loff_t
)from
;
1337 write_data
= kmap(page
);
1340 if ((to
> PAGE_CACHE_SIZE
) || (from
> to
)) {
1345 /* racing with truncate? */
1346 if (offset
> mapping
->host
->i_size
) {
1348 return 0; /* don't care */
1351 /* check to make sure that we are not extending the file */
1352 if (mapping
->host
->i_size
- offset
< (loff_t
)to
)
1353 to
= (unsigned)(mapping
->host
->i_size
- offset
);
1355 open_file
= find_writable_file(CIFS_I(mapping
->host
));
1357 bytes_written
= cifs_write(open_file
->pfile
, write_data
,
1359 cifsFileInfo_put(open_file
);
1360 /* Does mm or vfs already set times? */
1361 inode
->i_atime
= inode
->i_mtime
= current_fs_time(inode
->i_sb
);
1362 if ((bytes_written
> 0) && (offset
))
1364 else if (bytes_written
< 0)
1367 cFYI(1, ("No writeable filehandles for inode"));
1375 static int cifs_writepages(struct address_space
*mapping
,
1376 struct writeback_control
*wbc
)
1378 struct backing_dev_info
*bdi
= mapping
->backing_dev_info
;
1379 unsigned int bytes_to_write
;
1380 unsigned int bytes_written
;
1381 struct cifs_sb_info
*cifs_sb
;
1385 int range_whole
= 0;
1392 struct cifsFileInfo
*open_file
;
1393 struct cifsInodeInfo
*cifsi
= CIFS_I(mapping
->host
);
1395 struct pagevec pvec
;
1400 cifs_sb
= CIFS_SB(mapping
->host
->i_sb
);
1403 * If wsize is smaller that the page cache size, default to writing
1404 * one page at a time via cifs_writepage
1406 if (cifs_sb
->wsize
< PAGE_CACHE_SIZE
)
1407 return generic_writepages(mapping
, wbc
);
1409 if ((cifs_sb
->tcon
->ses
) && (cifs_sb
->tcon
->ses
->server
))
1410 if (cifs_sb
->tcon
->ses
->server
->secMode
&
1411 (SECMODE_SIGN_REQUIRED
| SECMODE_SIGN_ENABLED
))
1412 if (!experimEnabled
)
1413 return generic_writepages(mapping
, wbc
);
1415 iov
= kmalloc(32 * sizeof(struct kvec
), GFP_KERNEL
);
1417 return generic_writepages(mapping
, wbc
);
1421 * BB: Is this meaningful for a non-block-device file system?
1422 * If it is, we should test it again after we do I/O
1424 if (wbc
->nonblocking
&& bdi_write_congested(bdi
)) {
1425 wbc
->encountered_congestion
= 1;
1432 pagevec_init(&pvec
, 0);
1433 if (wbc
->range_cyclic
) {
1434 index
= mapping
->writeback_index
; /* Start from prev offset */
1437 index
= wbc
->range_start
>> PAGE_CACHE_SHIFT
;
1438 end
= wbc
->range_end
>> PAGE_CACHE_SHIFT
;
1439 if (wbc
->range_start
== 0 && wbc
->range_end
== LLONG_MAX
)
1444 while (!done
&& (index
<= end
) &&
1445 (nr_pages
= pagevec_lookup_tag(&pvec
, mapping
, &index
,
1446 PAGECACHE_TAG_DIRTY
,
1447 min(end
- index
, (pgoff_t
)PAGEVEC_SIZE
- 1) + 1))) {
1456 for (i
= 0; i
< nr_pages
; i
++) {
1457 page
= pvec
.pages
[i
];
1459 * At this point we hold neither mapping->tree_lock nor
1460 * lock on the page itself: the page may be truncated or
1461 * invalidated (changing page->mapping to NULL), or even
1462 * swizzled back from swapper_space to tmpfs file
1468 else if (!trylock_page(page
))
1471 if (unlikely(page
->mapping
!= mapping
)) {
1476 if (!wbc
->range_cyclic
&& page
->index
> end
) {
1482 if (next
&& (page
->index
!= next
)) {
1483 /* Not next consecutive page */
1488 if (wbc
->sync_mode
!= WB_SYNC_NONE
)
1489 wait_on_page_writeback(page
);
1491 if (PageWriteback(page
) ||
1492 !clear_page_dirty_for_io(page
)) {
1498 * This actually clears the dirty bit in the radix tree.
1499 * See cifs_writepage() for more commentary.
1501 set_page_writeback(page
);
1503 if (page_offset(page
) >= mapping
->host
->i_size
) {
1506 end_page_writeback(page
);
1511 * BB can we get rid of this? pages are held by pvec
1513 page_cache_get(page
);
1515 len
= min(mapping
->host
->i_size
- page_offset(page
),
1516 (loff_t
)PAGE_CACHE_SIZE
);
1518 /* reserve iov[0] for the smb header */
1520 iov
[n_iov
].iov_base
= kmap(page
);
1521 iov
[n_iov
].iov_len
= len
;
1522 bytes_to_write
+= len
;
1526 offset
= page_offset(page
);
1528 next
= page
->index
+ 1;
1529 if (bytes_to_write
+ PAGE_CACHE_SIZE
> cifs_sb
->wsize
)
1533 /* Search for a writable handle every time we call
1534 * CIFSSMBWrite2. We can't rely on the last handle
1535 * we used to still be valid
1537 open_file
= find_writable_file(CIFS_I(mapping
->host
));
1539 cERROR(1, ("No writable handles for inode"));
1542 long_op
= cifs_write_timeout(cifsi
, offset
);
1543 rc
= CIFSSMBWrite2(xid
, cifs_sb
->tcon
,
1545 bytes_to_write
, offset
,
1546 &bytes_written
, iov
, n_iov
,
1548 cifsFileInfo_put(open_file
);
1549 cifs_update_eof(cifsi
, offset
, bytes_written
);
1551 if (rc
|| bytes_written
< bytes_to_write
) {
1552 cERROR(1, ("Write2 ret %d, wrote %d",
1553 rc
, bytes_written
));
1554 /* BB what if continued retry is
1555 requested via mount flags? */
1557 set_bit(AS_ENOSPC
, &mapping
->flags
);
1559 set_bit(AS_EIO
, &mapping
->flags
);
1561 cifs_stats_bytes_written(cifs_sb
->tcon
,
1565 for (i
= 0; i
< n_iov
; i
++) {
1566 page
= pvec
.pages
[first
+ i
];
1567 /* Should we also set page error on
1568 success rc but too little data written? */
1569 /* BB investigate retry logic on temporary
1570 server crash cases and how recovery works
1571 when page marked as error */
1576 end_page_writeback(page
);
1577 page_cache_release(page
);
1579 if ((wbc
->nr_to_write
-= n_iov
) <= 0)
1583 /* Need to re-find the pages we skipped */
1584 index
= pvec
.pages
[0]->index
+ 1;
1586 pagevec_release(&pvec
);
1588 if (!scanned
&& !done
) {
1590 * We hit the last page and there is more work to be done: wrap
1591 * back to the start of the file
1597 if (wbc
->range_cyclic
|| (range_whole
&& wbc
->nr_to_write
> 0))
1598 mapping
->writeback_index
= index
;
1605 static int cifs_writepage(struct page
*page
, struct writeback_control
*wbc
)
1611 /* BB add check for wbc flags */
1612 page_cache_get(page
);
1613 if (!PageUptodate(page
))
1614 cFYI(1, ("ppw - page not up to date"));
1617 * Set the "writeback" flag, and clear "dirty" in the radix tree.
1619 * A writepage() implementation always needs to do either this,
1620 * or re-dirty the page with "redirty_page_for_writepage()" in
1621 * the case of a failure.
1623 * Just unlocking the page will cause the radix tree tag-bits
1624 * to fail to update with the state of the page correctly.
1626 set_page_writeback(page
);
1627 rc
= cifs_partialpagewrite(page
, 0, PAGE_CACHE_SIZE
);
1628 SetPageUptodate(page
); /* BB add check for error and Clearuptodate? */
1630 end_page_writeback(page
);
1631 page_cache_release(page
);
1636 static int cifs_write_end(struct file
*file
, struct address_space
*mapping
,
1637 loff_t pos
, unsigned len
, unsigned copied
,
1638 struct page
*page
, void *fsdata
)
1641 struct inode
*inode
= mapping
->host
;
1643 cFYI(1, ("write_end for page %p from pos %lld with %d bytes",
1644 page
, pos
, copied
));
1646 if (PageChecked(page
)) {
1648 SetPageUptodate(page
);
1649 ClearPageChecked(page
);
1650 } else if (!PageUptodate(page
) && copied
== PAGE_CACHE_SIZE
)
1651 SetPageUptodate(page
);
1653 if (!PageUptodate(page
)) {
1655 unsigned offset
= pos
& (PAGE_CACHE_SIZE
- 1);
1659 /* this is probably better than directly calling
1660 partialpage_write since in this function the file handle is
1661 known which we might as well leverage */
1662 /* BB check if anything else missing out of ppw
1663 such as updating last write time */
1664 page_data
= kmap(page
);
1665 rc
= cifs_write(file
, page_data
+ offset
, copied
, &pos
);
1666 /* if (rc < 0) should we set writebehind rc? */
1673 set_page_dirty(page
);
1677 spin_lock(&inode
->i_lock
);
1678 if (pos
> inode
->i_size
)
1679 i_size_write(inode
, pos
);
1680 spin_unlock(&inode
->i_lock
);
1684 page_cache_release(page
);
1689 int cifs_fsync(struct file
*file
, struct dentry
*dentry
, int datasync
)
1693 struct cifsTconInfo
*tcon
;
1694 struct cifsFileInfo
*smbfile
=
1695 (struct cifsFileInfo
*)file
->private_data
;
1696 struct inode
*inode
= file
->f_path
.dentry
->d_inode
;
1700 cFYI(1, ("Sync file - name: %s datasync: 0x%x",
1701 dentry
->d_name
.name
, datasync
));
1703 rc
= filemap_write_and_wait(inode
->i_mapping
);
1705 rc
= CIFS_I(inode
)->write_behind_rc
;
1706 CIFS_I(inode
)->write_behind_rc
= 0;
1707 tcon
= CIFS_SB(inode
->i_sb
)->tcon
;
1708 if (!rc
&& tcon
&& smbfile
&&
1709 !(CIFS_SB(inode
->i_sb
)->mnt_cifs_flags
& CIFS_MOUNT_NOSSYNC
))
1710 rc
= CIFSSMBFlush(xid
, tcon
, smbfile
->netfid
);
1717 /* static void cifs_sync_page(struct page *page)
1719 struct address_space *mapping;
1720 struct inode *inode;
1721 unsigned long index = page->index;
1722 unsigned int rpages = 0;
1725 cFYI(1, ("sync page %p",page));
1726 mapping = page->mapping;
1729 inode = mapping->host;
1733 /* fill in rpages then
1734 result = cifs_pagein_inode(inode, index, rpages); */ /* BB finish */
1736 /* cFYI(1, ("rpages is %d for sync page of Index %ld", rpages, index));
1746 * As file closes, flush all cached write data for this inode checking
1747 * for write behind errors.
1749 int cifs_flush(struct file
*file
, fl_owner_t id
)
1751 struct inode
*inode
= file
->f_path
.dentry
->d_inode
;
1754 /* Rather than do the steps manually:
1755 lock the inode for writing
1756 loop through pages looking for write behind data (dirty pages)
1757 coalesce into contiguous 16K (or smaller) chunks to write to server
1758 send to server (prefer in parallel)
1759 deal with writebehind errors
1760 unlock inode for writing
1761 filemapfdatawrite appears easier for the time being */
1763 rc
= filemap_fdatawrite(inode
->i_mapping
);
1764 /* reset wb rc if we were able to write out dirty pages */
1766 rc
= CIFS_I(inode
)->write_behind_rc
;
1767 CIFS_I(inode
)->write_behind_rc
= 0;
1770 cFYI(1, ("Flush inode %p file %p rc %d", inode
, file
, rc
));
1775 ssize_t
cifs_user_read(struct file
*file
, char __user
*read_data
,
1776 size_t read_size
, loff_t
*poffset
)
1779 unsigned int bytes_read
= 0;
1780 unsigned int total_read
= 0;
1781 unsigned int current_read_size
;
1782 struct cifs_sb_info
*cifs_sb
;
1783 struct cifsTconInfo
*pTcon
;
1785 struct cifsFileInfo
*open_file
;
1786 char *smb_read_data
;
1787 char __user
*current_offset
;
1788 struct smb_com_read_rsp
*pSMBr
;
1791 cifs_sb
= CIFS_SB(file
->f_path
.dentry
->d_sb
);
1792 pTcon
= cifs_sb
->tcon
;
1794 if (file
->private_data
== NULL
) {
1799 open_file
= (struct cifsFileInfo
*)file
->private_data
;
1801 if ((file
->f_flags
& O_ACCMODE
) == O_WRONLY
)
1802 cFYI(1, ("attempting read on write only file instance"));
1804 for (total_read
= 0, current_offset
= read_data
;
1805 read_size
> total_read
;
1806 total_read
+= bytes_read
, current_offset
+= bytes_read
) {
1807 current_read_size
= min_t(const int, read_size
- total_read
,
1810 smb_read_data
= NULL
;
1811 while (rc
== -EAGAIN
) {
1812 int buf_type
= CIFS_NO_BUFFER
;
1813 if ((open_file
->invalidHandle
) &&
1814 (!open_file
->closePend
)) {
1815 rc
= cifs_reopen_file(file
, true);
1819 rc
= CIFSSMBRead(xid
, pTcon
,
1821 current_read_size
, *poffset
,
1822 &bytes_read
, &smb_read_data
,
1824 pSMBr
= (struct smb_com_read_rsp
*)smb_read_data
;
1825 if (smb_read_data
) {
1826 if (copy_to_user(current_offset
,
1828 4 /* RFC1001 length field */ +
1829 le16_to_cpu(pSMBr
->DataOffset
),
1833 if (buf_type
== CIFS_SMALL_BUFFER
)
1834 cifs_small_buf_release(smb_read_data
);
1835 else if (buf_type
== CIFS_LARGE_BUFFER
)
1836 cifs_buf_release(smb_read_data
);
1837 smb_read_data
= NULL
;
1840 if (rc
|| (bytes_read
== 0)) {
1848 cifs_stats_bytes_read(pTcon
, bytes_read
);
1849 *poffset
+= bytes_read
;
1857 static ssize_t
cifs_read(struct file
*file
, char *read_data
, size_t read_size
,
1861 unsigned int bytes_read
= 0;
1862 unsigned int total_read
;
1863 unsigned int current_read_size
;
1864 struct cifs_sb_info
*cifs_sb
;
1865 struct cifsTconInfo
*pTcon
;
1867 char *current_offset
;
1868 struct cifsFileInfo
*open_file
;
1869 int buf_type
= CIFS_NO_BUFFER
;
1872 cifs_sb
= CIFS_SB(file
->f_path
.dentry
->d_sb
);
1873 pTcon
= cifs_sb
->tcon
;
1875 if (file
->private_data
== NULL
) {
1880 open_file
= (struct cifsFileInfo
*)file
->private_data
;
1882 if ((file
->f_flags
& O_ACCMODE
) == O_WRONLY
)
1883 cFYI(1, ("attempting read on write only file instance"));
1885 for (total_read
= 0, current_offset
= read_data
;
1886 read_size
> total_read
;
1887 total_read
+= bytes_read
, current_offset
+= bytes_read
) {
1888 current_read_size
= min_t(const int, read_size
- total_read
,
1890 /* For windows me and 9x we do not want to request more
1891 than it negotiated since it will refuse the read then */
1893 !(pTcon
->ses
->capabilities
& CAP_LARGE_FILES
)) {
1894 current_read_size
= min_t(const int, current_read_size
,
1895 pTcon
->ses
->server
->maxBuf
- 128);
1898 while (rc
== -EAGAIN
) {
1899 if ((open_file
->invalidHandle
) &&
1900 (!open_file
->closePend
)) {
1901 rc
= cifs_reopen_file(file
, true);
1905 rc
= CIFSSMBRead(xid
, pTcon
,
1907 current_read_size
, *poffset
,
1908 &bytes_read
, ¤t_offset
,
1911 if (rc
|| (bytes_read
== 0)) {
1919 cifs_stats_bytes_read(pTcon
, total_read
);
1920 *poffset
+= bytes_read
;
1927 int cifs_file_mmap(struct file
*file
, struct vm_area_struct
*vma
)
1929 struct dentry
*dentry
= file
->f_path
.dentry
;
1933 rc
= cifs_revalidate(dentry
);
1935 cFYI(1, ("Validation prior to mmap failed, error=%d", rc
));
1939 rc
= generic_file_mmap(file
, vma
);
1945 static void cifs_copy_cache_pages(struct address_space
*mapping
,
1946 struct list_head
*pages
, int bytes_read
, char *data
,
1947 struct pagevec
*plru_pvec
)
1952 while (bytes_read
> 0) {
1953 if (list_empty(pages
))
1956 page
= list_entry(pages
->prev
, struct page
, lru
);
1957 list_del(&page
->lru
);
1959 if (add_to_page_cache(page
, mapping
, page
->index
,
1961 page_cache_release(page
);
1962 cFYI(1, ("Add page cache failed"));
1963 data
+= PAGE_CACHE_SIZE
;
1964 bytes_read
-= PAGE_CACHE_SIZE
;
1968 target
= kmap_atomic(page
, KM_USER0
);
1970 if (PAGE_CACHE_SIZE
> bytes_read
) {
1971 memcpy(target
, data
, bytes_read
);
1972 /* zero the tail end of this partial page */
1973 memset(target
+ bytes_read
, 0,
1974 PAGE_CACHE_SIZE
- bytes_read
);
1977 memcpy(target
, data
, PAGE_CACHE_SIZE
);
1978 bytes_read
-= PAGE_CACHE_SIZE
;
1980 kunmap_atomic(target
, KM_USER0
);
1982 flush_dcache_page(page
);
1983 SetPageUptodate(page
);
1985 if (!pagevec_add(plru_pvec
, page
))
1986 __pagevec_lru_add_file(plru_pvec
);
1987 data
+= PAGE_CACHE_SIZE
;
1992 static int cifs_readpages(struct file
*file
, struct address_space
*mapping
,
1993 struct list_head
*page_list
, unsigned num_pages
)
1999 struct cifs_sb_info
*cifs_sb
;
2000 struct cifsTconInfo
*pTcon
;
2001 unsigned int bytes_read
= 0;
2002 unsigned int read_size
, i
;
2003 char *smb_read_data
= NULL
;
2004 struct smb_com_read_rsp
*pSMBr
;
2005 struct pagevec lru_pvec
;
2006 struct cifsFileInfo
*open_file
;
2007 int buf_type
= CIFS_NO_BUFFER
;
2010 if (file
->private_data
== NULL
) {
2015 open_file
= (struct cifsFileInfo
*)file
->private_data
;
2016 cifs_sb
= CIFS_SB(file
->f_path
.dentry
->d_sb
);
2017 pTcon
= cifs_sb
->tcon
;
2019 pagevec_init(&lru_pvec
, 0);
2020 cFYI(DBG2
, ("rpages: num pages %d", num_pages
));
2021 for (i
= 0; i
< num_pages
; ) {
2022 unsigned contig_pages
;
2023 struct page
*tmp_page
;
2024 unsigned long expected_index
;
2026 if (list_empty(page_list
))
2029 page
= list_entry(page_list
->prev
, struct page
, lru
);
2030 offset
= (loff_t
)page
->index
<< PAGE_CACHE_SHIFT
;
2032 /* count adjacent pages that we will read into */
2035 list_entry(page_list
->prev
, struct page
, lru
)->index
;
2036 list_for_each_entry_reverse(tmp_page
, page_list
, lru
) {
2037 if (tmp_page
->index
== expected_index
) {
2043 if (contig_pages
+ i
> num_pages
)
2044 contig_pages
= num_pages
- i
;
2046 /* for reads over a certain size could initiate async
2049 read_size
= contig_pages
* PAGE_CACHE_SIZE
;
2050 /* Read size needs to be in multiples of one page */
2051 read_size
= min_t(const unsigned int, read_size
,
2052 cifs_sb
->rsize
& PAGE_CACHE_MASK
);
2053 cFYI(DBG2
, ("rpages: read size 0x%x contiguous pages %d",
2054 read_size
, contig_pages
));
2056 while (rc
== -EAGAIN
) {
2057 if ((open_file
->invalidHandle
) &&
2058 (!open_file
->closePend
)) {
2059 rc
= cifs_reopen_file(file
, true);
2064 rc
= CIFSSMBRead(xid
, pTcon
,
2067 &bytes_read
, &smb_read_data
,
2069 /* BB more RC checks ? */
2070 if (rc
== -EAGAIN
) {
2071 if (smb_read_data
) {
2072 if (buf_type
== CIFS_SMALL_BUFFER
)
2073 cifs_small_buf_release(smb_read_data
);
2074 else if (buf_type
== CIFS_LARGE_BUFFER
)
2075 cifs_buf_release(smb_read_data
);
2076 smb_read_data
= NULL
;
2080 if ((rc
< 0) || (smb_read_data
== NULL
)) {
2081 cFYI(1, ("Read error in readpages: %d", rc
));
2083 } else if (bytes_read
> 0) {
2084 task_io_account_read(bytes_read
);
2085 pSMBr
= (struct smb_com_read_rsp
*)smb_read_data
;
2086 cifs_copy_cache_pages(mapping
, page_list
, bytes_read
,
2087 smb_read_data
+ 4 /* RFC1001 hdr */ +
2088 le16_to_cpu(pSMBr
->DataOffset
), &lru_pvec
);
2090 i
+= bytes_read
>> PAGE_CACHE_SHIFT
;
2091 cifs_stats_bytes_read(pTcon
, bytes_read
);
2092 if ((bytes_read
& PAGE_CACHE_MASK
) != bytes_read
) {
2093 i
++; /* account for partial page */
2095 /* server copy of file can have smaller size
2097 /* BB do we need to verify this common case ?
2098 this case is ok - if we are at server EOF
2099 we will hit it on next read */
2104 cFYI(1, ("No bytes read (%d) at offset %lld . "
2105 "Cleaning remaining pages from readahead list",
2106 bytes_read
, offset
));
2107 /* BB turn off caching and do new lookup on
2108 file size at server? */
2111 if (smb_read_data
) {
2112 if (buf_type
== CIFS_SMALL_BUFFER
)
2113 cifs_small_buf_release(smb_read_data
);
2114 else if (buf_type
== CIFS_LARGE_BUFFER
)
2115 cifs_buf_release(smb_read_data
);
2116 smb_read_data
= NULL
;
2121 pagevec_lru_add_file(&lru_pvec
);
2123 /* need to free smb_read_data buf before exit */
2124 if (smb_read_data
) {
2125 if (buf_type
== CIFS_SMALL_BUFFER
)
2126 cifs_small_buf_release(smb_read_data
);
2127 else if (buf_type
== CIFS_LARGE_BUFFER
)
2128 cifs_buf_release(smb_read_data
);
2129 smb_read_data
= NULL
;
2136 static int cifs_readpage_worker(struct file
*file
, struct page
*page
,
2142 page_cache_get(page
);
2143 read_data
= kmap(page
);
2144 /* for reads over a certain size could initiate async read ahead */
2146 rc
= cifs_read(file
, read_data
, PAGE_CACHE_SIZE
, poffset
);
2151 cFYI(1, ("Bytes read %d", rc
));
2153 file
->f_path
.dentry
->d_inode
->i_atime
=
2154 current_fs_time(file
->f_path
.dentry
->d_inode
->i_sb
);
2156 if (PAGE_CACHE_SIZE
> rc
)
2157 memset(read_data
+ rc
, 0, PAGE_CACHE_SIZE
- rc
);
2159 flush_dcache_page(page
);
2160 SetPageUptodate(page
);
2165 page_cache_release(page
);
2169 static int cifs_readpage(struct file
*file
, struct page
*page
)
2171 loff_t offset
= (loff_t
)page
->index
<< PAGE_CACHE_SHIFT
;
2177 if (file
->private_data
== NULL
) {
2183 cFYI(1, ("readpage %p at offset %d 0x%x\n",
2184 page
, (int)offset
, (int)offset
));
2186 rc
= cifs_readpage_worker(file
, page
, &offset
);
2194 static int is_inode_writable(struct cifsInodeInfo
*cifs_inode
)
2196 struct cifsFileInfo
*open_file
;
2198 read_lock(&GlobalSMBSeslock
);
2199 list_for_each_entry(open_file
, &cifs_inode
->openFileList
, flist
) {
2200 if (open_file
->closePend
)
2202 if (open_file
->pfile
&&
2203 ((open_file
->pfile
->f_flags
& O_RDWR
) ||
2204 (open_file
->pfile
->f_flags
& O_WRONLY
))) {
2205 read_unlock(&GlobalSMBSeslock
);
2209 read_unlock(&GlobalSMBSeslock
);
2213 /* We do not want to update the file size from server for inodes
2214 open for write - to avoid races with writepage extending
2215 the file - in the future we could consider allowing
2216 refreshing the inode only on increases in the file size
2217 but this is tricky to do without racing with writebehind
2218 page caching in the current Linux kernel design */
2219 bool is_size_safe_to_change(struct cifsInodeInfo
*cifsInode
, __u64 end_of_file
)
2224 if (is_inode_writable(cifsInode
)) {
2225 /* This inode is open for write at least once */
2226 struct cifs_sb_info
*cifs_sb
;
2228 cifs_sb
= CIFS_SB(cifsInode
->vfs_inode
.i_sb
);
2229 if (cifs_sb
->mnt_cifs_flags
& CIFS_MOUNT_DIRECT_IO
) {
2230 /* since no page cache to corrupt on directio
2231 we can change size safely */
2235 if (i_size_read(&cifsInode
->vfs_inode
) < end_of_file
)
2243 static int cifs_write_begin(struct file
*file
, struct address_space
*mapping
,
2244 loff_t pos
, unsigned len
, unsigned flags
,
2245 struct page
**pagep
, void **fsdata
)
2247 pgoff_t index
= pos
>> PAGE_CACHE_SHIFT
;
2248 loff_t offset
= pos
& (PAGE_CACHE_SIZE
- 1);
2249 loff_t page_start
= pos
& PAGE_MASK
;
2254 cFYI(1, ("write_begin from %lld len %d", (long long)pos
, len
));
2256 page
= grab_cache_page_write_begin(mapping
, index
, flags
);
2262 if (PageUptodate(page
))
2266 * If we write a full page it will be up to date, no need to read from
2267 * the server. If the write is short, we'll end up doing a sync write
2270 if (len
== PAGE_CACHE_SIZE
)
2274 * optimize away the read when we have an oplock, and we're not
2275 * expecting to use any of the data we'd be reading in. That
2276 * is, when the page lies beyond the EOF, or straddles the EOF
2277 * and the write will cover all of the existing data.
2279 if (CIFS_I(mapping
->host
)->clientCanCacheRead
) {
2280 i_size
= i_size_read(mapping
->host
);
2281 if (page_start
>= i_size
||
2282 (offset
== 0 && (pos
+ len
) >= i_size
)) {
2283 zero_user_segments(page
, 0, offset
,
2287 * PageChecked means that the parts of the page
2288 * to which we're not writing are considered up
2289 * to date. Once the data is copied to the
2290 * page, it can be set uptodate.
2292 SetPageChecked(page
);
2297 if ((file
->f_flags
& O_ACCMODE
) != O_WRONLY
) {
2299 * might as well read a page, it is fast enough. If we get
2300 * an error, we don't need to return it. cifs_write_end will
2301 * do a sync write instead since PG_uptodate isn't set.
2303 cifs_readpage_worker(file
, page
, &page_start
);
2305 /* we could try using another file handle if there is one -
2306 but how would we lock it to prevent close of that handle
2307 racing with this read? In any case
2308 this will be written out by write_end so is fine */
2315 const struct address_space_operations cifs_addr_ops
= {
2316 .readpage
= cifs_readpage
,
2317 .readpages
= cifs_readpages
,
2318 .writepage
= cifs_writepage
,
2319 .writepages
= cifs_writepages
,
2320 .write_begin
= cifs_write_begin
,
2321 .write_end
= cifs_write_end
,
2322 .set_page_dirty
= __set_page_dirty_nobuffers
,
2323 /* .sync_page = cifs_sync_page, */
2328 * cifs_readpages requires the server to support a buffer large enough to
2329 * contain the header plus one complete page of data. Otherwise, we need
2330 * to leave cifs_readpages out of the address space operations.
2332 const struct address_space_operations cifs_addr_ops_smallbuf
= {
2333 .readpage
= cifs_readpage
,
2334 .writepage
= cifs_writepage
,
2335 .writepages
= cifs_writepages
,
2336 .write_begin
= cifs_write_begin
,
2337 .write_end
= cifs_write_end
,
2338 .set_page_dirty
= __set_page_dirty_nobuffers
,
2339 /* .sync_page = cifs_sync_page, */