Exemplo n.º 1
0
static int au_wr_dir_cpup(struct dentry *dentry, struct dentry *parent,
			  const unsigned char add_entry, aufs_bindex_t bcpup,
			  aufs_bindex_t bstart)
{
	int err;
	struct dentry *h_parent;
	struct inode *h_dir;

	if (add_entry)
		IMustLock(parent->d_inode);
	else
		di_write_lock_parent(parent);

	err = 0;
	if (!au_h_dptr(parent, bcpup)) {
		if (bstart < bcpup)
			err = au_cpdown_dirs(dentry, bcpup);
		else
			err = au_cpup_dirs(dentry, bcpup);
	}
	if (!err && add_entry) {
		h_parent = au_h_dptr(parent, bcpup);
		h_dir = h_parent->d_inode;
		mutex_lock_nested(&h_dir->i_mutex, AuLsc_I_PARENT);
		err = au_lkup_neg(dentry, bcpup);
		/* todo: no unlock here */
		mutex_unlock(&h_dir->i_mutex);

		AuDbg("bcpup %d\n", bcpup);
		if (!err) {
			if (!dentry->d_inode)
				au_set_h_dptr(dentry, bstart, NULL);
			au_update_dbrange(dentry, /*do_put_zero*/0);
		}
	}

	if (!add_entry)
		di_write_unlock(parent);
	if (!err)
		err = bcpup; /* success */

	AuTraceErr(err);
	return err;
}
Exemplo n.º 2
0
/* make the parent dir on bdst */
static int au_do_mkdir(const unsigned char dmsg, struct au_mvd_args *a)
{
    int err;

    err = 0;
    a->mvd_hdir_src = au_hi(a->dir, a->mvd_bsrc);
    a->mvd_hdir_dst = au_hi(a->dir, a->mvd_bdst);
    a->mvd_h_src_parent = au_h_dptr(a->parent, a->mvd_bsrc);
    a->mvd_h_dst_parent = NULL;
    if (au_dbend(a->parent) >= a->mvd_bdst)
        a->mvd_h_dst_parent = au_h_dptr(a->parent, a->mvd_bdst);
    if (!a->mvd_h_dst_parent) {
        err = au_cpdown_dirs(a->dentry, a->mvd_bdst);
        if (unlikely(err)) {
            AU_MVD_PR(dmsg, "cpdown_dirs failed\n");
            goto out;
        }
        a->mvd_h_dst_parent = au_h_dptr(a->parent, a->mvd_bdst);
    }

out:
    AuTraceErr(err);
    return err;
}