diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-09-16 15:39:21 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-09-16 15:39:21 -0400 |
| commit | 3369d116934b70bd2755cdd8b2af9741d18a4047 (patch) | |
| tree | 12c5444ae63bb9d6b00829b26668009d4c87a1c8 | |
| parent | f1da3458e9d915d72b0dd30a7c41c3aff8f03589 (diff) | |
| parent | 81b66220a9ebea7dd1547388279ee1898d7fe0f9 (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.txt | 42 | ||||
| -rw-r--r-- | fs/cifs/file.c | 15 |
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 | */ | ||
| 3382 | static int cifs_readpage_worker(struct file *file, struct page *page, | 3385 | static 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 | ||
| 3418 | io_error: | 3420 | io_error: |
| 3419 | kunmap(page); | 3421 | kunmap(page); |
| 3420 | page_cache_release(page); | 3422 | unlock_page(page); |
| 3421 | 3423 | ||
| 3422 | read_complete: | 3424 | read_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 | ||
| 3510 | start: | ||
| 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 |
