if (size_change)
                put_write_access(inode);
        if (!err)
-               commit_metadata(fhp);
+               err = commit_metadata(fhp);
 out:
        return err;
 }
                iap->ia_valid &= ~(ATTR_UID|ATTR_GID);
        if (iap->ia_valid)
                return nfsd_setattr(rqstp, resfhp, iap, 0, (time_t)0);
-       return 0;
+       /* Callers expect file metadata to be committed here */
+       return commit_metadata(resfhp);
 }
 
 /* HPUX client sometimes creates a file in mode 000, and sets size to 0.
        err = nfsd_create_setattr(rqstp, resfhp, iap);
 
        /*
-        * nfsd_setattr already committed the child.  Transactional filesystems
-        * had a chance to commit changes for both parent and child
-        * simultaneously making the following commit_metadata a noop.
+        * nfsd_create_setattr already committed the child.  Transactional
+        * filesystems had a chance to commit changes for both parent and
+        * child * simultaneously making the following commit_metadata a
+        * noop.
         */
        err2 = nfserrno(commit_metadata(fhp));
        if (err2)
        err = nfsd_create_setattr(rqstp, resfhp, iap);
 
        /*
-        * nfsd_setattr already committed the child (and possibly also the parent).
+        * nfsd_create_setattr already committed the child
+        * (and possibly also the parent).
         */
        if (!err)
                err = nfserrno(commit_metadata(fhp));