2005-04-17 02:20:36 +04:00
# include <linux/buffer_head.h>
# include "minix.h"
enum { DIRECT = 7 , DEPTH = 4 } ; /* Have triple indirect */
typedef u32 block_t ; /* 32 bit, host order */
static inline unsigned long block_to_cpu ( block_t n )
{
return n ;
}
static inline block_t cpu_to_block ( unsigned long n )
{
return n ;
}
static inline block_t * i_data ( struct inode * inode )
{
return ( block_t * ) minix_i ( inode ) - > u . i2_data ;
}
2010-05-26 14:03:23 +04:00
# define DIRCOUNT 7
# define INDIRCOUNT(sb) (1 << ((sb)->s_blocksize_bits - 2))
2005-04-17 02:20:36 +04:00
static int block_to_path ( struct inode * inode , long block , int offsets [ DEPTH ] )
{
int n = 0 ;
2007-10-17 10:27:15 +04:00
char b [ BDEVNAME_SIZE ] ;
2007-02-12 11:52:49 +03:00
struct super_block * sb = inode - > i_sb ;
2005-04-17 02:20:36 +04:00
if ( block < 0 ) {
2007-10-17 10:27:15 +04:00
printk ( " MINIX-fs: block_to_path: block %ld < 0 on dev %s \n " ,
block , bdevname ( sb - > s_bdev , b ) ) ;
2012-07-31 01:42:00 +04:00
} else if ( ( u64 ) block * ( u64 ) sb - > s_blocksize > =
minix_sb ( sb ) - > s_max_size ) {
2007-10-17 10:27:15 +04:00
if ( printk_ratelimit ( ) )
printk ( " MINIX-fs: block_to_path: "
" block %ld too big on dev %s \n " ,
block , bdevname ( sb - > s_bdev , b ) ) ;
2010-05-26 14:03:23 +04:00
} else if ( block < DIRCOUNT ) {
2005-04-17 02:20:36 +04:00
offsets [ n + + ] = block ;
2010-05-26 14:03:23 +04:00
} else if ( ( block - = DIRCOUNT ) < INDIRCOUNT ( sb ) ) {
offsets [ n + + ] = DIRCOUNT ;
2005-04-17 02:20:36 +04:00
offsets [ n + + ] = block ;
2010-05-26 14:03:23 +04:00
} else if ( ( block - = INDIRCOUNT ( sb ) ) < INDIRCOUNT ( sb ) * INDIRCOUNT ( sb ) ) {
offsets [ n + + ] = DIRCOUNT + 1 ;
offsets [ n + + ] = block / INDIRCOUNT ( sb ) ;
offsets [ n + + ] = block % INDIRCOUNT ( sb ) ;
2005-04-17 02:20:36 +04:00
} else {
2010-05-26 14:03:23 +04:00
block - = INDIRCOUNT ( sb ) * INDIRCOUNT ( sb ) ;
offsets [ n + + ] = DIRCOUNT + 2 ;
offsets [ n + + ] = ( block / INDIRCOUNT ( sb ) ) / INDIRCOUNT ( sb ) ;
offsets [ n + + ] = ( block / INDIRCOUNT ( sb ) ) % INDIRCOUNT ( sb ) ;
offsets [ n + + ] = block % INDIRCOUNT ( sb ) ;
2005-04-17 02:20:36 +04:00
}
return n ;
}
# include "itree_common.c"
int V2_minix_get_block ( struct inode * inode , long block ,
struct buffer_head * bh_result , int create )
{
return get_block ( inode , block , bh_result , create ) ;
}
void V2_minix_truncate ( struct inode * inode )
{
truncate ( inode ) ;
}
2007-02-12 11:52:49 +03:00
unsigned V2_minix_blocks ( loff_t size , struct super_block * sb )
2005-04-17 02:20:36 +04:00
{
2007-02-12 11:52:49 +03:00
return nblocks ( size , sb ) ;
2005-04-17 02:20:36 +04:00
}