2 * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
3 * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved.
5 * This copyrighted material is made available to anyone wishing to use,
6 * modify, copy, or redistribute it subject to the terms and conditions
7 * of the GNU General Public License version 2.
10 #include <linux/slab.h>
11 #include <linux/spinlock.h>
12 #include <linux/completion.h>
13 #include <linux/buffer_head.h>
16 #include <linux/gfs2_ondisk.h>
17 #include <linux/lm_interface.h>
20 #define pv(struct, member, fmt) printk(KERN_INFO " "#member" = "fmt"\n", \
24 * gfs2_xxx_in - read in an xxx struct
25 * first arg: the cpu-order structure
26 * buf: the disk-order buffer
28 * gfs2_xxx_out - write out an xxx struct
29 * first arg: the cpu-order structure
30 * buf: the disk-order buffer
32 * gfs2_xxx_print - print out an xxx struct
33 * first arg: the cpu-order structure
36 void gfs2_inum_in(struct gfs2_inum_host
*no
, const void *buf
)
38 const struct gfs2_inum
*str
= buf
;
40 no
->no_formal_ino
= be64_to_cpu(str
->no_formal_ino
);
41 no
->no_addr
= be64_to_cpu(str
->no_addr
);
44 void gfs2_inum_out(const struct gfs2_inum_host
*no
, void *buf
)
46 struct gfs2_inum
*str
= buf
;
48 str
->no_formal_ino
= cpu_to_be64(no
->no_formal_ino
);
49 str
->no_addr
= cpu_to_be64(no
->no_addr
);
52 static void gfs2_inum_print(const struct gfs2_inum_host
*no
)
54 printk(KERN_INFO
" no_formal_ino = %llu\n", (unsigned long long)no
->no_formal_ino
);
55 printk(KERN_INFO
" no_addr = %llu\n", (unsigned long long)no
->no_addr
);
58 static void gfs2_meta_header_in(struct gfs2_meta_header_host
*mh
, const void *buf
)
60 const struct gfs2_meta_header
*str
= buf
;
62 mh
->mh_magic
= be32_to_cpu(str
->mh_magic
);
63 mh
->mh_type
= be32_to_cpu(str
->mh_type
);
64 mh
->mh_format
= be32_to_cpu(str
->mh_format
);
67 void gfs2_sb_in(struct gfs2_sb_host
*sb
, const void *buf
)
69 const struct gfs2_sb
*str
= buf
;
71 gfs2_meta_header_in(&sb
->sb_header
, buf
);
73 sb
->sb_fs_format
= be32_to_cpu(str
->sb_fs_format
);
74 sb
->sb_multihost_format
= be32_to_cpu(str
->sb_multihost_format
);
75 sb
->sb_bsize
= be32_to_cpu(str
->sb_bsize
);
76 sb
->sb_bsize_shift
= be32_to_cpu(str
->sb_bsize_shift
);
78 gfs2_inum_in(&sb
->sb_master_dir
, (char *)&str
->sb_master_dir
);
79 gfs2_inum_in(&sb
->sb_root_dir
, (char *)&str
->sb_root_dir
);
81 memcpy(sb
->sb_lockproto
, str
->sb_lockproto
, GFS2_LOCKNAME_LEN
);
82 memcpy(sb
->sb_locktable
, str
->sb_locktable
, GFS2_LOCKNAME_LEN
);
85 void gfs2_rindex_in(struct gfs2_rindex_host
*ri
, const void *buf
)
87 const struct gfs2_rindex
*str
= buf
;
89 ri
->ri_addr
= be64_to_cpu(str
->ri_addr
);
90 ri
->ri_length
= be32_to_cpu(str
->ri_length
);
91 ri
->ri_data0
= be64_to_cpu(str
->ri_data0
);
92 ri
->ri_data
= be32_to_cpu(str
->ri_data
);
93 ri
->ri_bitbytes
= be32_to_cpu(str
->ri_bitbytes
);
97 void gfs2_rindex_print(const struct gfs2_rindex_host
*ri
)
99 printk(KERN_INFO
" ri_addr = %llu\n", (unsigned long long)ri
->ri_addr
);
100 pv(ri
, ri_length
, "%u");
102 printk(KERN_INFO
" ri_data0 = %llu\n", (unsigned long long)ri
->ri_data0
);
103 pv(ri
, ri_data
, "%u");
105 pv(ri
, ri_bitbytes
, "%u");
108 void gfs2_rgrp_in(struct gfs2_rgrp_host
*rg
, const void *buf
)
110 const struct gfs2_rgrp
*str
= buf
;
112 rg
->rg_flags
= be32_to_cpu(str
->rg_flags
);
113 rg
->rg_free
= be32_to_cpu(str
->rg_free
);
114 rg
->rg_dinodes
= be32_to_cpu(str
->rg_dinodes
);
115 rg
->rg_igeneration
= be64_to_cpu(str
->rg_igeneration
);
118 void gfs2_rgrp_out(const struct gfs2_rgrp_host
*rg
, void *buf
)
120 struct gfs2_rgrp
*str
= buf
;
122 str
->rg_flags
= cpu_to_be32(rg
->rg_flags
);
123 str
->rg_free
= cpu_to_be32(rg
->rg_free
);
124 str
->rg_dinodes
= cpu_to_be32(rg
->rg_dinodes
);
125 str
->__pad
= cpu_to_be32(0);
126 str
->rg_igeneration
= cpu_to_be64(rg
->rg_igeneration
);
127 memset(&str
->rg_reserved
, 0, sizeof(str
->rg_reserved
));
130 void gfs2_quota_in(struct gfs2_quota_host
*qu
, const void *buf
)
132 const struct gfs2_quota
*str
= buf
;
134 qu
->qu_limit
= be64_to_cpu(str
->qu_limit
);
135 qu
->qu_warn
= be64_to_cpu(str
->qu_warn
);
136 qu
->qu_value
= be64_to_cpu(str
->qu_value
);
139 void gfs2_dinode_out(const struct gfs2_inode
*ip
, void *buf
)
141 const struct gfs2_dinode_host
*di
= &ip
->i_di
;
142 struct gfs2_dinode
*str
= buf
;
144 str
->di_header
.mh_magic
= cpu_to_be32(GFS2_MAGIC
);
145 str
->di_header
.mh_type
= cpu_to_be32(GFS2_METATYPE_DI
);
146 str
->di_header
.__pad0
= 0;
147 str
->di_header
.mh_format
= cpu_to_be32(GFS2_FORMAT_DI
);
148 str
->di_header
.__pad1
= 0;
150 gfs2_inum_out(&ip
->i_num
, &str
->di_num
);
152 str
->di_mode
= cpu_to_be32(ip
->i_inode
.i_mode
);
153 str
->di_uid
= cpu_to_be32(ip
->i_inode
.i_uid
);
154 str
->di_gid
= cpu_to_be32(ip
->i_inode
.i_gid
);
155 str
->di_nlink
= cpu_to_be32(ip
->i_inode
.i_nlink
);
156 str
->di_size
= cpu_to_be64(di
->di_size
);
157 str
->di_blocks
= cpu_to_be64(di
->di_blocks
);
158 str
->di_atime
= cpu_to_be64(ip
->i_inode
.i_atime
.tv_sec
);
159 str
->di_mtime
= cpu_to_be64(ip
->i_inode
.i_mtime
.tv_sec
);
160 str
->di_ctime
= cpu_to_be64(ip
->i_inode
.i_ctime
.tv_sec
);
162 str
->di_goal_meta
= cpu_to_be64(di
->di_goal_meta
);
163 str
->di_goal_data
= cpu_to_be64(di
->di_goal_data
);
164 str
->di_generation
= cpu_to_be64(di
->di_generation
);
166 str
->di_flags
= cpu_to_be32(di
->di_flags
);
167 str
->di_height
= cpu_to_be16(di
->di_height
);
168 str
->di_payload_format
= cpu_to_be32(S_ISDIR(ip
->i_inode
.i_mode
) &&
169 !(ip
->i_di
.di_flags
& GFS2_DIF_EXHASH
) ?
171 str
->di_depth
= cpu_to_be16(di
->di_depth
);
172 str
->di_entries
= cpu_to_be32(di
->di_entries
);
174 str
->di_eattr
= cpu_to_be64(di
->di_eattr
);
177 void gfs2_dinode_print(const struct gfs2_inode
*ip
)
179 const struct gfs2_dinode_host
*di
= &ip
->i_di
;
181 gfs2_inum_print(&ip
->i_num
);
183 printk(KERN_INFO
" di_size = %llu\n", (unsigned long long)di
->di_size
);
184 printk(KERN_INFO
" di_blocks = %llu\n", (unsigned long long)di
->di_blocks
);
185 printk(KERN_INFO
" di_goal_meta = %llu\n", (unsigned long long)di
->di_goal_meta
);
186 printk(KERN_INFO
" di_goal_data = %llu\n", (unsigned long long)di
->di_goal_data
);
188 pv(di
, di_flags
, "0x%.8X");
189 pv(di
, di_height
, "%u");
191 pv(di
, di_depth
, "%u");
192 pv(di
, di_entries
, "%u");
194 printk(KERN_INFO
" di_eattr = %llu\n", (unsigned long long)di
->di_eattr
);
197 void gfs2_log_header_in(struct gfs2_log_header_host
*lh
, const void *buf
)
199 const struct gfs2_log_header
*str
= buf
;
201 gfs2_meta_header_in(&lh
->lh_header
, buf
);
202 lh
->lh_sequence
= be64_to_cpu(str
->lh_sequence
);
203 lh
->lh_flags
= be32_to_cpu(str
->lh_flags
);
204 lh
->lh_tail
= be32_to_cpu(str
->lh_tail
);
205 lh
->lh_blkno
= be32_to_cpu(str
->lh_blkno
);
206 lh
->lh_hash
= be32_to_cpu(str
->lh_hash
);
209 void gfs2_inum_range_in(struct gfs2_inum_range_host
*ir
, const void *buf
)
211 const struct gfs2_inum_range
*str
= buf
;
213 ir
->ir_start
= be64_to_cpu(str
->ir_start
);
214 ir
->ir_length
= be64_to_cpu(str
->ir_length
);
217 void gfs2_inum_range_out(const struct gfs2_inum_range_host
*ir
, void *buf
)
219 struct gfs2_inum_range
*str
= buf
;
221 str
->ir_start
= cpu_to_be64(ir
->ir_start
);
222 str
->ir_length
= cpu_to_be64(ir
->ir_length
);
225 void gfs2_statfs_change_in(struct gfs2_statfs_change_host
*sc
, const void *buf
)
227 const struct gfs2_statfs_change
*str
= buf
;
229 sc
->sc_total
= be64_to_cpu(str
->sc_total
);
230 sc
->sc_free
= be64_to_cpu(str
->sc_free
);
231 sc
->sc_dinodes
= be64_to_cpu(str
->sc_dinodes
);
234 void gfs2_statfs_change_out(const struct gfs2_statfs_change_host
*sc
, void *buf
)
236 struct gfs2_statfs_change
*str
= buf
;
238 str
->sc_total
= cpu_to_be64(sc
->sc_total
);
239 str
->sc_free
= cpu_to_be64(sc
->sc_free
);
240 str
->sc_dinodes
= cpu_to_be64(sc
->sc_dinodes
);
243 void gfs2_quota_change_in(struct gfs2_quota_change_host
*qc
, const void *buf
)
245 const struct gfs2_quota_change
*str
= buf
;
247 qc
->qc_change
= be64_to_cpu(str
->qc_change
);
248 qc
->qc_flags
= be32_to_cpu(str
->qc_flags
);
249 qc
->qc_id
= be32_to_cpu(str
->qc_id
);