diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2010-10-12 11:27:20 -0400 |
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2010-10-12 11:27:28 -0400 |
| commit | 37eca0d64a2dbeece25969ec0698e1ff72bdcf39 (patch) | |
| tree | 54ba70f0428f586f4fe28d8b429b9f9e0799a17a /fs/nfs | |
| parent | 277b199800ac90811ac86d215063df1984f51619 (diff) | |
| parent | 3c06806e690885ce978ef180c8f8b6f8c17fb4b4 (diff) | |
Merge branch 'linus' into core/locking
Reason: Pull in the semaphore related changes
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'fs/nfs')
| -rw-r--r-- | fs/nfs/Kconfig | 2 | ||||
| -rw-r--r-- | fs/nfs/client.c | 2 | ||||
| -rw-r--r-- | fs/nfs/dir.c | 9 | ||||
| -rw-r--r-- | fs/nfs/file.c | 6 | ||||
| -rw-r--r-- | fs/nfs/nfs4proc.c | 11 | ||||
| -rw-r--r-- | fs/nfs/super.c | 15 |
6 files changed, 32 insertions, 13 deletions
diff --git a/fs/nfs/Kconfig b/fs/nfs/Kconfig index 26a510a7be09..f7e13db613cb 100644 --- a/fs/nfs/Kconfig +++ b/fs/nfs/Kconfig | |||
| @@ -63,7 +63,7 @@ config NFS_V3_ACL | |||
| 63 | config NFS_V4 | 63 | config NFS_V4 |
| 64 | bool "NFS client support for NFS version 4" | 64 | bool "NFS client support for NFS version 4" |
| 65 | depends on NFS_FS | 65 | depends on NFS_FS |
| 66 | select RPCSEC_GSS_KRB5 | 66 | select SUNRPC_GSS |
| 67 | help | 67 | help |
| 68 | This option enables support for version 4 of the NFS protocol | 68 | This option enables support for version 4 of the NFS protocol |
| 69 | (RFC 3530) in the kernel's NFS client. | 69 | (RFC 3530) in the kernel's NFS client. |
diff --git a/fs/nfs/client.c b/fs/nfs/client.c index 4e7df2adb212..e7340729af89 100644 --- a/fs/nfs/client.c +++ b/fs/nfs/client.c | |||
| @@ -275,7 +275,7 @@ static int nfs_sockaddr_match_ipaddr6(const struct sockaddr *sa1, | |||
| 275 | sin1->sin6_scope_id != sin2->sin6_scope_id) | 275 | sin1->sin6_scope_id != sin2->sin6_scope_id) |
| 276 | return 0; | 276 | return 0; |
| 277 | 277 | ||
| 278 | return ipv6_addr_equal(&sin1->sin6_addr, &sin1->sin6_addr); | 278 | return ipv6_addr_equal(&sin1->sin6_addr, &sin2->sin6_addr); |
| 279 | } | 279 | } |
| 280 | #else /* !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE) */ | 280 | #else /* !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE) */ |
| 281 | static int nfs_sockaddr_match_ipaddr6(const struct sockaddr *sa1, | 281 | static int nfs_sockaddr_match_ipaddr6(const struct sockaddr *sa1, |
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index 29539ceeb745..e257172d438c 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c | |||
| @@ -140,6 +140,13 @@ nfs_opendir(struct inode *inode, struct file *filp) | |||
| 140 | 140 | ||
| 141 | /* Call generic open code in order to cache credentials */ | 141 | /* Call generic open code in order to cache credentials */ |
| 142 | res = nfs_open(inode, filp); | 142 | res = nfs_open(inode, filp); |
| 143 | if (filp->f_path.dentry == filp->f_path.mnt->mnt_root) { | ||
| 144 | /* This is a mountpoint, so d_revalidate will never | ||
| 145 | * have been called, so we need to refresh the | ||
| 146 | * inode (for close-open consistency) ourselves. | ||
| 147 | */ | ||
| 148 | __nfs_revalidate_inode(NFS_SERVER(inode), inode); | ||
| 149 | } | ||
| 143 | return res; | 150 | return res; |
| 144 | } | 151 | } |
| 145 | 152 | ||
| @@ -1103,7 +1110,7 @@ static int nfs_open_revalidate(struct dentry *dentry, struct nameidata *nd) | |||
| 1103 | if ((openflags & (O_CREAT|O_EXCL)) == (O_CREAT|O_EXCL)) | 1110 | if ((openflags & (O_CREAT|O_EXCL)) == (O_CREAT|O_EXCL)) |
| 1104 | goto no_open_dput; | 1111 | goto no_open_dput; |
| 1105 | /* We can't create new files, or truncate existing ones here */ | 1112 | /* We can't create new files, or truncate existing ones here */ |
| 1106 | openflags &= ~(O_CREAT|O_TRUNC); | 1113 | openflags &= ~(O_CREAT|O_EXCL|O_TRUNC); |
| 1107 | 1114 | ||
| 1108 | /* | 1115 | /* |
| 1109 | * Note: we're not holding inode->i_mutex and so may be racing with | 1116 | * Note: we're not holding inode->i_mutex and so may be racing with |
diff --git a/fs/nfs/file.c b/fs/nfs/file.c index 2d141a74ae82..05bf3c0dc751 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c | |||
| @@ -323,7 +323,7 @@ nfs_file_fsync(struct file *file, int datasync) | |||
| 323 | have_error |= test_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags); | 323 | have_error |= test_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags); |
| 324 | if (have_error) | 324 | if (have_error) |
| 325 | ret = xchg(&ctx->error, 0); | 325 | ret = xchg(&ctx->error, 0); |
| 326 | if (!ret) | 326 | if (!ret && status < 0) |
| 327 | ret = status; | 327 | ret = status; |
| 328 | return ret; | 328 | return ret; |
| 329 | } | 329 | } |
| @@ -723,10 +723,6 @@ static int do_vfs_lock(struct file *file, struct file_lock *fl) | |||
| 723 | default: | 723 | default: |
| 724 | BUG(); | 724 | BUG(); |
| 725 | } | 725 | } |
| 726 | if (res < 0) | ||
| 727 | dprintk(KERN_WARNING "%s: VFS is out of sync with lock manager" | ||
| 728 | " - error %d!\n", | ||
| 729 | __func__, res); | ||
| 730 | return res; | 726 | return res; |
| 731 | } | 727 | } |
| 732 | 728 | ||
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 7ffbb98ddec3..089da5b5d20a 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
| @@ -2036,7 +2036,8 @@ nfs4_atomic_open(struct inode *dir, struct dentry *dentry, struct nameidata *nd) | |||
| 2036 | struct rpc_cred *cred; | 2036 | struct rpc_cred *cred; |
| 2037 | struct nfs4_state *state; | 2037 | struct nfs4_state *state; |
| 2038 | struct dentry *res; | 2038 | struct dentry *res; |
| 2039 | fmode_t fmode = nd->intent.open.flags & (FMODE_READ | FMODE_WRITE | FMODE_EXEC); | 2039 | int open_flags = nd->intent.open.flags; |
| 2040 | fmode_t fmode = open_flags & (FMODE_READ | FMODE_WRITE | FMODE_EXEC); | ||
| 2040 | 2041 | ||
| 2041 | if (nd->flags & LOOKUP_CREATE) { | 2042 | if (nd->flags & LOOKUP_CREATE) { |
| 2042 | attr.ia_mode = nd->intent.open.create_mode; | 2043 | attr.ia_mode = nd->intent.open.create_mode; |
| @@ -2044,8 +2045,9 @@ nfs4_atomic_open(struct inode *dir, struct dentry *dentry, struct nameidata *nd) | |||
| 2044 | if (!IS_POSIXACL(dir)) | 2045 | if (!IS_POSIXACL(dir)) |
| 2045 | attr.ia_mode &= ~current_umask(); | 2046 | attr.ia_mode &= ~current_umask(); |
| 2046 | } else { | 2047 | } else { |
| 2048 | open_flags &= ~O_EXCL; | ||
| 2047 | attr.ia_valid = 0; | 2049 | attr.ia_valid = 0; |
| 2048 | BUG_ON(nd->intent.open.flags & O_CREAT); | 2050 | BUG_ON(open_flags & O_CREAT); |
| 2049 | } | 2051 | } |
| 2050 | 2052 | ||
| 2051 | cred = rpc_lookup_cred(); | 2053 | cred = rpc_lookup_cred(); |
| @@ -2054,7 +2056,7 @@ nfs4_atomic_open(struct inode *dir, struct dentry *dentry, struct nameidata *nd) | |||
| 2054 | parent = dentry->d_parent; | 2056 | parent = dentry->d_parent; |
| 2055 | /* Protect against concurrent sillydeletes */ | 2057 | /* Protect against concurrent sillydeletes */ |
| 2056 | nfs_block_sillyrename(parent); | 2058 | nfs_block_sillyrename(parent); |
| 2057 | state = nfs4_do_open(dir, &path, fmode, nd->intent.open.flags, &attr, cred); | 2059 | state = nfs4_do_open(dir, &path, fmode, open_flags, &attr, cred); |
| 2058 | put_rpccred(cred); | 2060 | put_rpccred(cred); |
| 2059 | if (IS_ERR(state)) { | 2061 | if (IS_ERR(state)) { |
| 2060 | if (PTR_ERR(state) == -ENOENT) { | 2062 | if (PTR_ERR(state) == -ENOENT) { |
| @@ -2273,8 +2275,7 @@ static int nfs4_get_referral(struct inode *dir, const struct qstr *name, struct | |||
| 2273 | out: | 2275 | out: |
| 2274 | if (page) | 2276 | if (page) |
| 2275 | __free_page(page); | 2277 | __free_page(page); |
| 2276 | if (locations) | 2278 | kfree(locations); |
| 2277 | kfree(locations); | ||
| 2278 | return status; | 2279 | return status; |
| 2279 | } | 2280 | } |
| 2280 | 2281 | ||
diff --git a/fs/nfs/super.c b/fs/nfs/super.c index ee26316ad1f4..f4cbf0c306c6 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c | |||
| @@ -431,7 +431,15 @@ static int nfs_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
| 431 | goto out_err; | 431 | goto out_err; |
| 432 | 432 | ||
| 433 | error = server->nfs_client->rpc_ops->statfs(server, fh, &res); | 433 | error = server->nfs_client->rpc_ops->statfs(server, fh, &res); |
| 434 | if (unlikely(error == -ESTALE)) { | ||
| 435 | struct dentry *pd_dentry; | ||
| 434 | 436 | ||
| 437 | pd_dentry = dget_parent(dentry); | ||
| 438 | if (pd_dentry != NULL) { | ||
| 439 | nfs_zap_caches(pd_dentry->d_inode); | ||
| 440 | dput(pd_dentry); | ||
| 441 | } | ||
| 442 | } | ||
| 435 | nfs_free_fattr(res.fattr); | 443 | nfs_free_fattr(res.fattr); |
| 436 | if (error < 0) | 444 | if (error < 0) |
| 437 | goto out_err; | 445 | goto out_err; |
| @@ -655,6 +663,13 @@ static void nfs_show_mount_options(struct seq_file *m, struct nfs_server *nfss, | |||
| 655 | 663 | ||
| 656 | if (nfss->options & NFS_OPTION_FSCACHE) | 664 | if (nfss->options & NFS_OPTION_FSCACHE) |
| 657 | seq_printf(m, ",fsc"); | 665 | seq_printf(m, ",fsc"); |
| 666 | |||
| 667 | if (nfss->flags & NFS_MOUNT_LOOKUP_CACHE_NONEG) { | ||
| 668 | if (nfss->flags & NFS_MOUNT_LOOKUP_CACHE_NONE) | ||
| 669 | seq_printf(m, ",lookupcache=none"); | ||
| 670 | else | ||
| 671 | seq_printf(m, ",lookupcache=pos"); | ||
| 672 | } | ||
| 658 | } | 673 | } |
| 659 | 674 | ||
| 660 | /* | 675 | /* |
