Merge branch 'for-next' of git://git.samba.org/sfrench/cifs-2.6

Pull CIFS fixes from Steve French:
"Two minor cifs fixes and a minor documentation cleanup for cifs.txt"

* 'for-next' of git://git.samba.org/sfrench/cifs-2.6:
cifs: update cifs.txt and remove some outdated infos
cifs: Avoid calling unlock_page() twice in cifs_readpage() when using fscache
cifs: Do not take a reference to the page in cifs_readpage_worker()

Changed files
+21 -36
Documentation
filesystems
cifs
fs
cifs
+11 -31
Documentation/filesystems/cifs/cifs.txt
··· 1 1 This is the client VFS module for the Common Internet File System 2 2 (CIFS) protocol which is the successor to the Server Message Block 3 3 (SMB) protocol, the native file sharing mechanism for most early 4 - PC operating systems. CIFS is fully supported by current network 5 - file servers such as Windows 2000, Windows 2003 (including 6 - Windows XP) as well by Samba (which provides excellent CIFS 4 + PC operating systems. New and improved versions of CIFS are now 5 + called SMB2 and SMB3. These dialects are also supported by the 6 + CIFS VFS module. CIFS is fully supported by network 7 + file servers such as Windows 2000, 2003, 2008 and 2012 8 + as well by Samba (which provides excellent CIFS 7 9 server support for Linux and many other operating systems), so 8 10 this network filesystem client can mount to a wide variety of 9 - servers. The smbfs module should be used instead of this cifs module 10 - for mounting to older SMB servers such as OS/2. The smbfs and cifs 11 - modules can coexist and do not conflict. The CIFS VFS filesystem 12 - module is designed to work well with servers that implement the 13 - newer versions (dialects) of the SMB/CIFS protocol such as Samba, 14 - the program written by Andrew Tridgell that turns any Unix host 15 - into a SMB/CIFS file server. 11 + servers. 16 12 17 13 The intent of this module is to provide the most advanced network 18 14 file system function for CIFS compliant servers, including better ··· 20 24 alternative to NFSv4 for fileserving in some Linux to Linux environments, 21 25 not just in Linux to Windows environments. 22 26 23 - This filesystem has an optional mount utility (mount.cifs) that can 24 - be obtained from the project page and installed in the path in the same 25 - directory with the other mount helpers (such as mount.smbfs). 26 - Mounting using the cifs filesystem without installing the mount helper 27 - requires specifying the server's ip address. 27 + This filesystem has an mount utility (mount.cifs) that can be obtained from 28 28 29 - For Linux 2.4: 30 - mount //anything/here /mnt_target -o 31 - user=username,pass=password,unc=//ip_address_of_server/sharename 29 + https://ftp.samba.org/pub/linux-cifs/cifs-utils/ 32 30 33 - For Linux 2.5: 34 - mount //ip_address_of_server/sharename /mnt_target -o user=username, pass=password 31 + It must be installed in the directory with the other mount helpers. 35 32 33 + For more information on the module see the project wiki page at 36 34 37 - For more information on the module see the project page at 38 - 39 - http://us1.samba.org/samba/Linux_CIFS_client.html 40 - 41 - For more information on CIFS see: 42 - 43 - http://www.snia.org/tech_activities/CIFS 44 - 45 - or the Samba site: 46 - 47 - http://www.samba.org 35 + https://wiki.samba.org/index.php/LinuxCIFS_utils
+10 -5
fs/cifs/file.c
··· 3379 3379 return rc; 3380 3380 } 3381 3381 3382 + /* 3383 + * cifs_readpage_worker must be called with the page pinned 3384 + */ 3382 3385 static int cifs_readpage_worker(struct file *file, struct page *page, 3383 3386 loff_t *poffset) 3384 3387 { ··· 3393 3390 if (rc == 0) 3394 3391 goto read_complete; 3395 3392 3396 - page_cache_get(page); 3397 3393 read_data = kmap(page); 3398 3394 /* for reads over a certain size could initiate async read ahead */ 3399 3395 ··· 3419 3417 3420 3418 io_error: 3421 3419 kunmap(page); 3422 - page_cache_release(page); 3420 + unlock_page(page); 3423 3421 3424 3422 read_complete: 3425 3423 return rc; ··· 3443 3441 page, (int)offset, (int)offset); 3444 3442 3445 3443 rc = cifs_readpage_worker(file, page, &offset); 3446 - 3447 - unlock_page(page); 3448 3444 3449 3445 free_xid(xid); 3450 3446 return rc; ··· 3497 3497 loff_t pos, unsigned len, unsigned flags, 3498 3498 struct page **pagep, void **fsdata) 3499 3499 { 3500 + int oncethru = 0; 3500 3501 pgoff_t index = pos >> PAGE_CACHE_SHIFT; 3501 3502 loff_t offset = pos & (PAGE_CACHE_SIZE - 1); 3502 3503 loff_t page_start = pos & PAGE_MASK; ··· 3507 3506 3508 3507 cifs_dbg(FYI, "write_begin from %lld len %d\n", (long long)pos, len); 3509 3508 3509 + start: 3510 3510 page = grab_cache_page_write_begin(mapping, index, flags); 3511 3511 if (!page) { 3512 3512 rc = -ENOMEM; ··· 3549 3547 } 3550 3548 } 3551 3549 3552 - if ((file->f_flags & O_ACCMODE) != O_WRONLY) { 3550 + if ((file->f_flags & O_ACCMODE) != O_WRONLY && !oncethru) { 3553 3551 /* 3554 3552 * might as well read a page, it is fast enough. If we get 3555 3553 * an error, we don't need to return it. cifs_write_end will 3556 3554 * do a sync write instead since PG_uptodate isn't set. 3557 3555 */ 3558 3556 cifs_readpage_worker(file, page, &page_start); 3557 + page_cache_release(page); 3558 + oncethru = 1; 3559 + goto start; 3559 3560 } else { 3560 3561 /* we could try using another file handle if there is one - 3561 3562 but how would we lock it to prevent close of that handle