-+
-+/* ---------------------------------------------------------------------- */
-+
-+static void si_pid_alloc(struct au_si_pid *au_si_pid, int idx)
-+{
-+ unsigned long *p;
-+
-+ BUILD_BUG_ON(sizeof(unsigned long) !=
-+ sizeof(*au_si_pid->pid_bitmap));
-+
-+ mutex_lock(&au_si_pid->pid_mtx);
-+ p = au_si_pid->pid_bitmap[idx];
-+ while (!p) {
-+ /*
-+ * bad approach.
-+ * but keeping 'si_pid_set()' void is more important.
-+ */
-+ p = kcalloc(BITS_TO_LONGS(AU_PIDSTEP),
-+ sizeof(*au_si_pid->pid_bitmap),
-+ GFP_NOFS);
-+ if (p)
-+ break;
-+ cond_resched();
-+ }
-+ au_si_pid->pid_bitmap[idx] = p;
-+ mutex_unlock(&au_si_pid->pid_mtx);
-+}
-+
-+void si_pid_set(struct super_block *sb)
-+{
-+ pid_t bit;
-+ int idx;
-+ unsigned long *bitmap;
-+ struct au_si_pid *au_si_pid;
-+
-+ si_pid_idx_bit(&idx, &bit);
-+ au_si_pid = &au_sbi(sb)->au_si_pid;
-+ bitmap = au_si_pid->pid_bitmap[idx];
-+ if (!bitmap) {
-+ si_pid_alloc(au_si_pid, idx);
-+ bitmap = au_si_pid->pid_bitmap[idx];
-+ }
-+ AuDebugOn(test_bit(bit, bitmap));
-+ set_bit(bit, bitmap);
-+ /* smp_mb(); */
-+}