void smk_insert_entry(struct smack_known *skp);
 struct smack_known *smk_find_entry(const char *);
 bool smack_privileged(int cap);
+bool smack_privileged_cred(int cap, const struct cred *cred);
 void smk_destroy_label_list(struct list_head *list);
 
 /*
 
 LIST_HEAD(smack_onlycap_list);
 DEFINE_MUTEX(smack_onlycap_lock);
 
-/*
+/**
+ * smack_privileged_cred - are all privilege requirements met by cred
+ * @cap: The requested capability
+ * @cred: the credential to use
+ *
  * Is the task privileged and allowed to be privileged
  * by the onlycap rule.
  *
  * Returns true if the task is allowed to be privileged, false if it's not.
  */
-bool smack_privileged(int cap)
+bool smack_privileged_cred(int cap, const struct cred *cred)
 {
-       struct smack_known *skp = smk_of_current();
+       struct task_smack *tsp = cred->security;
+       struct smack_known *skp = tsp->smk_task;
        struct smack_known_list_elem *sklep;
        int rc;
 
-       /*
-        * All kernel tasks are privileged
-        */
-       if (unlikely(current->flags & PF_KTHREAD))
-               return true;
-
-       rc = cap_capable(current_cred(), &init_user_ns, cap,
-                               SECURITY_CAP_AUDIT);
+       rc = cap_capable(cred, &init_user_ns, cap, SECURITY_CAP_AUDIT);
        if (rc)
                return false;
 
 
        return false;
 }
+
+/**
+ * smack_privileged - are all privilege requirements met
+ * @cap: The requested capability
+ *
+ * Is the task privileged and allowed to be privileged
+ * by the onlycap rule.
+ *
+ * Returns true if the task is allowed to be privileged, false if it's not.
+ */
+bool smack_privileged(int cap)
+{
+       /*
+        * All kernel tasks are privileged
+        */
+       if (unlikely(current->flags & PF_KTHREAD))
+               return true;
+
+       return smack_privileged_cred(cap, current_cred());
+}