Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[GFS2] Remove useless i_cache from inodes



The i_cache was designed to keep references to the indirect blocks
used during block mapping so that they didn't have to be looked
up continually. The idea failed because there are too many places
where the i_cache needs to be freed, and this has in the past been
the cause of many bugs.

In addition there was no performance benefit being gained since the
disk blocks in question were cached anyway. So this patch removes
it in order to simplify the code to prepare for other changes which
would otherwise have had to add further support for this feature.

Signed-off-by: default avatarSteven Whitehouse <swhiteho@redhat.com>
parent 3cc3f710
Loading
Loading
Loading
Loading
+1 −20
Original line number Diff line number Diff line
@@ -56,7 +56,7 @@ static void gfs2_ail_empty_gl(struct gfs2_glock *gl)
		bd = list_entry(head->next, struct gfs2_bufdata,
				bd_ail_gl_list);
		bh = bd->bd_bh;
		gfs2_remove_from_ail(NULL, bd);
		gfs2_remove_from_ail(bd);
		bd->bd_bh = NULL;
		bh->b_private = NULL;
		bd->bd_blkno = bh->b_blocknr;
@@ -286,23 +286,6 @@ static int inode_go_lock(struct gfs2_holder *gh)
	return error;
}

/**
 * inode_go_unlock - operation done before an inode lock is unlocked by a
 *		     process
 * @gl: the glock
 * @flags:
 *
 */

static void inode_go_unlock(struct gfs2_holder *gh)
{
	struct gfs2_glock *gl = gh->gh_gl;
	struct gfs2_inode *ip = gl->gl_object;

	if (ip)
		gfs2_meta_cache_flush(ip);
}

/**
 * rgrp_go_demote_ok - Check to see if it's ok to unlock a RG's glock
 * @gl: the glock
@@ -377,7 +360,6 @@ static void trans_go_xmote_bh(struct gfs2_glock *gl)

	if (gl->gl_state != LM_ST_UNLOCKED &&
	    test_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags)) {
		gfs2_meta_cache_flush(GFS2_I(sdp->sd_jdesc->jd_inode));
		j_gl->gl_ops->go_inval(j_gl, DIO_METADATA);

		error = gfs2_find_jhead(sdp->sd_jdesc, &head);
@@ -437,7 +419,6 @@ const struct gfs2_glock_operations gfs2_inode_glops = {
	.go_inval = inode_go_inval,
	.go_demote_ok = inode_go_demote_ok,
	.go_lock = inode_go_lock,
	.go_unlock = inode_go_unlock,
	.go_type = LM_TYPE_INODE,
	.go_min_hold_time = HZ / 10,
};
+0 −2
Original line number Diff line number Diff line
@@ -275,8 +275,6 @@ struct gfs2_inode {
	spinlock_t i_spin;
	struct rw_semaphore i_rw_mutex;
	unsigned long i_last_pfault;

	struct buffer_head *i_cache[GFS2_MAX_META_HEIGHT];
};

/*
+5 −8
Original line number Diff line number Diff line
@@ -293,11 +293,6 @@ static int gfs2_dinode_in(struct gfs2_inode *ip, const void *buf)
	return 0;
}

static void gfs2_inode_bh(struct gfs2_inode *ip, struct buffer_head *bh)
{
	ip->i_cache[0] = bh;
}

/**
 * gfs2_inode_refresh - Refresh the incore copy of the dinode
 * @ip: The GFS2 inode
@@ -1002,8 +997,6 @@ struct inode *gfs2_createi(struct gfs2_holder *ghs, const struct qstr *name,
	if (IS_ERR(inode))
		goto fail_gunlock2;

	gfs2_inode_bh(GFS2_I(inode), bh);

	error = gfs2_inode_refresh(GFS2_I(inode));
	if (error)
		goto fail_gunlock2;
@@ -1020,6 +1013,8 @@ struct inode *gfs2_createi(struct gfs2_holder *ghs, const struct qstr *name,
	if (error)
		goto fail_gunlock2;

	if (bh)
		brelse(bh);
	if (!inode)
		return ERR_PTR(-ENOMEM);
	return inode;
@@ -1031,6 +1026,8 @@ struct inode *gfs2_createi(struct gfs2_holder *ghs, const struct qstr *name,
fail_gunlock:
	gfs2_glock_dq(ghs);
fail:
	if (bh)
		brelse(bh);
	return ERR_PTR(error);
}

+2 −4
Original line number Diff line number Diff line
@@ -68,14 +68,12 @@ unsigned int gfs2_struct2blk(struct gfs2_sbd *sdp, unsigned int nstruct,
 *
 */

void gfs2_remove_from_ail(struct address_space *mapping, struct gfs2_bufdata *bd)
void gfs2_remove_from_ail(struct gfs2_bufdata *bd)
{
	bd->bd_ail = NULL;
	list_del_init(&bd->bd_ail_st_list);
	list_del_init(&bd->bd_ail_gl_list);
	atomic_dec(&bd->bd_gl->gl_ail_count);
	if (mapping)
		gfs2_meta_cache_flush(GFS2_I(mapping->host));
	brelse(bd->bd_bh);
}

@@ -248,7 +246,7 @@ static void gfs2_ail2_empty_one(struct gfs2_sbd *sdp, struct gfs2_ail *ai)
		bd = list_entry(head->prev, struct gfs2_bufdata,
				bd_ail_st_list);
		gfs2_assert(sdp, bd->bd_ail == ai);
		gfs2_remove_from_ail(bd->bd_bh->b_page->mapping, bd);
		gfs2_remove_from_ail(bd);
	}
}

+1 −1
Original line number Diff line number Diff line
@@ -59,7 +59,7 @@ struct buffer_head *gfs2_log_fake_buf(struct gfs2_sbd *sdp,
				      struct buffer_head *real);
void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl);
void gfs2_log_commit(struct gfs2_sbd *sdp, struct gfs2_trans *trans);
void gfs2_remove_from_ail(struct address_space *mapping, struct gfs2_bufdata *bd);
void gfs2_remove_from_ail(struct gfs2_bufdata *bd);

void gfs2_log_shutdown(struct gfs2_sbd *sdp);
void gfs2_meta_syncfs(struct gfs2_sbd *sdp);
Loading