Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 89515
b: refs/heads/master
c: 30cbf18
h: refs/heads/master
i:
  89513: c0c4aa5
  89511: 29303e4
v: v3
  • Loading branch information
Steven Whitehouse committed Mar 31, 2008
1 parent fc1dc48 commit 3dd7207
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 17 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: c85a665f064863cc8a2fe88e5f1eb4def5446e90
refs/heads/master: 30cbf189cd2a1ba13ff3c8c8ee2103dbdb18578a
68 changes: 52 additions & 16 deletions trunk/fs/gfs2/bmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -422,6 +422,42 @@ static void release_metapath(struct metapath *mp)
brelse(mp->mp_bh[i]);
}

/**
* gfs2_extent_length - Returns length of an extent of blocks
* @start: Start of the buffer
* @len: Length of the buffer in bytes
* @ptr: Current position in the buffer
* @limit: Max extent length to return (0 = unlimited)
* @eob: Set to 1 if we hit "end of block"
*
* If the first block is zero (unallocated) it will return the number of
* unallocated blocks in the extent, otherwise it will return the number
* of contiguous blocks in the extent.
*
* Returns: The length of the extent (minimum of one block)
*/

static inline unsigned int gfs2_extent_length(void *start, unsigned int len, __be64 *ptr, unsigned limit, int *eob)
{
const __be64 *end = (start + len);
const __be64 *first = ptr;
u64 d = be64_to_cpu(*ptr);

*eob = 0;
do {
ptr++;
if (ptr >= end)
break;
if (limit && --limit == 0)
break;
if (d)
d++;
} while(be64_to_cpu(*ptr) == d);
if (ptr >= end)
*eob = 1;
return (ptr - first);
}

static inline void bmap_lock(struct inode *inode, int create)
{
struct gfs2_inode *ip = GFS2_I(inode);
Expand Down Expand Up @@ -499,26 +535,26 @@ int gfs2_block_map(struct inode *inode, sector_t lblock,
goto out_fail;
boundary = error;

if (new) {
map_bh(bh_map, inode->i_sb, dblock);
if (boundary)
set_buffer_boundary(bh_map);
gfs2_trans_add_bh(ip->i_gl, mp.mp_bh[0], 1);
gfs2_dinode_out(ip, mp.mp_bh[0]->b_data);
set_buffer_new(bh_map);
goto out_ok;
}

if (dblock) {
unsigned int len;
struct buffer_head *bh = mp.mp_bh[ip->i_height - 1];
__be64 *ptr = metapointer(&boundary, ip->i_height - 1, &mp);
map_bh(bh_map, inode->i_sb, dblock);
len = gfs2_extent_length(bh->b_data, bh->b_size, ptr, maxlen,
&boundary);
bh_map->b_size = (len << inode->i_blkbits);
if (boundary)
set_buffer_boundary(bh_map);
if (new) {
gfs2_trans_add_bh(ip->i_gl, mp.mp_bh[0], 1);
gfs2_dinode_out(ip, mp.mp_bh[0]->b_data);
set_buffer_new(bh_map);
goto out_ok;
}
while(--maxlen && !buffer_boundary(bh_map)) {
u64 eblock;
mp.mp_list[ip->i_height - 1]++;
boundary = lookup_block(ip, ip->i_height - 1, &mp, 0, &new, &eblock);
if (eblock != ++dblock)
break;
bh_map->b_size += (1 << inode->i_blkbits);
if (boundary)
set_buffer_boundary(bh_map);
}
}
out_ok:
error = 0;
Expand Down

0 comments on commit 3dd7207

Please sign in to comment.