瀏覽代碼

NFS: Add an 'open_context' element to struct nfs_rpc_ops

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Trond Myklebust 14 年之前
父節點
當前提交
2b484297e4
共有 4 個文件被更改,包括 10 次插入5 次删除
  1. 4 3
      fs/nfs/dir.c
  2. 0 1
      fs/nfs/nfs4_fs.h
  3. 2 1
      fs/nfs/nfs4proc.c
  4. 4 0
      include/linux/nfs_xdr.h

+ 4 - 3
fs/nfs/dir.c

@@ -34,7 +34,6 @@
 #include <linux/mount.h>
 #include <linux/mount.h>
 #include <linux/sched.h>
 #include <linux/sched.h>
 
 
-#include "nfs4_fs.h"
 #include "delegation.h"
 #include "delegation.h"
 #include "iostat.h"
 #include "iostat.h"
 #include "internal.h"
 #include "internal.h"
@@ -1127,7 +1126,7 @@ static struct dentry *nfs_atomic_lookup(struct inode *dir, struct dentry *dentry
 
 
 	/* Open the file on the server */
 	/* Open the file on the server */
 	nfs_block_sillyrename(dentry->d_parent);
 	nfs_block_sillyrename(dentry->d_parent);
-	inode = nfs4_atomic_open(dir, ctx, open_flags, &attr);
+	inode = NFS_PROTO(dir)->open_context(dir, ctx, open_flags, &attr);
 	if (IS_ERR(inode)) {
 	if (IS_ERR(inode)) {
 		nfs_unblock_sillyrename(dentry->d_parent);
 		nfs_unblock_sillyrename(dentry->d_parent);
 		put_nfs_open_context(ctx);
 		put_nfs_open_context(ctx);
@@ -1175,8 +1174,10 @@ static int nfs_open_revalidate(struct dentry *dentry, struct nameidata *nd)
 
 
 	if (!is_atomic_open(nd) || d_mountpoint(dentry))
 	if (!is_atomic_open(nd) || d_mountpoint(dentry))
 		goto no_open;
 		goto no_open;
+
 	parent = dget_parent(dentry);
 	parent = dget_parent(dentry);
 	dir = parent->d_inode;
 	dir = parent->d_inode;
+
 	/* We can't create new files in nfs_open_revalidate(), so we
 	/* We can't create new files in nfs_open_revalidate(), so we
 	 * optimize away revalidation of negative dentries.
 	 * optimize away revalidation of negative dentries.
 	 */
 	 */
@@ -1205,7 +1206,7 @@ static int nfs_open_revalidate(struct dentry *dentry, struct nameidata *nd)
 	 * operations that change the directory. We therefore save the
 	 * operations that change the directory. We therefore save the
 	 * change attribute *before* we do the RPC call.
 	 * change attribute *before* we do the RPC call.
 	 */
 	 */
-	inode = nfs4_atomic_open(dir, ctx, openflags, NULL);
+	inode = NFS_PROTO(dir)->open_context(dir, ctx, openflags, NULL);
 	if (IS_ERR(inode)) {
 	if (IS_ERR(inode)) {
 		ret = PTR_ERR(inode);
 		ret = PTR_ERR(inode);
 		switch (ret) {
 		switch (ret) {

+ 0 - 1
fs/nfs/nfs4_fs.h

@@ -242,7 +242,6 @@ extern int nfs4_proc_renew(struct nfs_client *, struct rpc_cred *);
 extern int nfs4_init_clientid(struct nfs_client *, struct rpc_cred *);
 extern int nfs4_init_clientid(struct nfs_client *, struct rpc_cred *);
 extern int nfs41_init_clientid(struct nfs_client *, struct rpc_cred *);
 extern int nfs41_init_clientid(struct nfs_client *, struct rpc_cred *);
 extern int nfs4_do_close(struct path *path, struct nfs4_state *state, gfp_t gfp_mask, int wait);
 extern int nfs4_do_close(struct path *path, struct nfs4_state *state, gfp_t gfp_mask, int wait);
-extern struct inode *nfs4_atomic_open(struct inode *, struct nfs_open_context *, int, struct iattr *);
 extern int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle);
 extern int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle);
 extern int nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name,
 extern int nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name,
 		struct nfs4_fs_locations *fs_locations, struct page *page);
 		struct nfs4_fs_locations *fs_locations, struct page *page);

+ 2 - 1
fs/nfs/nfs4proc.c

@@ -1998,7 +1998,7 @@ out:
 	return status;
 	return status;
 }
 }
 
 
-struct inode *
+static struct inode *
 nfs4_atomic_open(struct inode *dir, struct nfs_open_context *ctx, int open_flags, struct iattr *attr)
 nfs4_atomic_open(struct inode *dir, struct nfs_open_context *ctx, int open_flags, struct iattr *attr)
 {
 {
 	struct nfs4_state *state;
 	struct nfs4_state *state;
@@ -5358,6 +5358,7 @@ const struct nfs_rpc_ops nfs_v4_clientops = {
 	.lock		= nfs4_proc_lock,
 	.lock		= nfs4_proc_lock,
 	.clear_acl_cache = nfs4_zap_acl_attr,
 	.clear_acl_cache = nfs4_zap_acl_attr,
 	.close_context  = nfs4_close_context,
 	.close_context  = nfs4_close_context,
+	.open_context	= nfs4_atomic_open,
 };
 };
 
 
 /*
 /*

+ 4 - 0
include/linux/nfs_xdr.h

@@ -1065,6 +1065,10 @@ struct nfs_rpc_ops {
 	int	(*lock_check_bounds)(const struct file_lock *);
 	int	(*lock_check_bounds)(const struct file_lock *);
 	void	(*clear_acl_cache)(struct inode *);
 	void	(*clear_acl_cache)(struct inode *);
 	void	(*close_context)(struct nfs_open_context *ctx, int);
 	void	(*close_context)(struct nfs_open_context *ctx, int);
+	struct inode * (*open_context) (struct inode *dir,
+				struct nfs_open_context *ctx,
+				int open_flags,
+				struct iattr *iattr);
 };
 };
 
 
 /*
 /*