if (host_err)
                return nfserrno(host_err);
 
-       fh_lock_nested(fhp, I_MUTEX_PARENT);
+       inode_lock_nested(inode, I_MUTEX_PARENT);
 
        child = lookup_one_len(argp->name, parent, argp->len);
        if (IS_ERR(child)) {
        if (!IS_POSIXACL(inode))
                iap->ia_mode &= ~current_umask();
 
+       fh_fill_pre_attrs(fhp);
        host_err = vfs_create(&init_user_ns, inode, child, iap->ia_mode, true);
        if (host_err < 0) {
                status = nfserrno(host_err);
                goto out;
        }
+       fh_fill_post_attrs(fhp);
 
        /* A newly created file already has a file size of zero. */
        if ((iap->ia_valid & ATTR_SIZE) && (iap->ia_size == 0))
        status = nfsd_create_setattr(rqstp, fhp, resfhp, &attrs);
 
 out:
-       fh_unlock(fhp);
+       inode_unlock(inode);
        if (child && !IS_ERR(child))
                dput(child);
        fh_drop_write(fhp);
 
        if (is_create_with_attrs(open))
                nfsd4_acl_to_attr(NF4REG, open->op_acl, &attrs);
 
-       fh_lock_nested(fhp, I_MUTEX_PARENT);
+       inode_lock_nested(inode, I_MUTEX_PARENT);
 
        child = lookup_one_len(open->op_fname, parent, open->op_fnamelen);
        if (IS_ERR(child)) {
        if (!IS_POSIXACL(inode))
                iap->ia_mode &= ~current_umask();
 
+       fh_fill_pre_attrs(fhp);
        status = nfsd4_vfs_create(fhp, child, open);
        if (status != nfs_ok)
                goto out;
        open->op_created = true;
+       fh_fill_post_attrs(fhp);
 
        /* A newly created file already has a file size of zero. */
        if ((iap->ia_valid & ATTR_SIZE) && (iap->ia_size == 0))
        if (attrs.na_aclerr)
                open->op_bmval[0] &= ~FATTR4_WORD0_ACL;
 out:
-       fh_unlock(fhp);
+       inode_unlock(inode);
        nfsd_attrs_free(&attrs);
        if (child && !IS_ERR(child))
                dput(child);
 
        if (host_err)
                return nfserrno(host_err);
 
-       fh_lock_nested(fhp, I_MUTEX_PARENT);
+       inode_lock_nested(dentry->d_inode, I_MUTEX_PARENT);
        dchild = lookup_one_len(fname, dentry, flen);
        host_err = PTR_ERR(dchild);
        if (IS_ERR(dchild)) {
        dput(dchild);
        if (err)
                goto out_unlock;
+       fh_fill_pre_attrs(fhp);
        err = nfsd_create_locked(rqstp, fhp, fname, flen, attrs, type,
                                 rdev, resfhp);
+       fh_fill_post_attrs(fhp);
 out_unlock:
-       fh_unlock(fhp);
+       inode_unlock(dentry->d_inode);
        return err;
 }
 
                goto out;
        }
 
-       fh_lock(fhp);
        dentry = fhp->fh_dentry;
+       inode_lock_nested(dentry->d_inode, I_MUTEX_PARENT);
        dnew = lookup_one_len(fname, dentry, flen);
        if (IS_ERR(dnew)) {
                err = nfserrno(PTR_ERR(dnew));
-               fh_unlock(fhp);
+               inode_unlock(dentry->d_inode);
                goto out_drop_write;
        }
+       fh_fill_pre_attrs(fhp);
        host_err = vfs_symlink(&init_user_ns, d_inode(dentry), dnew, path);
        err = nfserrno(host_err);
        cerr = fh_compose(resfhp, fhp->fh_export, dnew, fhp);
        if (!err)
                nfsd_create_setattr(rqstp, fhp, resfhp, attrs);
-       fh_unlock(fhp);
+       fh_fill_post_attrs(fhp);
+       inode_unlock(dentry->d_inode);
        if (!err)
                err = nfserrno(commit_metadata(fhp));
        dput(dnew);
                goto out;
        }
 
-       fh_lock_nested(ffhp, I_MUTEX_PARENT);
        ddir = ffhp->fh_dentry;
        dirp = d_inode(ddir);
+       inode_lock_nested(dirp, I_MUTEX_PARENT);
 
        dnew = lookup_one_len(name, ddir, len);
        if (IS_ERR(dnew)) {
        err = nfserr_noent;
        if (d_really_is_negative(dold))
                goto out_dput;
+       fh_fill_pre_attrs(ffhp);
        host_err = vfs_link(dold, &init_user_ns, dirp, dnew, NULL);
-       fh_unlock(ffhp);
+       fh_fill_post_attrs(ffhp);
+       inode_unlock(dirp);
        if (!host_err) {
                err = nfserrno(commit_metadata(ffhp));
                if (!err)
 out_dput:
        dput(dnew);
 out_unlock:
-       fh_unlock(ffhp);
+       inode_unlock(dirp);
        goto out_drop_write;
 }
 
        if (host_err)
                goto out_nfserr;
 
-       fh_lock_nested(fhp, I_MUTEX_PARENT);
        dentry = fhp->fh_dentry;
        dirp = d_inode(dentry);
+       inode_lock_nested(dirp, I_MUTEX_PARENT);
 
        rdentry = lookup_one_len(fname, dentry, flen);
        host_err = PTR_ERR(rdentry);
        if (!type)
                type = d_inode(rdentry)->i_mode & S_IFMT;
 
+       fh_fill_pre_attrs(fhp);
        if (type != S_IFDIR) {
                if (rdentry->d_sb->s_export_op->flags & EXPORT_OP_CLOSE_BEFORE_UNLINK)
                        nfsd_close_cached_files(rdentry);
        } else {
                host_err = vfs_rmdir(&init_user_ns, dirp, rdentry);
        }
+       fh_fill_post_attrs(fhp);
 
-       fh_unlock(fhp);
+       inode_unlock(dirp);
        if (!host_err)
                host_err = commit_metadata(fhp);
        dput(rdentry);
 out:
        return err;
 out_unlock:
-       fh_unlock(fhp);
+       inode_unlock(dirp);
        goto out_drop_write;
 }