return (bool)(evm_initialized & EVM_KEY_MASK);
 }
 
+/*
+ * This function determines whether or not it is safe to ignore verification
+ * errors, based on the ability of EVM to calculate HMACs. If the HMAC key
+ * is not loaded, and it cannot be loaded in the future due to the
+ * EVM_SETUP_COMPLETE initialization flag, allowing an operation despite the
+ * attrs/xattrs being found invalid will not make them valid.
+ */
+static bool evm_hmac_disabled(void)
+{
+       if (evm_initialized & EVM_INIT_HMAC)
+               return false;
+
+       if (!(evm_initialized & EVM_SETUP_COMPLETE))
+               return false;
+
+       return true;
+}
+
 static int evm_find_protected_xattrs(struct dentry *dentry)
 {
        struct inode *inode = d_backing_inode(dentry);
        if (evm_status == INTEGRITY_NOXATTRS) {
                struct integrity_iint_cache *iint;
 
+               /* Exception if the HMAC is not going to be calculated. */
+               if (evm_hmac_disabled())
+                       return 0;
+
                iint = integrity_iint_find(d_backing_inode(dentry));
                if (iint && (iint->flags & IMA_NEW_FILE))
                        return 0;
                                    -EPERM, 0);
        }
 out:
+       /* Exception if the HMAC is not going to be calculated. */
+       if (evm_hmac_disabled() && (evm_status == INTEGRITY_NOLABEL ||
+           evm_status == INTEGRITY_UNKNOWN))
+               return 0;
        if (evm_status != INTEGRITY_PASS)
                integrity_audit_msg(AUDIT_INTEGRITY_METADATA, d_backing_inode(dentry),
                                    dentry->d_name.name, "appraise_metadata",
        if (!strcmp(xattr_name, XATTR_NAME_EVM))
                return;
 
+       if (!(evm_initialized & EVM_INIT_HMAC))
+               return;
+
        evm_update_evmxattr(dentry, xattr_name, xattr_value, xattr_value_len);
 }
 
        if (!strcmp(xattr_name, XATTR_NAME_EVM))
                return;
 
+       if (!(evm_initialized & EVM_INIT_HMAC))
+               return;
+
        evm_update_evmxattr(dentry, xattr_name, NULL, 0);
 }
 
                return 0;
        evm_status = evm_verify_current_integrity(dentry);
        if ((evm_status == INTEGRITY_PASS) ||
-           (evm_status == INTEGRITY_NOXATTRS))
+           (evm_status == INTEGRITY_NOXATTRS) ||
+           (evm_hmac_disabled() && (evm_status == INTEGRITY_NOLABEL ||
+            evm_status == INTEGRITY_UNKNOWN)))
                return 0;
        integrity_audit_msg(AUDIT_INTEGRITY_METADATA, d_backing_inode(dentry),
                            dentry->d_name.name, "appraise_metadata",
 
        evm_reset_status(dentry->d_inode);
 
+       if (!(evm_initialized & EVM_INIT_HMAC))
+               return;
+
        if (ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID))
                evm_update_evmxattr(dentry, NULL, NULL, 0);
 }