* permissive mode that only appear when in enforcing mode.
         *
         * See the corresponding handling in slow_avc_audit(), and the
-        * logic in selinux_inode_permission for the MAY_NOT_BLOCK flag,
-        * which is transliterated into AVC_NONBLOCKING.
+        * logic in selinux_inode_follow_link and selinux_inode_permission
+        * for the VFS MAY_NOT_BLOCK flag, which is transliterated into
+        * AVC_NONBLOCKING for avc_has_perm_noaudit().
         */
        if (flags & AVC_NONBLOCKING)
                return 0;
        return rc;
 }
 
+int avc_has_perm_flags(struct selinux_state *state,
+                      u32 ssid, u32 tsid, u16 tclass, u32 requested,
+                      struct common_audit_data *auditdata,
+                      int flags)
+{
+       struct av_decision avd;
+       int rc, rc2;
+
+       rc = avc_has_perm_noaudit(state, ssid, tsid, tclass, requested,
+                                 (flags & MAY_NOT_BLOCK) ? AVC_NONBLOCKING : 0,
+                                 &avd);
+
+       rc2 = avc_audit(state, ssid, tsid, tclass, requested, &avd, rc,
+                       auditdata, flags);
+       if (rc2)
+               return rc2;
+       return rc;
+}
+
 u32 avc_policy_seqno(struct selinux_state *state)
 {
        return state->avc->avc_cache.latest_notif;
 
        if (IS_ERR(isec))
                return PTR_ERR(isec);
 
-       return avc_has_perm(&selinux_state,
-                           sid, isec->sid, isec->sclass, FILE__READ, &ad);
+       return avc_has_perm_flags(&selinux_state,
+                                 sid, isec->sid, isec->sclass, FILE__READ, &ad,
+                                 rcu ? MAY_NOT_BLOCK : 0);
 }
 
 static noinline int audit_inode_permission(struct inode *inode,
 
                 u32 ssid, u32 tsid,
                 u16 tclass, u32 requested,
                 struct common_audit_data *auditdata);
+int avc_has_perm_flags(struct selinux_state *state,
+                      u32 ssid, u32 tsid,
+                      u16 tclass, u32 requested,
+                      struct common_audit_data *auditdata,
+                      int flags);
 
 int avc_has_extended_perms(struct selinux_state *state,
                           u32 ssid, u32 tsid, u16 tclass, u32 requested,