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; }
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; }
int au_finfo_init(struct file *file) { struct au_finfo *finfo; struct dentry *dentry; unsigned long ul; dentry = file->f_dentry; finfo = au_cache_alloc_finfo(); if (unlikely(!finfo)) goto out; finfo->fi_hfile = kcalloc(au_sbend(dentry->d_sb) + 1, sizeof(*finfo->fi_hfile), GFP_NOFS); if (unlikely(!finfo->fi_hfile)) goto out_finfo; au_rw_init_wlock(&finfo->fi_rwsem); finfo->fi_bstart = -1; finfo->fi_bend = -1; atomic_set(&finfo->fi_generation, au_digen(dentry)); /* smp_mb(); */ /* atomic_set */ /* cf. au_store_oflag() */ /* suppress a warning in lp64 */ ul = (unsigned long)file->private_data; file->f_mode |= (vfsub_uint_to_fmode(ul) & FMODE_EXEC); file->private_data = finfo; return 0; /* success */ out_finfo: au_cache_free_finfo(finfo); out: return -ENOMEM; }