diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2019-06-21 13:45:41 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-06-21 13:45:41 -0700 | 
| commit | c036f7dabc34ff14fb8a4a04cf3d53afb435715a (patch) | |
| tree | d7330cf0c7b2aab95c34d0c9d5db1d32e0a93b72 /fs/nfs/nfs4proc.c | |
| parent | ff17bbe0bb405ad8b36e55815d381841f9fdeebc (diff) | |
| parent | 19d55046cd824baab53534ba7e7f99945c6fdcb1 (diff) | |
Merge tag 'nfs-for-5.2-3' of git://git.linux-nfs.org/projects/anna/linux-nfs
Pull more NFS client fixes from Anna Schumaker:
 "These are mostly refcounting issues that people have found recently.
  The revert fixes a suspend recovery performance issue.
   - SUNRPC: Fix a credential refcount leak
   - Revert "SUNRPC: Declare RPC timers as TIMER_DEFERRABLE"
   - SUNRPC: Fix xps refcount imbalance on the error path
   - NFS4: Only set creation opendata if O_CREAT"
* tag 'nfs-for-5.2-3' of git://git.linux-nfs.org/projects/anna/linux-nfs:
  SUNRPC: Fix a credential refcount leak
  Revert "SUNRPC: Declare RPC timers as TIMER_DEFERRABLE"
  net :sunrpc :clnt :Fix xps refcount imbalance on the error path
  NFS4: Only set creation opendata if O_CREAT
Diffstat (limited to 'fs/nfs/nfs4proc.c')
| -rw-r--r-- | fs/nfs/nfs4proc.c | 20 | 
1 files changed, 11 insertions, 9 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index e38f4af20950..6418cb6c079b 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -1256,10 +1256,20 @@ static struct nfs4_opendata *nfs4_opendata_alloc(struct dentry *dentry,  	atomic_inc(&sp->so_count);  	p->o_arg.open_flags = flags;  	p->o_arg.fmode = fmode & (FMODE_READ|FMODE_WRITE); -	p->o_arg.umask = current_umask();  	p->o_arg.claim = nfs4_map_atomic_open_claim(server, claim);  	p->o_arg.share_access = nfs4_map_atomic_open_share(server,  			fmode, flags); +	if (flags & O_CREAT) { +		p->o_arg.umask = current_umask(); +		p->o_arg.label = nfs4_label_copy(p->a_label, label); +		if (c->sattr != NULL && c->sattr->ia_valid != 0) { +			p->o_arg.u.attrs = &p->attrs; +			memcpy(&p->attrs, c->sattr, sizeof(p->attrs)); + +			memcpy(p->o_arg.u.verifier.data, c->verf, +					sizeof(p->o_arg.u.verifier.data)); +		} +	}  	/* don't put an ACCESS op in OPEN compound if O_EXCL, because ACCESS  	 * will return permission denied for all bits until close */  	if (!(flags & O_EXCL)) { @@ -1283,7 +1293,6 @@ static struct nfs4_opendata *nfs4_opendata_alloc(struct dentry *dentry,  	p->o_arg.server = server;  	p->o_arg.bitmask = nfs4_bitmask(server, label);  	p->o_arg.open_bitmap = &nfs4_fattr_bitmap[0]; -	p->o_arg.label = nfs4_label_copy(p->a_label, label);  	switch (p->o_arg.claim) {  	case NFS4_OPEN_CLAIM_NULL:  	case NFS4_OPEN_CLAIM_DELEGATE_CUR: @@ -1296,13 +1305,6 @@ static struct nfs4_opendata *nfs4_opendata_alloc(struct dentry *dentry,  	case NFS4_OPEN_CLAIM_DELEG_PREV_FH:  		p->o_arg.fh = NFS_FH(d_inode(dentry));  	} -	if (c != NULL && c->sattr != NULL && c->sattr->ia_valid != 0) { -		p->o_arg.u.attrs = &p->attrs; -		memcpy(&p->attrs, c->sattr, sizeof(p->attrs)); - -		memcpy(p->o_arg.u.verifier.data, c->verf, -				sizeof(p->o_arg.u.verifier.data)); -	}  	p->c_arg.fh = &p->o_res.fh;  	p->c_arg.stateid = &p->o_res.stateid;  	p->c_arg.seqid = p->o_arg.seqid;  | 
