2006-01-16 16:50:04 +00:00
/*
* Copyright ( C ) Sistina Software , Inc . 1997 - 2003 All rights reserved .
2006-05-18 15:09:15 -04:00
* Copyright ( C ) 2004 - 2006 Red Hat , Inc . All rights reserved .
2006-01-16 16:50:04 +00:00
*
* This copyrighted material is made available to anyone wishing to use ,
* modify , copy , or redistribute it subject to the terms and conditions
2006-09-01 11:05:15 -04:00
* of the GNU General Public License version 2.
2006-01-16 16:50:04 +00:00
*/
# include <linux/slab.h>
# include <linux/spinlock.h>
# include <linux/completion.h>
# include <linux/buffer_head.h>
# include "gfs2.h"
# include <linux/gfs2_ondisk.h>
2006-10-31 15:07:05 -05:00
# include <linux/lm_interface.h>
# include "incore.h"
2006-01-16 16:50:04 +00:00
2006-02-27 12:00:42 -05:00
# define pv(struct, member, fmt) printk(KERN_INFO " "#member" = "fmt"\n", \
struct - > member ) ;
2006-01-16 16:50:04 +00:00
/*
* gfs2_xxx_in - read in an xxx struct
* first arg : the cpu - order structure
* buf : the disk - order buffer
*
* gfs2_xxx_out - write out an xxx struct
* first arg : the cpu - order structure
* buf : the disk - order buffer
*
* gfs2_xxx_print - print out an xxx struct
* first arg : the cpu - order structure
*/
2006-10-13 22:51:24 -04:00
void gfs2_inum_in ( struct gfs2_inum_host * no , const void * buf )
2006-01-16 16:50:04 +00:00
{
2006-09-04 14:48:37 -04:00
const struct gfs2_inum * str = buf ;
2006-01-16 16:50:04 +00:00
no - > no_formal_ino = be64_to_cpu ( str - > no_formal_ino ) ;
no - > no_addr = be64_to_cpu ( str - > no_addr ) ;
}
2006-10-13 22:51:24 -04:00
void gfs2_inum_out ( const struct gfs2_inum_host * no , void * buf )
2006-01-16 16:50:04 +00:00
{
2006-09-04 14:48:37 -04:00
struct gfs2_inum * str = buf ;
2006-01-16 16:50:04 +00:00
str - > no_formal_ino = cpu_to_be64 ( no - > no_formal_ino ) ;
str - > no_addr = cpu_to_be64 ( no - > no_addr ) ;
}
2006-10-13 22:51:24 -04:00
static void gfs2_inum_print ( const struct gfs2_inum_host * no )
2006-01-16 16:50:04 +00:00
{
2006-05-24 10:22:09 -04:00
printk ( KERN_INFO " no_formal_ino = %llu \n " , ( unsigned long long ) no - > no_formal_ino ) ;
printk ( KERN_INFO " no_addr = %llu \n " , ( unsigned long long ) no - > no_addr ) ;
2006-01-16 16:50:04 +00:00
}
2006-11-01 10:34:15 -05:00
static void gfs2_meta_header_in ( struct gfs2_meta_header_host * mh , const void * buf )
2006-01-16 16:50:04 +00:00
{
2006-09-04 14:48:37 -04:00
const struct gfs2_meta_header * str = buf ;
2006-01-16 16:50:04 +00:00
mh - > mh_magic = be32_to_cpu ( str - > mh_magic ) ;
2006-03-30 15:46:23 -05:00
mh - > mh_type = be32_to_cpu ( str - > mh_type ) ;
mh - > mh_format = be32_to_cpu ( str - > mh_format ) ;
2006-01-16 16:50:04 +00:00
}
2006-10-13 20:45:02 -04:00
void gfs2_sb_in ( struct gfs2_sb_host * sb , const void * buf )
2006-01-16 16:50:04 +00:00
{
2006-09-04 14:48:37 -04:00
const struct gfs2_sb * str = buf ;
2006-01-16 16:50:04 +00:00
gfs2_meta_header_in ( & sb - > sb_header , buf ) ;
sb - > sb_fs_format = be32_to_cpu ( str - > sb_fs_format ) ;
sb - > sb_multihost_format = be32_to_cpu ( str - > sb_multihost_format ) ;
sb - > sb_bsize = be32_to_cpu ( str - > sb_bsize ) ;
sb - > sb_bsize_shift = be32_to_cpu ( str - > sb_bsize_shift ) ;
gfs2_inum_in ( & sb - > sb_master_dir , ( char * ) & str - > sb_master_dir ) ;
gfs2_inum_in ( & sb - > sb_root_dir , ( char * ) & str - > sb_root_dir ) ;
memcpy ( sb - > sb_lockproto , str - > sb_lockproto , GFS2_LOCKNAME_LEN ) ;
memcpy ( sb - > sb_locktable , str - > sb_locktable , GFS2_LOCKNAME_LEN ) ;
}
2006-10-13 22:51:24 -04:00
void gfs2_rindex_in ( struct gfs2_rindex_host * ri , const void * buf )
2006-01-16 16:50:04 +00:00
{
2006-09-04 14:48:37 -04:00
const struct gfs2_rindex * str = buf ;
2006-01-16 16:50:04 +00:00
ri - > ri_addr = be64_to_cpu ( str - > ri_addr ) ;
ri - > ri_length = be32_to_cpu ( str - > ri_length ) ;
ri - > ri_data0 = be64_to_cpu ( str - > ri_data0 ) ;
ri - > ri_data = be32_to_cpu ( str - > ri_data ) ;
ri - > ri_bitbytes = be32_to_cpu ( str - > ri_bitbytes ) ;
}
2006-10-13 22:51:24 -04:00
void gfs2_rindex_print ( const struct gfs2_rindex_host * ri )
2006-01-16 16:50:04 +00:00
{
2006-05-24 10:22:09 -04:00
printk ( KERN_INFO " ri_addr = %llu \n " , ( unsigned long long ) ri - > ri_addr ) ;
2006-01-16 16:50:04 +00:00
pv ( ri , ri_length , " %u " ) ;
2006-05-24 10:22:09 -04:00
printk ( KERN_INFO " ri_data0 = %llu \n " , ( unsigned long long ) ri - > ri_data0 ) ;
2006-01-16 16:50:04 +00:00
pv ( ri , ri_data , " %u " ) ;
pv ( ri , ri_bitbytes , " %u " ) ;
}
2006-10-13 21:07:22 -04:00
void gfs2_rgrp_in ( struct gfs2_rgrp_host * rg , const void * buf )
2006-01-16 16:50:04 +00:00
{
2006-09-04 14:48:37 -04:00
const struct gfs2_rgrp * str = buf ;
2006-01-16 16:50:04 +00:00
rg - > rg_flags = be32_to_cpu ( str - > rg_flags ) ;
rg - > rg_free = be32_to_cpu ( str - > rg_free ) ;
rg - > rg_dinodes = be32_to_cpu ( str - > rg_dinodes ) ;
2006-07-11 09:46:33 -04:00
rg - > rg_igeneration = be64_to_cpu ( str - > rg_igeneration ) ;
2006-01-16 16:50:04 +00:00
}
2006-10-13 21:07:22 -04:00
void gfs2_rgrp_out ( const struct gfs2_rgrp_host * rg , void * buf )
2006-01-16 16:50:04 +00:00
{
2006-09-04 14:48:37 -04:00
struct gfs2_rgrp * str = buf ;
2006-01-16 16:50:04 +00:00
str - > rg_flags = cpu_to_be32 ( rg - > rg_flags ) ;
str - > rg_free = cpu_to_be32 ( rg - > rg_free ) ;
str - > rg_dinodes = cpu_to_be32 ( rg - > rg_dinodes ) ;
2006-07-11 09:46:33 -04:00
str - > __pad = cpu_to_be32 ( 0 ) ;
str - > rg_igeneration = cpu_to_be64 ( rg - > rg_igeneration ) ;
2006-01-16 16:50:04 +00:00
memset ( & str - > rg_reserved , 0 , sizeof ( str - > rg_reserved ) ) ;
}
2006-10-13 23:31:55 -04:00
void gfs2_quota_in ( struct gfs2_quota_host * qu , const void * buf )
2006-01-16 16:50:04 +00:00
{
2006-09-04 14:48:37 -04:00
const struct gfs2_quota * str = buf ;
2006-01-16 16:50:04 +00:00
qu - > qu_limit = be64_to_cpu ( str - > qu_limit ) ;
qu - > qu_warn = be64_to_cpu ( str - > qu_warn ) ;
qu - > qu_value = be64_to_cpu ( str - > qu_value ) ;
}
2006-10-31 15:07:05 -05:00
void gfs2_dinode_out ( const struct gfs2_inode * ip , void * buf )
2006-01-16 16:50:04 +00:00
{
2006-10-31 15:07:05 -05:00
const struct gfs2_dinode_host * di = & ip - > i_di ;
2006-09-04 14:48:37 -04:00
struct gfs2_dinode * str = buf ;
2006-01-16 16:50:04 +00:00
2006-11-01 10:34:15 -05:00
str - > di_header . mh_magic = cpu_to_be32 ( GFS2_MAGIC ) ;
str - > di_header . mh_type = cpu_to_be32 ( GFS2_METATYPE_DI ) ;
str - > di_header . __pad0 = 0 ;
str - > di_header . mh_format = cpu_to_be32 ( GFS2_FORMAT_DI ) ;
str - > di_header . __pad1 = 0 ;
gfs2_inum_out ( & ip - > i_num , & str - > di_num ) ;
2006-01-16 16:50:04 +00:00
2006-11-01 12:22:46 -05:00
str - > di_mode = cpu_to_be32 ( ip - > i_inode . i_mode ) ;
2006-11-01 13:23:29 -05:00
str - > di_uid = cpu_to_be32 ( ip - > i_inode . i_uid ) ;
str - > di_gid = cpu_to_be32 ( ip - > i_inode . i_gid ) ;
2006-11-01 14:04:17 -05:00
str - > di_nlink = cpu_to_be32 ( ip - > i_inode . i_nlink ) ;
2006-01-16 16:50:04 +00:00
str - > di_size = cpu_to_be64 ( di - > di_size ) ;
str - > di_blocks = cpu_to_be64 ( di - > di_blocks ) ;
2006-11-01 14:35:17 -05:00
str - > di_atime = cpu_to_be64 ( ip - > i_inode . i_atime . tv_sec ) ;
str - > di_mtime = cpu_to_be64 ( ip - > i_inode . i_mtime . tv_sec ) ;
str - > di_ctime = cpu_to_be64 ( ip - > i_inode . i_ctime . tv_sec ) ;
2006-01-16 16:50:04 +00:00
str - > di_goal_meta = cpu_to_be64 ( di - > di_goal_meta ) ;
str - > di_goal_data = cpu_to_be64 ( di - > di_goal_data ) ;
2006-07-11 09:46:33 -04:00
str - > di_generation = cpu_to_be64 ( di - > di_generation ) ;
2006-01-16 16:50:04 +00:00
str - > di_flags = cpu_to_be32 ( di - > di_flags ) ;
str - > di_height = cpu_to_be16 ( di - > di_height ) ;
2006-11-01 20:09:14 -05:00
str - > di_payload_format = cpu_to_be32 ( S_ISDIR ( ip - > i_inode . i_mode ) & &
! ( ip - > i_di . di_flags & GFS2_DIF_EXHASH ) ?
GFS2_FORMAT_DE : 0 ) ;
2006-01-16 16:50:04 +00:00
str - > di_depth = cpu_to_be16 ( di - > di_depth ) ;
str - > di_entries = cpu_to_be32 ( di - > di_entries ) ;
str - > di_eattr = cpu_to_be64 ( di - > di_eattr ) ;
}
2006-10-31 19:00:24 -05:00
void gfs2_dinode_print ( const struct gfs2_inode * ip )
2006-01-16 16:50:04 +00:00
{
2006-10-31 19:00:24 -05:00
const struct gfs2_dinode_host * di = & ip - > i_di ;
2006-11-01 10:34:15 -05:00
gfs2_inum_print ( & ip - > i_num ) ;
2006-01-16 16:50:04 +00:00
2006-05-24 10:22:09 -04:00
printk ( KERN_INFO " di_size = %llu \n " , ( unsigned long long ) di - > di_size ) ;
printk ( KERN_INFO " di_blocks = %llu \n " , ( unsigned long long ) di - > di_blocks ) ;
printk ( KERN_INFO " di_goal_meta = %llu \n " , ( unsigned long long ) di - > di_goal_meta ) ;
printk ( KERN_INFO " di_goal_data = %llu \n " , ( unsigned long long ) di - > di_goal_data ) ;
2006-01-16 16:50:04 +00:00
pv ( di , di_flags , " 0x%.8X " ) ;
pv ( di , di_height , " %u " ) ;
pv ( di , di_depth , " %u " ) ;
pv ( di , di_entries , " %u " ) ;
2006-05-24 10:22:09 -04:00
printk ( KERN_INFO " di_eattr = %llu \n " , ( unsigned long long ) di - > di_eattr ) ;
2006-01-16 16:50:04 +00:00
}
2006-10-13 21:47:13 -04:00
void gfs2_log_header_in ( struct gfs2_log_header_host * lh , const void * buf )
2006-01-16 16:50:04 +00:00
{
2006-09-04 14:48:37 -04:00
const struct gfs2_log_header * str = buf ;
2006-01-16 16:50:04 +00:00
gfs2_meta_header_in ( & lh - > lh_header , buf ) ;
lh - > lh_sequence = be64_to_cpu ( str - > lh_sequence ) ;
lh - > lh_flags = be32_to_cpu ( str - > lh_flags ) ;
lh - > lh_tail = be32_to_cpu ( str - > lh_tail ) ;
lh - > lh_blkno = be32_to_cpu ( str - > lh_blkno ) ;
lh - > lh_hash = be32_to_cpu ( str - > lh_hash ) ;
}
2006-10-13 21:29:46 -04:00
void gfs2_inum_range_in ( struct gfs2_inum_range_host * ir , const void * buf )
2006-01-16 16:50:04 +00:00
{
2006-09-04 14:48:37 -04:00
const struct gfs2_inum_range * str = buf ;
2006-01-16 16:50:04 +00:00
ir - > ir_start = be64_to_cpu ( str - > ir_start ) ;
ir - > ir_length = be64_to_cpu ( str - > ir_length ) ;
}
2006-10-13 21:29:46 -04:00
void gfs2_inum_range_out ( const struct gfs2_inum_range_host * ir , void * buf )
2006-01-16 16:50:04 +00:00
{
2006-09-04 14:48:37 -04:00
struct gfs2_inum_range * str = buf ;
2006-01-16 16:50:04 +00:00
str - > ir_start = cpu_to_be64 ( ir - > ir_start ) ;
str - > ir_length = cpu_to_be64 ( ir - > ir_length ) ;
}
2006-10-13 23:43:19 -04:00
void gfs2_statfs_change_in ( struct gfs2_statfs_change_host * sc , const void * buf )
2006-01-16 16:50:04 +00:00
{
2006-09-04 14:48:37 -04:00
const struct gfs2_statfs_change * str = buf ;
2006-01-16 16:50:04 +00:00
sc - > sc_total = be64_to_cpu ( str - > sc_total ) ;
sc - > sc_free = be64_to_cpu ( str - > sc_free ) ;
sc - > sc_dinodes = be64_to_cpu ( str - > sc_dinodes ) ;
}
2006-10-13 23:43:19 -04:00
void gfs2_statfs_change_out ( const struct gfs2_statfs_change_host * sc , void * buf )
2006-01-16 16:50:04 +00:00
{
2006-09-04 14:48:37 -04:00
struct gfs2_statfs_change * str = buf ;
2006-01-16 16:50:04 +00:00
str - > sc_total = cpu_to_be64 ( sc - > sc_total ) ;
str - > sc_free = cpu_to_be64 ( sc - > sc_free ) ;
str - > sc_dinodes = cpu_to_be64 ( sc - > sc_dinodes ) ;
}
2006-10-13 23:46:46 -04:00
void gfs2_quota_change_in ( struct gfs2_quota_change_host * qc , const void * buf )
2006-01-16 16:50:04 +00:00
{
2006-09-04 14:48:37 -04:00
const struct gfs2_quota_change * str = buf ;
2006-01-16 16:50:04 +00:00
qc - > qc_change = be64_to_cpu ( str - > qc_change ) ;
qc - > qc_flags = be32_to_cpu ( str - > qc_flags ) ;
qc - > qc_id = be32_to_cpu ( str - > qc_id ) ;
}