Commit e90deff5 authored by Steven Whitehouse's avatar Steven Whitehouse
Browse files

[GFS2] Fix bug in directory expansion code



We didn't properly check that leaf splitting was allowed. We do
now.

Signed-off-by: default avatarSteven Whitehouse <swhiteho@redhat.com>
parent d0dc80db
Loading
Loading
Loading
Loading
+14 −9
Original line number Diff line number Diff line
@@ -940,10 +940,15 @@ static int dir_split_leaf(struct inode *inode, const struct qstr *name)
	/*  Get the old leaf block  */
	error = get_leaf(dip, leaf_no, &obh);
	if (error)
		goto fail;
		return error;

	gfs2_trans_add_bh(dip->i_gl, obh, 1);
	oleaf = (struct gfs2_leaf *)obh->b_data;
	if (dip->i_di.di_depth == be16_to_cpu(oleaf->lf_depth)) {
		brelse(obh);
		return 1; /* can't split */
	}

	gfs2_trans_add_bh(dip->i_gl, obh, 1);

	nleaf = new_leaf(inode, &nbh, be16_to_cpu(oleaf->lf_depth) + 1);
	if (!nleaf) {
@@ -956,6 +961,7 @@ static int dir_split_leaf(struct inode *inode, const struct qstr *name)
	len = 1 << (dip->i_di.di_depth - be16_to_cpu(oleaf->lf_depth));
	half_len = len >> 1;
	if (!half_len) {
		printk(KERN_WARNING "di_depth %u lf_depth %u index %u\n", dip->i_di.di_depth, be16_to_cpu(oleaf->lf_depth), index);
		gfs2_consist_inode(dip);
		error = -EIO;
		goto fail_brelse;
@@ -1043,8 +1049,6 @@ static int dir_split_leaf(struct inode *inode, const struct qstr *name)

fail_brelse:
	brelse(obh);

 fail:
	brelse(nbh);
	return error;
}
@@ -1570,15 +1574,16 @@ int gfs2_dir_add(struct inode *inode, const struct qstr *name,
		error = dir_split_leaf(inode, name);
		if (error == 0)
			continue;
		if (error != -ENOSPC)
		if (error < 0)
			break;
		if (ip->i_di.di_depth < GFS2_DIR_MAX_DEPTH) {
			error = dir_double_exhash(ip);
			if (error)
				break;
			error = dir_split_leaf(inode, name);
			if (error)
			if (error < 0)
				break;
			if (error == 0)
				continue;
		}
		error = dir_new_leaf(inode, name);