[GFS2] Journal extent mapping
This patch saves a little time when gfs2 writes to the journals by keeping a mapping between logical and physical blocks on disk. That's better than constantly looking up indirect pointers in buffers, when the journals are several levels of indirection (which they typically are). Signed-off-by: Bob Peterson <rpeterso@redhat.com> Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
This commit is contained in:
committed by
Steven Whitehouse
parent
e9e1ef2b6e
commit
da6dd40d59
@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
|
||||
* Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved.
|
||||
* Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved.
|
||||
*
|
||||
* This copyrighted material is made available to anyone wishing to use,
|
||||
* modify, copy, or redistribute it subject to the terms and conditions
|
||||
@ -339,18 +339,14 @@ void gfs2_log_release(struct gfs2_sbd *sdp, unsigned int blks)
|
||||
|
||||
static u64 log_bmap(struct gfs2_sbd *sdp, unsigned int lbn)
|
||||
{
|
||||
struct inode *inode = sdp->sd_jdesc->jd_inode;
|
||||
int error;
|
||||
struct buffer_head bh_map = { .b_state = 0, .b_blocknr = 0 };
|
||||
struct gfs2_journal_extent *je;
|
||||
|
||||
bh_map.b_size = 1 << inode->i_blkbits;
|
||||
error = gfs2_block_map(inode, lbn, &bh_map, 0);
|
||||
if (error || !bh_map.b_blocknr)
|
||||
printk(KERN_INFO "error=%d, dbn=%llu lbn=%u", error,
|
||||
(unsigned long long)bh_map.b_blocknr, lbn);
|
||||
gfs2_assert_withdraw(sdp, !error && bh_map.b_blocknr);
|
||||
list_for_each_entry(je, &sdp->sd_jdesc->extent_list, extent_list) {
|
||||
if (lbn >= je->lblock && lbn < je->lblock + je->blocks)
|
||||
return je->dblock + lbn;
|
||||
}
|
||||
|
||||
return bh_map.b_blocknr;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user