Ejemplo n.º 1
0
int au_alloc_dinfo(struct dentry *dentry)
{
	struct au_dinfo *dinfo;
	struct super_block *sb;
	int nbr;

	dinfo = au_cache_alloc_dinfo();
	if (unlikely(!dinfo))
		goto out;

	sb = dentry->d_sb;
	nbr = au_sbend(sb) + 1;
	if (nbr <= 0)
		nbr = 1;
	dinfo->di_hdentry = kcalloc(nbr, sizeof(*dinfo->di_hdentry), GFP_NOFS);
	if (unlikely(!dinfo->di_hdentry))
		goto out_dinfo;

	atomic_set(&dinfo->di_generation, au_sigen(sb));
	/* smp_mb(); */ /* atomic_set */
	au_rw_init_wlock_nested(&dinfo->di_rwsem, AuLsc_DI_CHILD);
	dinfo->di_bstart = -1;
	dinfo->di_bend = -1;
	dinfo->di_bwh = -1;
	dinfo->di_bdiropq = -1;

	dentry->d_fsdata = dinfo;
	dentry->d_op = &aufs_dop;
	return 0; /* success */

 out_dinfo:
	au_cache_free_dinfo(dinfo);
 out:
	return -ENOMEM;
}
Ejemplo n.º 2
0
int au_alloc_dinfo(struct dentry *dentry)
{
	struct au_dinfo *dinfo;
	struct super_block *sb;
	int nbr;

	LKTRTrace("%.*s\n", AuDLNPair(dentry));
	AuDebugOn(dentry->d_fsdata);

	dinfo = au_cache_alloc_dinfo();
	if (dinfo) {
		sb = dentry->d_sb;
		nbr = au_sbend(sb) + 1;
		if (nbr <= 0)
			nbr = 1;
		dinfo->di_hdentry = kcalloc(nbr, sizeof(*dinfo->di_hdentry),
					    GFP_NOFS);
		if (dinfo->di_hdentry) {
			au_h_dentry_init_all(dinfo->di_hdentry, nbr);
			atomic_set(&dinfo->di_generation, au_sigen(sb));
			/* smp_mb(); */ /* atomic_set */
			au_rw_init_wlock_nested(&dinfo->di_rwsem,
						AuLsc_DI_CHILD);
			au_dbg_locked_di_reg(dentry, AuLock_DW, AuLsc_DI_CHILD);
			dinfo->di_bstart = -1;
			dinfo->di_bend = -1;
			dinfo->di_bwh = -1;
			dinfo->di_bdiropq = -1;

			dentry->d_fsdata = dinfo;
			dentry->d_op = &aufs_dop;
			return 0; /* success */
		}
		au_cache_free_dinfo(dinfo);
	}
	AuTraceErr(-ENOMEM);
	return -ENOMEM;
}