2005-04-16 15:20:36 -07:00
/*
* linux / fs / befs / io . c
*
* Copyright ( C ) 2001 Will Dyson < will_dyson @ pobox . com
*
2016-08-14 17:32:33 +01:00
* Based on portions of file . c and inode . c
2005-04-16 15:20:36 -07:00
* 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
2016-08-14 18:41:30 +01:00
* the offset .
2005-04-16 15:20:36 -07:00
*/
struct buffer_head *
befs_bread_iaddr ( struct super_block * sb , befs_inode_addr iaddr )
{
2016-05-23 16:22:52 -07:00
struct buffer_head * bh ;
2016-08-11 12:04:52 +01:00
befs_blocknr_t block ;
2015-04-16 12:46:20 -07:00
struct befs_sb_info * befs_sb = BEFS_SB ( sb ) ;
2005-04-16 15:20:36 -07:00
2014-04-03 14:50:23 -07:00
befs_debug ( sb , " ---> Enter %s "
" [%u, %hu, %hu] " , __func__ , iaddr . allocation_group ,
iaddr . start , iaddr . len ) ;
2005-04-16 15:20:36 -07: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-03 14:50:23 -07:00
befs_debug ( sb , " %s: offset = %lu " , __func__ , ( unsigned long ) block ) ;
2005-04-16 15:20:36 -07:00
bh = sb_bread ( sb , block ) ;
if ( bh = = NULL ) {
2014-04-03 14:50:23 -07:00
befs_error ( sb , " Failed to read block %lu " ,
( unsigned long ) block ) ;
2005-04-16 15:20:36 -07:00
goto error ;
}
2014-04-03 14:50:23 -07:00
befs_debug ( sb , " <--- %s " , __func__ ) ;
2005-04-16 15:20:36 -07:00
return bh ;
2016-08-14 17:32:33 +01:00
error :
2014-04-03 14:50:23 -07:00
befs_debug ( sb , " <--- %s ERROR " , __func__ ) ;
2005-04-16 15:20:36 -07:00
return NULL ;
}