mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-17 09:43:59 +08:00
[GFS2] Update journal accounting code.
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>
This commit is contained in:
parent
ed3865079b
commit
f4154ea039
@ -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);
|
||||
|
||||
@ -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;
|
||||
}
|
||||
@ -1477,7 +1477,6 @@ int gfs2_dir_search(struct inode *dir, const struct qstr *name,
|
||||
brelse(bh);
|
||||
return 0;
|
||||
}
|
||||
brelse(bh);
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -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))
|
||||
|
@ -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);
|
||||
@ -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 =
|
||||
@ -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));
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
@ -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));
|
||||
@ -83,20 +83,15 @@ fail_holder_uninit:
|
||||
|
||||
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;
|
||||
}
|
||||
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user