aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/nfs/dir.c7
-rw-r--r--fs/nfs/nfs4_fs.h1
-rw-r--r--fs/nfs/nfs4proc.c3
-rw-r--r--include/linux/nfs_xdr.h4
4 files changed, 10 insertions, 5 deletions
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
index e37ffddd79c2..1e9e18813ad7 100644
--- a/fs/nfs/dir.c
+++ b/fs/nfs/dir.c
@@ -34,7 +34,6 @@
34#include <linux/mount.h> 34#include <linux/mount.h>
35#include <linux/sched.h> 35#include <linux/sched.h>
36 36
37#include "nfs4_fs.h"
38#include "delegation.h" 37#include "delegation.h"
39#include "iostat.h" 38#include "iostat.h"
40#include "internal.h" 39#include "internal.h"
@@ -1127,7 +1126,7 @@ static struct dentry *nfs_atomic_lookup(struct inode *dir, struct dentry *dentry
1127 1126
1128 /* Open the file on the server */ 1127 /* Open the file on the server */
1129 nfs_block_sillyrename(dentry->d_parent); 1128 nfs_block_sillyrename(dentry->d_parent);
1130 inode = nfs4_atomic_open(dir, ctx, open_flags, &attr); 1129 inode = NFS_PROTO(dir)->open_context(dir, ctx, open_flags, &attr);
1131 if (IS_ERR(inode)) { 1130 if (IS_ERR(inode)) {
1132 nfs_unblock_sillyrename(dentry->d_parent); 1131 nfs_unblock_sillyrename(dentry->d_parent);
1133 put_nfs_open_context(ctx); 1132 put_nfs_open_context(ctx);
@@ -1175,8 +1174,10 @@ static int nfs_open_revalidate(struct dentry *dentry, struct nameidata *nd)
1175 1174
1176 if (!is_atomic_open(nd) || d_mountpoint(dentry)) 1175 if (!is_atomic_open(nd) || d_mountpoint(dentry))
1177 goto no_open; 1176 goto no_open;
1177
1178 parent = dget_parent(dentry); 1178 parent = dget_parent(dentry);
1179 dir = parent->d_inode; 1179 dir = parent->d_inode;
1180
1180 /* We can't create new files in nfs_open_revalidate(), so we 1181 /* We can't create new files in nfs_open_revalidate(), so we
1181 * optimize away revalidation of negative dentries. 1182 * optimize away revalidation of negative dentries.
1182 */ 1183 */
@@ -1205,7 +1206,7 @@ static int nfs_open_revalidate(struct dentry *dentry, struct nameidata *nd)
1205 * operations that change the directory. We therefore save the 1206 * operations that change the directory. We therefore save the
1206 * change attribute *before* we do the RPC call. 1207 * change attribute *before* we do the RPC call.
1207 */ 1208 */
1208 inode = nfs4_atomic_open(dir, ctx, openflags, NULL); 1209 inode = NFS_PROTO(dir)->open_context(dir, ctx, openflags, NULL);
1209 if (IS_ERR(inode)) { 1210 if (IS_ERR(inode)) {
1210 ret = PTR_ERR(inode); 1211 ret = PTR_ERR(inode);
1211 switch (ret) { 1212 switch (ret) {
diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h
index 6cf12ba9f4e7..d24a8e07b5e2 100644
--- a/fs/nfs/nfs4_fs.h
+++ b/fs/nfs/nfs4_fs.h
@@ -242,7 +242,6 @@ extern int nfs4_proc_renew(struct nfs_client *, struct rpc_cred *);
242extern int nfs4_init_clientid(struct nfs_client *, struct rpc_cred *); 242extern int nfs4_init_clientid(struct nfs_client *, struct rpc_cred *);
243extern int nfs41_init_clientid(struct nfs_client *, struct rpc_cred *); 243extern int nfs41_init_clientid(struct nfs_client *, struct rpc_cred *);
244extern int nfs4_do_close(struct path *path, struct nfs4_state *state, gfp_t gfp_mask, int wait); 244extern int nfs4_do_close(struct path *path, struct nfs4_state *state, gfp_t gfp_mask, int wait);
245extern struct inode *nfs4_atomic_open(struct inode *, struct nfs_open_context *, int, struct iattr *);
246extern int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle); 245extern int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle);
247extern int nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name, 246extern int nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name,
248 struct nfs4_fs_locations *fs_locations, struct page *page); 247 struct nfs4_fs_locations *fs_locations, struct page *page);
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 617b149ee16d..643abd26f2de 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -1998,7 +1998,7 @@ out:
1998 return status; 1998 return status;
1999} 1999}
2000 2000
2001struct inode * 2001static struct inode *
2002nfs4_atomic_open(struct inode *dir, struct nfs_open_context *ctx, int open_flags, struct iattr *attr) 2002nfs4_atomic_open(struct inode *dir, struct nfs_open_context *ctx, int open_flags, struct iattr *attr)
2003{ 2003{
2004 struct nfs4_state *state; 2004 struct nfs4_state *state;
@@ -5358,6 +5358,7 @@ const struct nfs_rpc_ops nfs_v4_clientops = {
5358 .lock = nfs4_proc_lock, 5358 .lock = nfs4_proc_lock,
5359 .clear_acl_cache = nfs4_zap_acl_attr, 5359 .clear_acl_cache = nfs4_zap_acl_attr,
5360 .close_context = nfs4_close_context, 5360 .close_context = nfs4_close_context,
5361 .open_context = nfs4_atomic_open,
5361}; 5362};
5362 5363
5363/* 5364/*
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
index b1484dad7bef..6f345f8af4ae 100644
--- a/include/linux/nfs_xdr.h
+++ b/include/linux/nfs_xdr.h
@@ -1065,6 +1065,10 @@ struct nfs_rpc_ops {
1065 int (*lock_check_bounds)(const struct file_lock *); 1065 int (*lock_check_bounds)(const struct file_lock *);
1066 void (*clear_acl_cache)(struct inode *); 1066 void (*clear_acl_cache)(struct inode *);
1067 void (*close_context)(struct nfs_open_context *ctx, int); 1067 void (*close_context)(struct nfs_open_context *ctx, int);
1068 struct inode * (*open_context) (struct inode *dir,
1069 struct nfs_open_context *ctx,
1070 int open_flags,
1071 struct iattr *iattr);
1068}; 1072};
1069 1073
1070/* 1074/*