aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-09-16 15:39:21 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2013-09-16 15:39:21 -0400
commit3369d116934b70bd2755cdd8b2af9741d18a4047 (patch)
tree12c5444ae63bb9d6b00829b26668009d4c87a1c8
parentf1da3458e9d915d72b0dd30a7c41c3aff8f03589 (diff)
parent81b66220a9ebea7dd1547388279ee1898d7fe0f9 (diff)
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()
-rw-r--r--Documentation/filesystems/cifs/cifs.txt42
-rw-r--r--fs/cifs/file.c15
2 files changed, 21 insertions, 36 deletions
diff --git a/Documentation/filesystems/cifs/cifs.txt b/Documentation/filesystems/cifs/cifs.txt
index 49cc923a93e3..2fac91ac96cf 100644
--- a/Documentation/filesystems/cifs/cifs.txt
+++ b/Documentation/filesystems/cifs/cifs.txt
@@ -1,18 +1,14 @@
1 This is the client VFS module for the Common Internet File System 1 This is the client VFS module for the Common Internet File System
2 (CIFS) protocol which is the successor to the Server Message Block 2 (CIFS) protocol which is the successor to the Server Message Block
3 (SMB) protocol, the native file sharing mechanism for most early 3 (SMB) protocol, the native file sharing mechanism for most early
4 PC operating systems. CIFS is fully supported by current network 4 PC operating systems. New and improved versions of CIFS are now
5 file servers such as Windows 2000, Windows 2003 (including 5 called SMB2 and SMB3. These dialects are also supported by the
6 Windows XP) as well by Samba (which provides excellent CIFS 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 server support for Linux and many other operating systems), so 9 server support for Linux and many other operating systems), so
8 this network filesystem client can mount to a wide variety of 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 11 servers.
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.
16 12
17 The intent of this module is to provide the most advanced network 13 The intent of this module is to provide the most advanced network
18 file system function for CIFS compliant servers, including better 14 file system function for CIFS compliant servers, including better
@@ -24,28 +20,12 @@
24 alternative to NFSv4 for fileserving in some Linux to Linux environments, 20 alternative to NFSv4 for fileserving in some Linux to Linux environments,
25 not just in Linux to Windows environments. 21 not just in Linux to Windows environments.
26 22
27 This filesystem has an optional mount utility (mount.cifs) that can 23 This filesystem has an mount utility (mount.cifs) that can be obtained from
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.
32 24
33 For Linux 2.4: 25 https://ftp.samba.org/pub/linux-cifs/cifs-utils/
34 mount //anything/here /mnt_target -o
35 user=username,pass=password,unc=//ip_address_of_server/sharename
36 26
37 For Linux 2.5: 27 It must be installed in the directory with the other mount helpers.
38 mount //ip_address_of_server/sharename /mnt_target -o user=username, pass=password
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 31 https://wiki.samba.org/index.php/LinuxCIFS_utils
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
diff --git a/fs/cifs/file.c b/fs/cifs/file.c
index d044b35ce228..eb955b525e55 100644
--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -3379,6 +3379,9 @@ static int cifs_readpages(struct file *file, struct address_space *mapping,
3379 return rc; 3379 return rc;
3380} 3380}
3381 3381
3382/*
3383 * cifs_readpage_worker must be called with the page pinned
3384 */
3382static int cifs_readpage_worker(struct file *file, struct page *page, 3385static int cifs_readpage_worker(struct file *file, struct page *page,
3383 loff_t *poffset) 3386 loff_t *poffset)
3384{ 3387{
@@ -3390,7 +3393,6 @@ static int cifs_readpage_worker(struct file *file, struct page *page,
3390 if (rc == 0) 3393 if (rc == 0)
3391 goto read_complete; 3394 goto read_complete;
3392 3395
3393 page_cache_get(page);
3394 read_data = kmap(page); 3396 read_data = kmap(page);
3395 /* for reads over a certain size could initiate async read ahead */ 3397 /* for reads over a certain size could initiate async read ahead */
3396 3398
@@ -3417,7 +3419,7 @@ static int cifs_readpage_worker(struct file *file, struct page *page,
3417 3419
3418io_error: 3420io_error:
3419 kunmap(page); 3421 kunmap(page);
3420 page_cache_release(page); 3422 unlock_page(page);
3421 3423
3422read_complete: 3424read_complete:
3423 return rc; 3425 return rc;
@@ -3442,8 +3444,6 @@ static int cifs_readpage(struct file *file, struct page *page)
3442 3444
3443 rc = cifs_readpage_worker(file, page, &offset); 3445 rc = cifs_readpage_worker(file, page, &offset);
3444 3446
3445 unlock_page(page);
3446
3447 free_xid(xid); 3447 free_xid(xid);
3448 return rc; 3448 return rc;
3449} 3449}
@@ -3497,6 +3497,7 @@ static int cifs_write_begin(struct file *file, struct address_space *mapping,
3497 loff_t pos, unsigned len, unsigned flags, 3497 loff_t pos, unsigned len, unsigned flags,
3498 struct page **pagep, void **fsdata) 3498 struct page **pagep, void **fsdata)
3499{ 3499{
3500 int oncethru = 0;
3500 pgoff_t index = pos >> PAGE_CACHE_SHIFT; 3501 pgoff_t index = pos >> PAGE_CACHE_SHIFT;
3501 loff_t offset = pos & (PAGE_CACHE_SIZE - 1); 3502 loff_t offset = pos & (PAGE_CACHE_SIZE - 1);
3502 loff_t page_start = pos & PAGE_MASK; 3503 loff_t page_start = pos & PAGE_MASK;
@@ -3506,6 +3507,7 @@ static int cifs_write_begin(struct file *file, struct address_space *mapping,
3506 3507
3507 cifs_dbg(FYI, "write_begin from %lld len %d\n", (long long)pos, len); 3508 cifs_dbg(FYI, "write_begin from %lld len %d\n", (long long)pos, len);
3508 3509
3510start:
3509 page = grab_cache_page_write_begin(mapping, index, flags); 3511 page = grab_cache_page_write_begin(mapping, index, flags);
3510 if (!page) { 3512 if (!page) {
3511 rc = -ENOMEM; 3513 rc = -ENOMEM;
@@ -3547,13 +3549,16 @@ static int cifs_write_begin(struct file *file, struct address_space *mapping,
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 * might as well read a page, it is fast enough. If we get 3554 * might as well read a page, it is fast enough. If we get
3553 * an error, we don't need to return it. cifs_write_end will 3555 * an error, we don't need to return it. cifs_write_end will
3554 * do a sync write instead since PG_uptodate isn't set. 3556 * do a sync write instead since PG_uptodate isn't set.
3555 */ 3557 */
3556 cifs_readpage_worker(file, page, &page_start); 3558 cifs_readpage_worker(file, page, &page_start);
3559 page_cache_release(page);
3560 oncethru = 1;
3561 goto start;
3557 } else { 3562 } else {
3558 /* we could try using another file handle if there is one - 3563 /* we could try using another file handle if there is one -
3559 but how would we lock it to prevent close of that handle 3564 but how would we lock it to prevent close of that handle