Commit 3369d116934b70bd2755cdd8b2af9741d18a4047

Authored by Linus Torvalds

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()

Showing 2 changed files Side-by-side Diff

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
19 15  
20 16  
21 17  
22 18  
... ... @@ -24,29 +20,13 @@
24 20 alternative to NFSv4 for fileserving in some Linux to Linux environments,
25 21 not just in Linux to Windows environments.
26 22  
27   - This filesystem has an optional mount utility (mount.cifs) that can
28   - be obtained from the project page and installed in the path in the same
29   - directory with the other mount helpers (such as mount.smbfs).
30   - Mounting using the cifs filesystem without installing the mount helper
31   - requires specifying the server's ip address.
  23 + This filesystem has an mount utility (mount.cifs) that can be obtained from
32 24  
33   - For Linux 2.4:
34   - mount //anything/here /mnt_target -o
35   - user=username,pass=password,unc=//ip_address_of_server/sharename
  25 + https://ftp.samba.org/pub/linux-cifs/cifs-utils/
36 26  
37   - For Linux 2.5:
38   - mount //ip_address_of_server/sharename /mnt_target -o user=username, pass=password
  27 + It must be installed in the directory with the other mount helpers.
39 28  
  29 + For more information on the module see the project wiki page at
40 30  
41   - For more information on the module see the project page at
42   -
43   - http://us1.samba.org/samba/Linux_CIFS_client.html
44   -
45   - For more information on CIFS see:
46   -
47   - http://www.snia.org/tech_activities/CIFS
48   -
49   - or the Samba site:
50   -
51   - http://www.samba.org
  31 + https://wiki.samba.org/index.php/LinuxCIFS_utils
... ... @@ -3379,6 +3379,9 @@
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 {
... ... @@ -3390,7 +3393,6 @@
3390 3393 if (rc == 0)
3391 3394 goto read_complete;
3392 3395  
3393   - page_cache_get(page);
3394 3396 read_data = kmap(page);
3395 3397 /* for reads over a certain size could initiate async read ahead */
3396 3398  
... ... @@ -3417,7 +3419,7 @@
3417 3419  
3418 3420 io_error:
3419 3421 kunmap(page);
3420   - page_cache_release(page);
  3422 + unlock_page(page);
3421 3423  
3422 3424 read_complete:
3423 3425 return rc;
... ... @@ -3442,8 +3444,6 @@
3442 3444  
3443 3445 rc = cifs_readpage_worker(file, page, &offset);
3444 3446  
3445   - unlock_page(page);
3446   -
3447 3447 free_xid(xid);
3448 3448 return rc;
3449 3449 }
... ... @@ -3497,6 +3497,7 @@
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;
... ... @@ -3506,6 +3507,7 @@
3506 3507  
3507 3508 cifs_dbg(FYI, "write_begin from %lld len %d\n", (long long)pos, len);
3508 3509  
  3510 +start:
3509 3511 page = grab_cache_page_write_begin(mapping, index, flags);
3510 3512 if (!page) {
3511 3513 rc = -ENOMEM;
3512 3514  
... ... @@ -3547,13 +3549,16 @@
3547 3549 }
3548 3550 }
3549 3551  
3550   - if ((file->f_flags & O_ACCMODE) != O_WRONLY) {
  3552 + if ((file->f_flags & O_ACCMODE) != O_WRONLY && !oncethru) {
3551 3553 /*
3552 3554 * might as well read a page, it is fast enough. If we get
3553 3555 * an error, we don't need to return it. cifs_write_end will
3554 3556 * do a sync write instead since PG_uptodate isn't set.
3555 3557 */
3556 3558 cifs_readpage_worker(file, page, &page_start);
  3559 + page_cache_release(page);
  3560 + oncethru = 1;
  3561 + goto start;
3557 3562 } else {
3558 3563 /* we could try using another file handle if there is one -
3559 3564 but how would we lock it to prevent close of that handle