Commit 535918f1 authored by Trond Myklebust's avatar Trond Myklebust
Browse files

NFSv4: Further cleanups for nfs4_open_revalidate()

parent b8d4cadd
Loading
Loading
Loading
Loading
+26 −6
Original line number Diff line number Diff line
@@ -1204,16 +1204,36 @@ static int nfs_open_revalidate(struct dentry *dentry, struct nameidata *nd)
	 * operations that change the directory. We therefore save the
	 * change attribute *before* we do the RPC call.
	 */
	ret = nfs4_open_revalidate(dir, ctx, openflags);
	if (ret == 1)
	inode = nfs4_atomic_open(dir, ctx, openflags, NULL);
	if (IS_ERR(inode)) {
		ret = PTR_ERR(inode);
		switch (ret) {
		case -EPERM:
		case -EACCES:
		case -EDQUOT:
		case -ENOSPC:
		case -EROFS:
			goto out_put_ctx;
		default:
			goto out_drop;
		}
	}
	iput(inode);
	if (inode == dentry->d_inode) {
		nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
		nfs_intent_set_file(nd, ctx);
	else
		put_nfs_open_context(ctx);
	} else
		goto out_drop;
out:
	dput(parent);
	if (!ret)
		d_drop(dentry);
	return ret;
out_drop:
	d_drop(dentry);
	ret = 0;
out_put_ctx:
	put_nfs_open_context(ctx);
	goto out;

no_open_dput:
	dput(parent);
no_open:
+0 −1
Original line number Diff line number Diff line
@@ -243,7 +243,6 @@ extern int nfs4_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 struct inode *nfs4_atomic_open(struct inode *, struct nfs_open_context *, int, struct iattr *);
extern int nfs4_open_revalidate(struct inode *, struct nfs_open_context *, int);
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,
		struct nfs4_fs_locations *fs_locations, struct page *page);
+0 −28
Original line number Diff line number Diff line
@@ -2037,34 +2037,6 @@ nfs4_atomic_open(struct inode *dir, struct nfs_open_context *ctx, int open_flags
	return igrab(state->inode);
}

int
nfs4_open_revalidate(struct inode *dir, struct nfs_open_context *ctx, int openflags)
{
	struct nfs4_state *state;

	state = nfs4_do_open(dir, &ctx->path, ctx->mode, openflags, NULL, ctx->cred);
	if (IS_ERR(state)) {
		switch (PTR_ERR(state)) {
			case -EPERM:
			case -EACCES:
			case -EDQUOT:
			case -ENOSPC:
			case -EROFS:
				return PTR_ERR(state);
			default:
				goto out_drop;
		}
	}
	ctx->state = state;
	if (state->inode == ctx->path.dentry->d_inode) {
		nfs_set_verifier(ctx->path.dentry, nfs_save_change_attribute(dir));
		return 1;
	}
out_drop:
	d_drop(ctx->path.dentry);
	return 0;
}

static void nfs4_close_context(struct nfs_open_context *ctx, int is_sync)
{
	if (ctx->state == NULL)