Example #1
0
static inline Indirect *get_branch(struct inode *inode,
					int depth,
					int *offsets,
					Indirect chain[DEPTH],
					int *err)
{
	struct super_block *sb = inode->i_sb;
	Indirect *p = chain;
	struct buffer_head *bh;

	*err = 0;
	/* i_data is not going away, no lock needed */
	add_chain (chain, NULL, i_data(inode) + *offsets);
	if (!p->key)
		goto no_block;
	while (--depth) {
		bh = sb_bread(sb, block_to_cpu(p->key));
		if (!bh)
			goto failure;
		read_lock(&pointers_lock);
		if (!verify_chain(chain, p))
			goto changed;
		add_chain(++p, bh, (block_t *)bh->b_data + *++offsets);
		read_unlock(&pointers_lock);
		if (!p->key)
			goto no_block;
	}
	return NULL;

changed:
	read_unlock(&pointers_lock);
	brelse(bh);
	*err = -EAGAIN;
	goto no_block;
failure:
	*err = -EIO;
no_block:
	return p;
}
Example #2
0
static inline int splice_branch(struct inode *inode,
                                Indirect chain[DEPTH],
                                Indirect *where,
                                int num)
{
    int i;

    /* Verify that place we are splicing to is still there and vacant */

    /* Writer: pointers */
    if (!verify_chain(chain, where-1) || *where->p)
        /* Writer: end */
        goto changed;

    /* That's it */

    *where->p = where->key;

    /* Writer: end */

    /* We are done with atomic stuff, now do the rest of housekeeping */

    inode->i_ctime = CURRENT_TIME;

    /* had we spliced it onto indirect block? */
    if (where->bh)
        mark_buffer_dirty_inode(where->bh, inode);

    mark_inode_dirty(inode);
    return 0;

changed:
    for (i = 1; i < num; i++)
        bforget(where[i].bh);
    for (i = 0; i < num; i++)
        minix_free_block(inode, block_to_cpu(where[i].key));
    return -EAGAIN;
}
Example #3
0
static inline Indirect *get_branch(struct inode *inode,
                                   int depth,
                                   int *offsets,
                                   Indirect chain[DEPTH],
                                   int *err)
{
    kdev_t dev = inode->i_dev;
    Indirect *p = chain;
    struct buffer_head *bh;

    *err = 0;
    /* i_data is not going away, no lock needed */
    add_chain (chain, NULL, i_data(inode) + *offsets);
    if (!p->key)
        goto no_block;
    while (--depth) {
        bh = bread(dev, block_to_cpu(p->key), BLOCK_SIZE);
        if (!bh)
            goto failure;
        /* Reader: pointers */
        if (!verify_chain(chain, p))
            goto changed;
        add_chain(++p, bh, (block_t *)bh->b_data + *++offsets);
        /* Reader: end */
        if (!p->key)
            goto no_block;
    }
    return NULL;

changed:
    *err = -EAGAIN;
    goto no_block;
failure:
    *err = -EIO;
no_block:
    return p;
}
Example #4
0
static inline int splice_branch(struct inode *inode,
				     Indirect chain[DEPTH],
				     Indirect *where,
				     int num)
{
	int i;

	write_lock(&pointers_lock);

	/* Verify that place we are splicing to is still there and vacant */
	if (!verify_chain(chain, where-1) || *where->p)
		goto changed;

	*where->p = where->key;

	write_unlock(&pointers_lock);

	/* We are done with atomic stuff, now do the rest of housekeeping */

	inode->i_ctime = current_time(inode);

	/* had we spliced it onto indirect block? */
	if (where->bh)
		mark_buffer_dirty_inode(where->bh, inode);

	mark_inode_dirty(inode);
	return 0;

changed:
	write_unlock(&pointers_lock);
	for (i = 1; i < num; i++)
		bforget(where[i].bh);
	for (i = 0; i < num; i++)
		xiafs_free_block(inode, block_to_cpu(where[i].key));
	return -EAGAIN;
}
static inline int splice_branch(struct inode *inode,
				     Indirect chain[DEPTH],
				     Indirect *where,
				     int num)
{
	int i;

	write_lock(&pointers_lock);

	/*                                                                */
	if (!verify_chain(chain, where-1) || *where->p)
		goto changed;

	*where->p = where->key;

	write_unlock(&pointers_lock);

	/*                                                                */

	inode->i_ctime = CURRENT_TIME_SEC;

	/*                                        */
	if (where->bh)
		mark_buffer_dirty_inode(where->bh, inode);

	mark_inode_dirty(inode);
	return 0;

changed:
	write_unlock(&pointers_lock);
	for (i = 1; i < num; i++)
		bforget(where[i].bh);
	for (i = 0; i < num; i++)
		minix_free_block(inode, block_to_cpu(where[i].key));
	return -EAGAIN;
}