NFS: Add an 'open_context' element to struct nfs_rpc_ops
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
c0204fd2b8
commit
2b484297e4
@ -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) {
|
||||||
|
@ -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);
|
||||||
|
@ -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,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user