Skip to content

Commit

Permalink
[GFS2] Update journal accounting code.
Browse files Browse the repository at this point in the history
A small update to the journaling code to change the way that
the "extra" blocks are accounted for in the journal. These are
used at a rate of one per 503 metadata blocks or one per 251
journaled data blocks (or just one if the total number of journaled
blocks in the transaction is smaller). Since we are using them at
two different rates the old method of accounting for them no longer
works and we count them up as required.

Since the "per transaction" accounting can't handle this (there is no
fixed number of header blocks per transaction) we have to account for
it in the general journal code. We now require that each transaction
reserves more blocks than it actually needs to take account of the
possible extra blocks.

Also a final fix to dir.c to ensure that all ref counts are handled
correctly.

Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
  • Loading branch information
Steven Whitehouse committed Apr 11, 2006
1 parent ed38650 commit f4154ea
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 19 deletions.
8 changes: 2 additions & 6 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 @@ -790,7 +790,7 @@ static struct gfs2_dirent *gfs2_dirent_search(struct inode *inode,
return ERR_PTR(error);
dent = gfs2_dirent_scan(inode, bh->b_data, bh->b_size, scan, name, NULL);
got_dent:
if (unlikely(IS_ERR(dent))) {
if (unlikely(dent == NULL || IS_ERR(dent))) {
brelse(bh);
bh = NULL;
}
Expand Down Expand Up @@ -1477,7 +1477,6 @@ int gfs2_dir_search(struct inode *dir, const struct qstr *name,
brelse(bh);
return 0;
}
brelse(bh);
return -ENOENT;
}

Expand Down Expand Up @@ -1619,7 +1618,6 @@ 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 Down Expand Up @@ -1680,7 +1678,6 @@ 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 @@ -1961,7 +1958,6 @@ int gfs2_diradd_alloc_required(struct inode *inode,

dent = gfs2_dirent_search(inode, name, gfs2_dirent_find_space, &bh);
if (!dent) {
brelse(bh);
return 1;
}
if (IS_ERR(dent))
Expand Down
10 changes: 7 additions & 3 deletions fs/gfs2/log.c
Original file line number Diff line number Diff line change
Expand Up @@ -412,11 +412,13 @@ static void log_flush_commit(struct gfs2_sbd *sdp)
struct list_head *head = &sdp->sd_log_flush_list;
struct gfs2_log_buf *lb;
struct buffer_head *bh;
#if 0
unsigned int d;

d = log_distance(sdp, sdp->sd_log_flush_head, sdp->sd_log_head);

gfs2_assert_withdraw(sdp, d + 1 == sdp->sd_log_blks_reserved);
#endif

while (!list_empty(head)) {
lb = list_entry(head->next, struct gfs2_log_buf, lb_list);
Expand Down Expand Up @@ -483,6 +485,7 @@ void gfs2_log_flush(struct gfs2_sbd *sdp, struct gfs2_glock *gl)
sdp->sd_log_head = sdp->sd_log_flush_head;

/* printk(KERN_INFO "sd_log_num_hdrs %u\n", sdp->sd_log_num_hdrs); */
sdp->sd_log_blks_free -= sdp->sd_log_num_hdrs;

sdp->sd_log_blks_reserved =
sdp->sd_log_commited_buf =
Expand Down Expand Up @@ -515,8 +518,7 @@ static void log_refund(struct gfs2_sbd *sdp, struct gfs2_trans *tr)
gfs2_assert_withdraw(sdp, ((int)sdp->sd_log_commited_revoke) >= 0);

if (sdp->sd_log_commited_buf)
reserved += 1 + sdp->sd_log_commited_buf +
sdp->sd_log_commited_buf/503;
reserved += sdp->sd_log_commited_buf;
if (sdp->sd_log_commited_revoke)
reserved += gfs2_struct2blk(sdp, sdp->sd_log_commited_revoke,
sizeof(uint64_t));
Expand All @@ -527,7 +529,8 @@ static void log_refund(struct gfs2_sbd *sdp, struct gfs2_trans *tr)

gfs2_assert_withdraw(sdp, sdp->sd_log_blks_free >= old);
gfs2_assert_withdraw(sdp,
sdp->sd_log_blks_free <= sdp->sd_jdesc->jd_blocks);
sdp->sd_log_blks_free <= sdp->sd_jdesc->jd_blocks +
sdp->sd_log_num_hdrs);

sdp->sd_log_blks_reserved = reserved;

Expand Down Expand Up @@ -582,6 +585,7 @@ void gfs2_log_shutdown(struct gfs2_sbd *sdp)

log_write_header(sdp, GFS2_LOG_HEAD_UNMOUNT, 0);

/* printk(KERN_INFO "sd_log_blks_free %u, sd_jdesc->jd_blocks %u\n", sdp->sd_log_blks_free, sdp->sd_jdesc->jd_blocks); */
gfs2_assert_withdraw(sdp, sdp->sd_log_blks_free ==
sdp->sd_jdesc->jd_blocks);
gfs2_assert_withdraw(sdp, sdp->sd_log_head == sdp->sd_log_tail);
Expand Down
13 changes: 3 additions & 10 deletions fs/gfs2/trans.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ int gfs2_trans_begin(struct gfs2_sbd *sdp, unsigned int blocks,
tr->tr_revokes = revokes;
tr->tr_reserved = 1;
if (blocks)
tr->tr_reserved += 1 + blocks;
tr->tr_reserved += 6 + blocks;
if (revokes)
tr->tr_reserved += gfs2_struct2blk(sdp, revokes,
sizeof(uint64_t));
Expand Down Expand Up @@ -83,20 +83,15 @@ int gfs2_trans_begin(struct gfs2_sbd *sdp, unsigned int blocks,

void gfs2_trans_end(struct gfs2_sbd *sdp)
{
struct gfs2_trans *tr;
struct gfs2_trans *tr = current->journal_info;

tr = current->journal_info;
BUG_ON(!tr);
current->journal_info = NULL;

if (gfs2_assert_warn(sdp, tr))
return;

if (!tr->tr_touched) {
gfs2_log_release(sdp, tr->tr_reserved);

gfs2_glock_dq(&tr->tr_t_gh);
gfs2_holder_uninit(&tr->tr_t_gh);

kfree(tr);
return;
}
Expand All @@ -113,10 +108,8 @@ void gfs2_trans_end(struct gfs2_sbd *sdp)
}

gfs2_log_commit(sdp, tr);

gfs2_glock_dq(&tr->tr_t_gh);
gfs2_holder_uninit(&tr->tr_t_gh);

kfree(tr);

if (sdp->sd_vfs->s_flags & MS_SYNCHRONOUS)
Expand Down

0 comments on commit f4154ea

Please sign in to comment.