Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 292377
b: refs/heads/master
c: 7cd916f
h: refs/heads/master
i:
  292375: 7ad42fd
v: v3
  • Loading branch information
Al Viro committed Mar 21, 2012
1 parent 52df9d9 commit e06b9fa
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 9 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: 8f82ecae53347ec65721e1c0683c3f26647e3c97
refs/heads/master: 7cd916f6ea86e8538b1e8136847dfb941813fe94
23 changes: 15 additions & 8 deletions trunk/fs/qnx4/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -66,23 +66,31 @@ static int qnx4_get_block( struct inode *inode, sector_t iblock, struct buffer_h
return 0;
}

static inline u32 try_extent(qnx4_xtnt_t *extent, u32 *offset)
{
u32 size = le32_to_cpu(extent->xtnt_size);
if (*offset < size)
return le32_to_cpu(extent->xtnt_blk) + *offset - 1;
*offset -= size;
return 0;
}

unsigned long qnx4_block_map( struct inode *inode, long iblock )
{
int ix;
long offset, i_xblk;
unsigned long block = 0;
long i_xblk;
struct buffer_head *bh = NULL;
struct qnx4_xblk *xblk = NULL;
struct qnx4_inode_entry *qnx4_inode = qnx4_raw_inode(inode);
u16 nxtnt = le16_to_cpu(qnx4_inode->di_num_xtnts);
u32 offset = iblock;
u32 block = try_extent(&qnx4_inode->di_first_xtnt, &offset);

if ( iblock < le32_to_cpu(qnx4_inode->di_first_xtnt.xtnt_size) ) {
if (block) {
// iblock is in the first extent. This is easy.
block = le32_to_cpu(qnx4_inode->di_first_xtnt.xtnt_blk) + iblock - 1;
} else {
// iblock is beyond first extent. We have to follow the extent chain.
i_xblk = le32_to_cpu(qnx4_inode->di_xblk);
offset = iblock - le32_to_cpu(qnx4_inode->di_first_xtnt.xtnt_size);
ix = 0;
while ( --nxtnt > 0 ) {
if ( ix == 0 ) {
Expand All @@ -98,12 +106,11 @@ unsigned long qnx4_block_map( struct inode *inode, long iblock )
return -EIO;
}
}
if ( offset < le32_to_cpu(xblk->xblk_xtnts[ix].xtnt_size) ) {
block = try_extent(&xblk->xblk_xtnts[ix], &offset);
if (block) {
// got it!
block = le32_to_cpu(xblk->xblk_xtnts[ix].xtnt_blk) + offset - 1;
break;
}
offset -= le32_to_cpu(xblk->xblk_xtnts[ix].xtnt_size);
if ( ++ix >= xblk->xblk_num_xtnts ) {
i_xblk = le32_to_cpu(xblk->xblk_next_xblk);
ix = 0;
Expand Down

0 comments on commit e06b9fa

Please sign in to comment.