On Fri, Aug 26, 2022 at 12:10:43PM +1000, NeilBrown wrote: > if (is_create_with_attrs(open)) > nfsd4_acl_to_attr(NF4REG, open->op_acl, &attrs); > + inode = d_inode(path.dentry); > > - inode_lock_nested(inode, I_MUTEX_PARENT); > + child = filename_create_one_len(open->op_fname, > + open->op_fnamelen, > + &path, 0, &wq); > > - child = lookup_one_len(open->op_fname, parent, open->op_fnamelen); > - if (IS_ERR(child)) { > - status = nfserrno(PTR_ERR(child)); > - goto out; > - } > + if (IS_ERR(child)) > + return nfserrno(PTR_ERR(child)); Leaks acls, by the look of it? > + if (!IS_PAR_UPDATE(fhp->fh_dentry->d_inode) && > + inode_trylock_shared(fhp->fh_dentry->d_inode)) { > + /* only have a shared lock */ > + inode_unlock_shared(fhp->fh_dentry->d_inode); > + fhp->fh_no_atomic_attr = true; > + fhp->fh_no_wcc = true; Er... Shouldn't that be IS_PAR_UPDATE() && ... ?