Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 856121b2 authored by J. Bruce Fields's avatar J. Bruce Fields
Browse files

nfsd4: warn on open failure after create



If we create the object and then return failure to the client, we're
left with an unexpected file in the filesystem.

I'm trying to eliminate such cases but not 100% sure I have so an
assertion might be helpful for now.

Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
parent 4cdc951b
Loading
Loading
Loading
Loading
+4 −3
Original line number Original line Diff line number Diff line
@@ -194,7 +194,6 @@ do_open_lookup(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_o
{
{
	struct svc_fh resfh;
	struct svc_fh resfh;
	__be32 status;
	__be32 status;
	int created = 0;


	fh_init(&resfh, NFS4_FHSIZE);
	fh_init(&resfh, NFS4_FHSIZE);
	open->op_truncate = 0;
	open->op_truncate = 0;
@@ -223,7 +222,7 @@ do_open_lookup(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_o
					open->op_fname.len, &open->op_iattr,
					open->op_fname.len, &open->op_iattr,
					&resfh, open->op_createmode,
					&resfh, open->op_createmode,
					(u32 *)open->op_verf.data,
					(u32 *)open->op_verf.data,
					&open->op_truncate, &created);
					&open->op_truncate, &open->op_created);


		/*
		/*
		 * Following rfc 3530 14.2.16, use the returned bitmask
		 * Following rfc 3530 14.2.16, use the returned bitmask
@@ -253,7 +252,7 @@ do_open_lookup(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_o
	/* set reply cache */
	/* set reply cache */
	fh_copy_shallow(&open->op_openowner->oo_owner.so_replay.rp_openfh,
	fh_copy_shallow(&open->op_openowner->oo_owner.so_replay.rp_openfh,
			&resfh.fh_handle);
			&resfh.fh_handle);
	if (!created)
	if (!open->op_created)
		status = do_open_permission(rqstp, current_fh, open,
		status = do_open_permission(rqstp, current_fh, open,
					    NFSD_MAY_NOP);
					    NFSD_MAY_NOP);


@@ -318,6 +317,7 @@ nfsd4_open(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
	/* We don't yet support WANT bits: */
	/* We don't yet support WANT bits: */
	open->op_share_access &= NFS4_SHARE_ACCESS_MASK;
	open->op_share_access &= NFS4_SHARE_ACCESS_MASK;


	open->op_created = 0;
	/*
	/*
	 * RFC5661 18.51.3
	 * RFC5661 18.51.3
	 * Before RECLAIM_COMPLETE done, server should deny new lock
	 * Before RECLAIM_COMPLETE done, server should deny new lock
@@ -408,6 +408,7 @@ nfsd4_open(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
	 * set, (2) sets open->op_stateid, (3) sets open->op_delegation.
	 * set, (2) sets open->op_stateid, (3) sets open->op_delegation.
	 */
	 */
	status = nfsd4_process_open2(rqstp, &cstate->current_fh, open);
	status = nfsd4_process_open2(rqstp, &cstate->current_fh, open);
	WARN_ON(status && open->op_created);
out:
out:
	nfsd4_cleanup_open_state(open, status);
	nfsd4_cleanup_open_state(open, status);
	if (open->op_openowner)
	if (open->op_openowner)
+1 −1
Original line number Original line Diff line number Diff line
@@ -1370,7 +1370,7 @@ __be32
do_nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp,
do_nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp,
		char *fname, int flen, struct iattr *iap,
		char *fname, int flen, struct iattr *iap,
		struct svc_fh *resfhp, int createmode, u32 *verifier,
		struct svc_fh *resfhp, int createmode, u32 *verifier,
	        int *truncp, int *created)
	        bool *truncp, bool *created)
{
{
	struct dentry	*dentry, *dchild = NULL;
	struct dentry	*dentry, *dchild = NULL;
	struct inode	*dirp;
	struct inode	*dirp;
+1 −1
Original line number Original line Diff line number Diff line
@@ -62,7 +62,7 @@ __be32 nfsd_access(struct svc_rqst *, struct svc_fh *, u32 *, u32 *);
__be32		do_nfsd_create(struct svc_rqst *, struct svc_fh *,
__be32		do_nfsd_create(struct svc_rqst *, struct svc_fh *,
				char *name, int len, struct iattr *attrs,
				char *name, int len, struct iattr *attrs,
				struct svc_fh *res, int createmode,
				struct svc_fh *res, int createmode,
				u32 *verifier, int *truncp, int *created);
				u32 *verifier, bool *truncp, bool *created);
__be32		nfsd_commit(struct svc_rqst *, struct svc_fh *,
__be32		nfsd_commit(struct svc_rqst *, struct svc_fh *,
				loff_t, unsigned long);
				loff_t, unsigned long);
#endif /* CONFIG_NFSD_V3 */
#endif /* CONFIG_NFSD_V3 */
+2 −1
Original line number Original line Diff line number Diff line
@@ -226,7 +226,8 @@ struct nfsd4_open {
	u32		op_recall;          /* recall */
	u32		op_recall;          /* recall */
	struct nfsd4_change_info  op_cinfo; /* response */
	struct nfsd4_change_info  op_cinfo; /* response */
	u32		op_rflags;          /* response */
	u32		op_rflags;          /* response */
	int		op_truncate;        /* used during processing */
	bool		op_truncate;        /* used during processing */
	bool		op_created;         /* used during processing */
	struct nfs4_openowner *op_openowner; /* used during processing */
	struct nfs4_openowner *op_openowner; /* used during processing */
	struct nfs4_file *op_file;          /* used during processing */
	struct nfs4_file *op_file;          /* used during processing */
	struct nfs4_ol_stateid *op_stp;	    /* used during processing */
	struct nfs4_ol_stateid *op_stp;	    /* used during processing */