|
@@ -2038,21 +2038,11 @@ nfs4_atomic_open(struct inode *dir, struct nfs_open_context *ctx, int open_flags
|
|
|
}
|
|
|
|
|
|
int
|
|
|
-nfs4_open_revalidate(struct inode *dir, struct dentry *dentry, int openflags, struct nameidata *nd)
|
|
|
+nfs4_open_revalidate(struct inode *dir, struct nfs_open_context *ctx, int openflags)
|
|
|
{
|
|
|
- struct path path = {
|
|
|
- .mnt = nd->path.mnt,
|
|
|
- .dentry = dentry,
|
|
|
- };
|
|
|
- struct rpc_cred *cred;
|
|
|
struct nfs4_state *state;
|
|
|
- fmode_t fmode = openflags & (FMODE_READ | FMODE_WRITE);
|
|
|
|
|
|
- cred = rpc_lookup_cred();
|
|
|
- if (IS_ERR(cred))
|
|
|
- return PTR_ERR(cred);
|
|
|
- state = nfs4_do_open(dir, &path, fmode, openflags, NULL, cred);
|
|
|
- put_rpccred(cred);
|
|
|
+ state = nfs4_do_open(dir, &ctx->path, ctx->mode, openflags, NULL, ctx->cred);
|
|
|
if (IS_ERR(state)) {
|
|
|
switch (PTR_ERR(state)) {
|
|
|
case -EPERM:
|
|
@@ -2065,14 +2055,13 @@ nfs4_open_revalidate(struct inode *dir, struct dentry *dentry, int openflags, st
|
|
|
goto out_drop;
|
|
|
}
|
|
|
}
|
|
|
- if (state->inode == dentry->d_inode) {
|
|
|
- nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
|
|
|
- nfs4_intent_set_file(nd, &path, state, fmode);
|
|
|
+ ctx->state = state;
|
|
|
+ if (state->inode == ctx->path.dentry->d_inode) {
|
|
|
+ nfs_set_verifier(ctx->path.dentry, nfs_save_change_attribute(dir));
|
|
|
return 1;
|
|
|
}
|
|
|
- nfs4_close_sync(&path, state, fmode);
|
|
|
out_drop:
|
|
|
- d_drop(dentry);
|
|
|
+ d_drop(ctx->path.dentry);
|
|
|
return 0;
|
|
|
}
|
|
|
|