| 412 | } |
| 413 | |
| 414 | BOOLEAN |
| 415 | Ext2GetInodeLba ( |
| 416 | IN PEXT2_VCB Vcb, |
| 417 | IN ULONG inode, |
| 418 | OUT PLONGLONG offset |
| 419 | ) |
| 420 | { |
| 421 | PEXT2_GROUP_DESC gd; |
| 422 | struct buffer_head *bh = NULL; |
| 423 | ext4_fsblk_t loc; |
| 424 | int group; |
| 425 | |
| 426 | if (inode < 1 || inode > INODES_COUNT) { |
| 427 | DEBUG(DL_ERR, ( "Ext2GetInodeLba: Inode value %xh is invalid.\n",inode)); |
| 428 | *offset = 0; |
| 429 | return FALSE; |
| 430 | } |
| 431 | |
| 432 | group = (inode - 1) / INODES_PER_GROUP ; |
| 433 | gd = ext4_get_group_desc(&Vcb->sb, group, &bh); |
| 434 | if (!bh) { |
| 435 | *offset = 0; |
| 436 | DbgBreak(); |
| 437 | return FALSE; |
| 438 | } |
| 439 | loc = (LONGLONG)ext4_inode_table(&Vcb->sb, gd); |
| 440 | loc = loc << BLOCK_BITS; |
| 441 | loc = loc + ((inode - 1) % INODES_PER_GROUP) * Vcb->InodeSize; |
| 442 | |
| 443 | *offset = loc; |
| 444 | __brelse(bh); |
| 445 | |
| 446 | return TRUE; |
| 447 | } |
| 448 | |
| 449 | void Ext2DecodeInode(struct inode *dst, struct ext4_inode *src) |
| 450 | { |
no test coverage detected