2005-04-17 02:20:36 +04:00
/*
* linux / fs / befs / io . c
*
* Copyright ( C ) 2001 Will Dyson < will_dyson @ pobox . com
*
* Based on portions of file . c and inode . c
* by Makoto Kato ( m_kato @ ga2 . so - net . ne . jp )
*
* Many thanks to Dominic Giampaolo , author of Practical File System
* Design with the Be File System , for such a helpful book .
*
*/
# include <linux/buffer_head.h>
# include "befs.h"
# include "io.h"
/*
* Converts befs notion of disk addr to a disk offset and uses
* linux kernel function sb_bread ( ) to get the buffer containing
* the offset . - Will Dyson
*
*/
struct buffer_head *
befs_bread_iaddr ( struct super_block * sb , befs_inode_addr iaddr )
{
2016-05-24 02:22:52 +03:00
struct buffer_head * bh ;
2005-04-17 02:20:36 +04:00
befs_blocknr_t block = 0 ;
2015-04-16 22:46:20 +03:00
struct befs_sb_info * befs_sb = BEFS_SB ( sb ) ;
2005-04-17 02:20:36 +04:00
2014-04-04 01:50:23 +04:00
befs_debug ( sb , " ---> Enter %s "
" [%u, %hu, %hu] " , __func__ , iaddr . allocation_group ,
iaddr . start , iaddr . len ) ;
2005-04-17 02:20:36 +04:00
if ( iaddr . allocation_group > befs_sb - > num_ags ) {
befs_error ( sb , " BEFS: Invalid allocation group %u, max is %u " ,
iaddr . allocation_group , befs_sb - > num_ags ) ;
goto error ;
}
block = iaddr2blockno ( sb , & iaddr ) ;
2014-04-04 01:50:23 +04:00
befs_debug ( sb , " %s: offset = %lu " , __func__ , ( unsigned long ) block ) ;
2005-04-17 02:20:36 +04:00
bh = sb_bread ( sb , block ) ;
if ( bh = = NULL ) {
2014-04-04 01:50:23 +04:00
befs_error ( sb , " Failed to read block %lu " ,
( unsigned long ) block ) ;
2005-04-17 02:20:36 +04:00
goto error ;
}
2014-04-04 01:50:23 +04:00
befs_debug ( sb , " <--- %s " , __func__ ) ;
2005-04-17 02:20:36 +04:00
return bh ;
error :
2014-04-04 01:50:23 +04:00
befs_debug ( sb , " <--- %s ERROR " , __func__ ) ;
2005-04-17 02:20:36 +04:00
return NULL ;
}