|
@@ -317,7 +317,7 @@ void gfs2_remove_from_journal(struct buffer_head *bh, struct gfs2_trans *tr, int
|
|
|
}
|
|
|
if (bd) {
|
|
|
if (bd->bd_ail) {
|
|
|
- gfs2_remove_from_ail(NULL, bd);
|
|
|
+ gfs2_remove_from_ail(bd);
|
|
|
bh->b_private = NULL;
|
|
|
bd->bd_bh = NULL;
|
|
|
bd->bd_blkno = bh->b_blocknr;
|
|
@@ -357,32 +357,6 @@ void gfs2_meta_wipe(struct gfs2_inode *ip, u64 bstart, u32 blen)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * gfs2_meta_cache_flush - get rid of any references on buffers for this inode
|
|
|
- * @ip: The GFS2 inode
|
|
|
- *
|
|
|
- * This releases buffers that are in the most-recently-used array of
|
|
|
- * blocks used for indirect block addressing for this inode.
|
|
|
- */
|
|
|
-
|
|
|
-void gfs2_meta_cache_flush(struct gfs2_inode *ip)
|
|
|
-{
|
|
|
- struct buffer_head **bh_slot;
|
|
|
- unsigned int x;
|
|
|
-
|
|
|
- spin_lock(&ip->i_spin);
|
|
|
-
|
|
|
- for (x = 0; x < GFS2_MAX_META_HEIGHT; x++) {
|
|
|
- bh_slot = &ip->i_cache[x];
|
|
|
- if (*bh_slot) {
|
|
|
- brelse(*bh_slot);
|
|
|
- *bh_slot = NULL;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- spin_unlock(&ip->i_spin);
|
|
|
-}
|
|
|
-
|
|
|
/**
|
|
|
* gfs2_meta_indirect_buffer - Get a metadata buffer
|
|
|
* @ip: The GFS2 inode
|
|
@@ -391,8 +365,6 @@ void gfs2_meta_cache_flush(struct gfs2_inode *ip)
|
|
|
* @new: Non-zero if we may create a new buffer
|
|
|
* @bhp: the buffer is returned here
|
|
|
*
|
|
|
- * Try to use the gfs2_inode's MRU metadata tree cache.
|
|
|
- *
|
|
|
* Returns: errno
|
|
|
*/
|
|
|
|
|
@@ -401,58 +373,25 @@ int gfs2_meta_indirect_buffer(struct gfs2_inode *ip, int height, u64 num,
|
|
|
{
|
|
|
struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
|
|
|
struct gfs2_glock *gl = ip->i_gl;
|
|
|
- struct buffer_head *bh = NULL, **bh_slot = ip->i_cache + height;
|
|
|
- int in_cache = 0;
|
|
|
-
|
|
|
- BUG_ON(!gl);
|
|
|
- BUG_ON(!sdp);
|
|
|
-
|
|
|
- spin_lock(&ip->i_spin);
|
|
|
- if (*bh_slot && (*bh_slot)->b_blocknr == num) {
|
|
|
- bh = *bh_slot;
|
|
|
- get_bh(bh);
|
|
|
- in_cache = 1;
|
|
|
- }
|
|
|
- spin_unlock(&ip->i_spin);
|
|
|
-
|
|
|
- if (!bh)
|
|
|
- bh = getbuf(gl, num, CREATE);
|
|
|
-
|
|
|
- if (!bh)
|
|
|
- return -ENOBUFS;
|
|
|
+ struct buffer_head *bh;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
if (new) {
|
|
|
- if (gfs2_assert_warn(sdp, height))
|
|
|
- goto err;
|
|
|
- meta_prep_new(bh);
|
|
|
+ BUG_ON(height == 0);
|
|
|
+ bh = gfs2_meta_new(gl, num);
|
|
|
gfs2_trans_add_bh(ip->i_gl, bh, 1);
|
|
|
gfs2_metatype_set(bh, GFS2_METATYPE_IN, GFS2_FORMAT_IN);
|
|
|
gfs2_buffer_clear_tail(bh, sizeof(struct gfs2_meta_header));
|
|
|
} else {
|
|
|
u32 mtype = height ? GFS2_METATYPE_IN : GFS2_METATYPE_DI;
|
|
|
- if (!buffer_uptodate(bh)) {
|
|
|
- ll_rw_block(READ_META, 1, &bh);
|
|
|
- if (gfs2_meta_wait(sdp, bh))
|
|
|
- goto err;
|
|
|
+ ret = gfs2_meta_read(gl, num, DIO_WAIT, &bh);
|
|
|
+ if (ret == 0 && gfs2_metatype_check(sdp, bh, mtype)) {
|
|
|
+ brelse(bh);
|
|
|
+ ret = -EIO;
|
|
|
}
|
|
|
- if (gfs2_metatype_check(sdp, bh, mtype))
|
|
|
- goto err;
|
|
|
- }
|
|
|
-
|
|
|
- if (!in_cache) {
|
|
|
- spin_lock(&ip->i_spin);
|
|
|
- if (*bh_slot)
|
|
|
- brelse(*bh_slot);
|
|
|
- *bh_slot = bh;
|
|
|
- get_bh(bh);
|
|
|
- spin_unlock(&ip->i_spin);
|
|
|
}
|
|
|
-
|
|
|
*bhp = bh;
|
|
|
- return 0;
|
|
|
-err:
|
|
|
- brelse(bh);
|
|
|
- return -EIO;
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
/**
|