Skip to content

Commit

Permalink
[GFS2] Finally get ref counting correct
Browse files Browse the repository at this point in the history
The last patch missed some other instances of incorrect ref counting,
this fixes all of those too.

Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
  • Loading branch information
Steven Whitehouse committed Apr 7, 2006
1 parent b09e593 commit ed38650
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 6 deletions.
17 changes: 12 additions & 5 deletions fs/gfs2/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -776,9 +776,9 @@ static struct gfs2_dirent *gfs2_dirent_search(struct inode *inode,
goto got_dent;
leaf = (struct gfs2_leaf *)bh->b_data;
ln = be64_to_cpu(leaf->lf_next);
brelse(bh);
if (!ln)
break;
brelse(bh);
error = get_leaf(ip, ln, &bh);
} while(!error);

Expand All @@ -789,9 +789,11 @@ static struct gfs2_dirent *gfs2_dirent_search(struct inode *inode,
if (error)
return ERR_PTR(error);
dent = gfs2_dirent_scan(inode, bh->b_data, bh->b_size, scan, name, NULL);
brelse(bh);

got_dent:
if (unlikely(IS_ERR(dent))) {
brelse(bh);
bh = NULL;
}
*pbh = bh;
return dent;
}
Expand Down Expand Up @@ -1475,6 +1477,7 @@ int gfs2_dir_search(struct inode *dir, const struct qstr *name,
brelse(bh);
return 0;
}
brelse(bh);
return -ENOENT;
}

Expand Down Expand Up @@ -1616,6 +1619,7 @@ int gfs2_dir_del(struct gfs2_inode *dip, const struct qstr *name)
previous entry otherwise */
dent = gfs2_dirent_search(dip->i_vnode, name, gfs2_dirent_prev, &bh);
if (!dent) {
brelse(bh);
gfs2_consist_inode(dip);
return -EIO;
}
Expand All @@ -1636,8 +1640,8 @@ int gfs2_dir_del(struct gfs2_inode *dip, const struct qstr *name)
if (!entries)
gfs2_consist_inode(dip);
leaf->lf_entries = cpu_to_be16(--entries);
brelse(bh);
}
brelse(bh);

error = gfs2_meta_inode_buffer(dip, &bh);
if (error)
Expand Down Expand Up @@ -1676,6 +1680,7 @@ int gfs2_dir_mvino(struct gfs2_inode *dip, const struct qstr *filename,

dent = gfs2_dirent_search(dip->i_vnode, filename, gfs2_dirent_find, &bh);
if (!dent) {
brelse(bh);
gfs2_consist_inode(dip);
return -EIO;
}
Expand Down Expand Up @@ -1955,8 +1960,10 @@ int gfs2_diradd_alloc_required(struct inode *inode,
struct buffer_head *bh;

dent = gfs2_dirent_search(inode, name, gfs2_dirent_find_space, &bh);
if (!dent)
if (!dent) {
brelse(bh);
return 1;
}
if (IS_ERR(dent))
return PTR_ERR(dent);
brelse(bh);
Expand Down
2 changes: 1 addition & 1 deletion fs/gfs2/log.c
Original file line number Diff line number Diff line change
Expand Up @@ -196,14 +196,14 @@ int gfs2_log_reserve(struct gfs2_sbd *sdp, unsigned int blks)

void gfs2_log_release(struct gfs2_sbd *sdp, unsigned int blks)
{
up_read(&sdp->sd_log_flush_lock);

gfs2_log_lock(sdp);
sdp->sd_log_blks_free += blks;
/* printk(KERN_INFO "released %u blocks (%u left)\n", blks, sdp->sd_log_blks_free); */
gfs2_assert_withdraw(sdp,
sdp->sd_log_blks_free <= sdp->sd_jdesc->jd_blocks);
gfs2_log_unlock(sdp);
up_read(&sdp->sd_log_flush_lock);
}

static uint64_t log_bmap(struct gfs2_sbd *sdp, unsigned int lbn)
Expand Down

0 comments on commit ed38650

Please sign in to comment.