int au_finfo_init(struct file *file, struct au_fidir *fidir) { int err, lc_idx; struct au_finfo *finfo; struct dentry *dentry; err = -ENOMEM; dentry = file->f_dentry; finfo = au_cache_alloc_finfo(); if (unlikely(!finfo)) goto out; err = 0; au_nfiles_inc(dentry->d_sb); lc_idx = AuLcNonDir_FIINFO; if (fidir) lc_idx = AuLcDir_FIINFO; au_rw_class(&finfo->fi_rwsem, au_lc_key + lc_idx); au_rw_write_lock(&finfo->fi_rwsem); finfo->fi_btop = -1; finfo->fi_hdir = fidir; atomic_set(&finfo->fi_generation, au_digen(dentry)); /* smp_mb(); */ /* atomic_set */ file->private_data = finfo; out: return err; }
/* * they are necessary regardless sysfs is disabled. */ void au_si_free(struct kobject *kobj) { struct au_sbinfo *sbinfo; char *locked __maybe_unused; /* debug only */ sbinfo = container_of(kobj, struct au_sbinfo, si_kobj); AuDebugOn(!list_empty(&sbinfo->si_plink.head)); AuDebugOn(atomic_read(&sbinfo->si_nowait.nw_len)); au_rw_write_lock(&sbinfo->si_rwsem); au_br_free(sbinfo); au_rw_write_unlock(&sbinfo->si_rwsem); AuDebugOn(radix_tree_gang_lookup (&sbinfo->au_si_pid.tree, (void **)&locked, /*first_index*/PID_MAX_DEFAULT - 1, /*max_items*/sizeof(locked)/sizeof(*locked))); kfree(sbinfo->si_branch); kfree(sbinfo->au_si_pid.bitmap); mutex_destroy(&sbinfo->si_xib_mtx); AuRwDestroy(&sbinfo->si_rwsem); kfree(sbinfo); }
int au_finfo_init(struct file *file, struct au_fidir *fidir) { int err; unsigned long ul; struct au_finfo *finfo; struct dentry *dentry; err = -ENOMEM; dentry = file->f_dentry; finfo = au_cache_alloc_finfo(); if (unlikely(!finfo)) goto out; err = 0; au_rw_write_lock(&finfo->fi_rwsem); finfo->fi_btop = -1; finfo->fi_hdir = fidir; atomic_set(&finfo->fi_generation, au_digen(dentry)); /* smp_mb(); */ /* atomic_set */ /* cf. au_store_oflag() */ ul = (unsigned long)file->private_data; file->f_mode |= (ul & FMODE_EXEC); file->private_data = finfo; out: return err; }