Commit 3369d116934b70bd2755cdd8b2af9741d18a4047
Exists in
smarc-imx_3.14.28_1.0.0_ga
and in
1 other branch
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 |
fs/cifs/file.c
... | ... | @@ -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 |