int sidtab_context_to_sid(struct sidtab *s, struct context *context, u32 *out_sid) { u32 sid; int ret = 0; *out_sid = SECSID_NULL; sid = sidtab_search_context(s, context); if (!sid) { SIDTAB_LOCK(s); /* Rescan now that we hold the lock. */ sid = sidtab_search_context(s, context); if (sid) goto unlock_out; /* No SID exists for the context. Allocate a new one. */ if (s->next_sid == UINT_MAX || s->shutdown) { ret = -ENOMEM; goto unlock_out; } sid = s->next_sid++; ret = sidtab_insert(s, sid, context); if (ret) s->next_sid--; unlock_out: SIDTAB_UNLOCK(s); } if (ret) return ret; *out_sid = sid; return 0; }
void sidtab_shutdown(struct sidtab *s) { unsigned long flags; SIDTAB_LOCK(s, flags); s->shutdown = 1; SIDTAB_UNLOCK(s, flags); }
void sidtab_set(struct sidtab *dst, struct sidtab *src) { SIDTAB_LOCK(src); dst->htable = src->htable; dst->nel = src->nel; dst->next_sid = src->next_sid; dst->shutdown = 0; SIDTAB_UNLOCK(src); }
void sidtab_set(struct sidtab *dst, struct sidtab *src) { unsigned long flags; SIDTAB_LOCK(src, flags); dst->htable = src->htable; dst->nel = src->nel; dst->next_sid = src->next_sid; dst->shutdown = 0; SIDTAB_UNLOCK(src, flags); }
void sidtab_shutdown(struct sidtab *s) { SIDTAB_LOCK(s); s->shutdown = 1; SIDTAB_UNLOCK(s); }