struct nfs_open_confirmres c_res;
        struct nfs_fattr f_attr;
        struct nfs_fattr dir_attr;
-       struct dentry *dentry;
+       struct path path;
        struct dentry *dir;
        struct nfs4_state_owner *owner;
        struct iattr attrs;
        int cancelled;
 };
 
-static struct nfs4_opendata *nfs4_opendata_alloc(struct dentry *dentry,
+static struct nfs4_opendata *nfs4_opendata_alloc(struct path *path,
                struct nfs4_state_owner *sp, int flags,
                const struct iattr *attrs)
 {
-       struct dentry *parent = dget_parent(dentry);
+       struct dentry *parent = dget_parent(path->dentry);
        struct inode *dir = parent->d_inode;
        struct nfs_server *server = NFS_SERVER(dir);
        struct nfs4_opendata *p;
        if (p->o_arg.seqid == NULL)
                goto err_free;
        atomic_set(&p->count, 1);
-       p->dentry = dget(dentry);
+       p->path.mnt = mntget(path->mnt);
+       p->path.dentry = dget(path->dentry);
        p->dir = parent;
        p->owner = sp;
        atomic_inc(&sp->so_count);
        p->o_arg.open_flags = flags,
        p->o_arg.clientid = server->nfs_client->cl_clientid;
        p->o_arg.id = sp->so_id;
-       p->o_arg.name = &dentry->d_name;
+       p->o_arg.name = &p->path.dentry->d_name;
        p->o_arg.server = server;
        p->o_arg.bitmask = server->attr_bitmask;
        p->o_arg.claim = NFS4_OPEN_CLAIM_NULL;
                nfs_free_seqid(p->o_arg.seqid);
                nfs4_put_state_owner(p->owner);
                dput(p->dir);
-               dput(p->dentry);
+               dput(p->path.dentry);
+               mntput(p->path.mnt);
                kfree(p);
        }
 }
                }
                delegation_type = delegation->type;
        }
-       opendata = nfs4_opendata_alloc(ctx->path.dentry, state->owner, 0, NULL);
+       opendata = nfs4_opendata_alloc(&ctx->path, state->owner, 0, NULL);
        if (opendata == NULL)
                return -ENOMEM;
        opendata->o_arg.claim = NFS4_OPEN_CLAIM_PREVIOUS;
 
        if (!test_bit(NFS_DELEGATED_STATE, &state->flags))
                return 0;
-       opendata = nfs4_opendata_alloc(ctx->path.dentry, sp, 0, NULL);
+       opendata = nfs4_opendata_alloc(&ctx->path, sp, 0, NULL);
        if (opendata == NULL)
                return -ENOMEM;
        opendata->o_arg.claim = NFS4_OPEN_CLAIM_DELEGATE_CUR;
                set_bit(NFS_DELEGATED_STATE, &state->flags);
                return 0;
        }
-       opendata = nfs4_opendata_alloc(ctx->path.dentry, state->owner, openflags, NULL);
+       opendata = nfs4_opendata_alloc(&ctx->path, state->owner, openflags, NULL);
        if (opendata == NULL)
                return -ENOMEM;
        ret = nfs4_open_recover(opendata, state);
 /*
  * Returns a referenced nfs4_state
  */
-static int _nfs4_do_open(struct inode *dir, struct dentry *dentry, int flags, struct iattr *sattr, struct rpc_cred *cred, struct nfs4_state **res)
+static int _nfs4_do_open(struct inode *dir, struct path *path, int flags, struct iattr *sattr, struct rpc_cred *cred, struct nfs4_state **res)
 {
        struct nfs4_state_owner  *sp;
        struct nfs4_state     *state = NULL;
                goto err_put_state_owner;
        down_read(&clp->cl_sem);
        status = -ENOMEM;
-       opendata = nfs4_opendata_alloc(dentry, sp, flags, sattr);
+       opendata = nfs4_opendata_alloc(path, sp, flags, sattr);
        if (opendata == NULL)
                goto err_release_rwsem;
 
 }
 
 
-static struct nfs4_state *nfs4_do_open(struct inode *dir, struct dentry *dentry, int flags, struct iattr *sattr, struct rpc_cred *cred)
+static struct nfs4_state *nfs4_do_open(struct inode *dir, struct path *path, int flags, struct iattr *sattr, struct rpc_cred *cred)
 {
        struct nfs4_exception exception = { };
        struct nfs4_state *res;
        int status;
 
        do {
-               status = _nfs4_do_open(dir, dentry, flags, sattr, cred, &res);
+               status = _nfs4_do_open(dir, path, flags, sattr, cred, &res);
                if (status == 0)
                        break;
                /* NOTE: BAD_SEQID means the server and client disagree about the
 struct dentry *
 nfs4_atomic_open(struct inode *dir, struct dentry *dentry, struct nameidata *nd)
 {
+       struct path path = {
+               .mnt = nd->mnt,
+               .dentry = dentry,
+       };
        struct iattr attr;
        struct rpc_cred *cred;
        struct nfs4_state *state;
        cred = rpcauth_lookupcred(NFS_CLIENT(dir)->cl_auth, 0);
        if (IS_ERR(cred))
                return (struct dentry *)cred;
-       state = nfs4_do_open(dir, dentry, nd->intent.open.flags, &attr, cred);
+       state = nfs4_do_open(dir, &path, nd->intent.open.flags, &attr, cred);
        put_rpccred(cred);
        if (IS_ERR(state)) {
                if (PTR_ERR(state) == -ENOENT)
 int
 nfs4_open_revalidate(struct inode *dir, struct dentry *dentry, int openflags, struct nameidata *nd)
 {
+       struct path path = {
+               .mnt = nd->mnt,
+               .dentry = dentry,
+       };
        struct rpc_cred *cred;
        struct nfs4_state *state;
 
                return PTR_ERR(cred);
        state = nfs4_open_delegated(dentry->d_inode, openflags, cred);
        if (IS_ERR(state))
-               state = nfs4_do_open(dir, dentry, openflags, NULL, cred);
+               state = nfs4_do_open(dir, &path, openflags, NULL, cred);
        put_rpccred(cred);
        if (IS_ERR(state)) {
                switch (PTR_ERR(state)) {
 nfs4_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
                  int flags, struct nameidata *nd)
 {
+       struct path path = {
+               .mnt = nd->mnt,
+               .dentry = dentry,
+       };
        struct nfs4_state *state;
        struct rpc_cred *cred;
        int status = 0;
                status = PTR_ERR(cred);
                goto out;
        }
-       state = nfs4_do_open(dir, dentry, flags, sattr, cred);
+       state = nfs4_do_open(dir, &path, flags, sattr, cred);
        put_rpccred(cred);
        if (IS_ERR(state)) {
                status = PTR_ERR(state);
                if (status == 0)
                        nfs_setattr_update_inode(state->inode, sattr);
        }
-       if (status == 0 && nd != NULL && (nd->flags & LOOKUP_OPEN))
+       if (status == 0 && (nd->flags & LOOKUP_OPEN) != 0)
                status = nfs4_intent_set_file(nd, dentry, state);
        else
                nfs4_close_state(state, flags);