if (resp->mask & (NFS_ACL|NFS_ACLCNT)) {
                acl = get_acl(inode, ACL_TYPE_ACCESS);
-               if (IS_ERR(acl)) {
-                       nfserr = nfserrno(PTR_ERR(acl));
-                       goto fail;
-               }
                if (acl == NULL) {
                        /* Solaris returns the inode's minimum ACL. */
                        acl = posix_acl_from_mode(inode->i_mode, GFP_KERNEL);
                }
+               if (IS_ERR(acl)) {
+                       nfserr = nfserrno(PTR_ERR(acl));
+                       goto fail;
+               }
                resp->acl_access = acl;
        }
        if (resp->mask & (NFS_DFACL|NFS_DFACLCNT)) {
 
 
        if (resp->mask & (NFS_ACL|NFS_ACLCNT)) {
                acl = get_acl(inode, ACL_TYPE_ACCESS);
-               if (IS_ERR(acl)) {
-                       nfserr = nfserrno(PTR_ERR(acl));
-                       goto fail;
-               }
                if (acl == NULL) {
                        /* Solaris returns the inode's minimum ACL. */
                        acl = posix_acl_from_mode(inode->i_mode, GFP_KERNEL);
                }
+               if (IS_ERR(acl)) {
+                       nfserr = nfserrno(PTR_ERR(acl));
+                       goto fail;
+               }
                resp->acl_access = acl;
        }
        if (resp->mask & (NFS_DFACL|NFS_DFACLCNT)) {
 
        int size = 0;
 
        pacl = get_acl(inode, ACL_TYPE_ACCESS);
-       if (!pacl) {
+       if (!pacl)
                pacl = posix_acl_from_mode(inode->i_mode, GFP_KERNEL);
-               if (IS_ERR(pacl))
-                       return PTR_ERR(pacl);
-       }
+
+       if (IS_ERR(pacl))
+               return PTR_ERR(pacl);
+
        /* allocate for worst case: one (deny, allow) pair each: */
        size += 2 * pacl->a_count;
 
        if (S_ISDIR(inode->i_mode)) {
                flags = NFS4_ACL_DIR;
                dpacl = get_acl(inode, ACL_TYPE_DEFAULT);
+               if (IS_ERR(dpacl)) {
+                       error = PTR_ERR(dpacl);
+                       goto rel_pacl;
+               }
+
                if (dpacl)
                        size += 2 * dpacl->a_count;
        }
        if (dpacl)
                _posix_to_nfsv4_one(dpacl, *acl, flags | NFS4_ACL_TYPE_DEFAULT);
 
- out:
-       posix_acl_release(pacl);
+out:
        posix_acl_release(dpacl);
+rel_pacl:
+       posix_acl_release(pacl);
        return error;
 }