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/sched.h>
11 #include <linux/slab.h>
12 #include <linux/spinlock.h>
13 #include <linux/completion.h>
14 #include <linux/buffer_head.h>
17 #include <linux/gfs2_ondisk.h>
19 #define pv(struct, member, fmt) printk(KERN_INFO " "#member" = "fmt"\n", \
23 * gfs2_xxx_in - read in an xxx struct
24 * first arg: the cpu-order structure
25 * buf: the disk-order buffer
27 * gfs2_xxx_out - write out an xxx struct
28 * first arg: the cpu-order structure
29 * buf: the disk-order buffer
31 * gfs2_xxx_print - print out an xxx struct
32 * first arg: the cpu-order structure
35 void gfs2_inum_in(struct gfs2_inum
*no
, const void *buf
)
37 const struct gfs2_inum
*str
= buf
;
39 no
->no_formal_ino
= be64_to_cpu(str
->no_formal_ino
);
40 no
->no_addr
= be64_to_cpu(str
->no_addr
);
43 void gfs2_inum_out(const struct gfs2_inum
*no
, void *buf
)
45 struct gfs2_inum
*str
= buf
;
47 str
->no_formal_ino
= cpu_to_be64(no
->no_formal_ino
);
48 str
->no_addr
= cpu_to_be64(no
->no_addr
);
51 static void gfs2_inum_print(const struct gfs2_inum
*no
)
53 printk(KERN_INFO
" no_formal_ino = %llu\n", (unsigned long long)no
->no_formal_ino
);
54 printk(KERN_INFO
" no_addr = %llu\n", (unsigned long long)no
->no_addr
);
57 static void gfs2_meta_header_in(struct gfs2_meta_header
*mh
, const void *buf
)
59 const struct gfs2_meta_header
*str
= buf
;
61 mh
->mh_magic
= be32_to_cpu(str
->mh_magic
);
62 mh
->mh_type
= be32_to_cpu(str
->mh_type
);
63 mh
->mh_format
= be32_to_cpu(str
->mh_format
);
66 static void gfs2_meta_header_out(const struct gfs2_meta_header
*mh
, void *buf
)
68 struct gfs2_meta_header
*str
= buf
;
70 str
->mh_magic
= cpu_to_be32(mh
->mh_magic
);
71 str
->mh_type
= cpu_to_be32(mh
->mh_type
);
72 str
->mh_format
= cpu_to_be32(mh
->mh_format
);
75 static void gfs2_meta_header_print(const struct gfs2_meta_header
*mh
)
77 pv(mh
, mh_magic
, "0x%.8X");
78 pv(mh
, mh_type
, "%u");
79 pv(mh
, mh_format
, "%u");
82 void gfs2_sb_in(struct gfs2_sb
*sb
, const void *buf
)
84 const struct gfs2_sb
*str
= buf
;
86 gfs2_meta_header_in(&sb
->sb_header
, buf
);
88 sb
->sb_fs_format
= be32_to_cpu(str
->sb_fs_format
);
89 sb
->sb_multihost_format
= be32_to_cpu(str
->sb_multihost_format
);
90 sb
->sb_bsize
= be32_to_cpu(str
->sb_bsize
);
91 sb
->sb_bsize_shift
= be32_to_cpu(str
->sb_bsize_shift
);
93 gfs2_inum_in(&sb
->sb_master_dir
, (char *)&str
->sb_master_dir
);
94 gfs2_inum_in(&sb
->sb_root_dir
, (char *)&str
->sb_root_dir
);
96 memcpy(sb
->sb_lockproto
, str
->sb_lockproto
, GFS2_LOCKNAME_LEN
);
97 memcpy(sb
->sb_locktable
, str
->sb_locktable
, GFS2_LOCKNAME_LEN
);
100 void gfs2_rindex_in(struct gfs2_rindex
*ri
, const void *buf
)
102 const struct gfs2_rindex
*str
= buf
;
104 ri
->ri_addr
= be64_to_cpu(str
->ri_addr
);
105 ri
->ri_length
= be32_to_cpu(str
->ri_length
);
106 ri
->ri_data0
= be64_to_cpu(str
->ri_data0
);
107 ri
->ri_data
= be32_to_cpu(str
->ri_data
);
108 ri
->ri_bitbytes
= be32_to_cpu(str
->ri_bitbytes
);
112 void gfs2_rindex_print(const struct gfs2_rindex
*ri
)
114 printk(KERN_INFO
" ri_addr = %llu\n", (unsigned long long)ri
->ri_addr
);
115 pv(ri
, ri_length
, "%u");
117 printk(KERN_INFO
" ri_data0 = %llu\n", (unsigned long long)ri
->ri_data0
);
118 pv(ri
, ri_data
, "%u");
120 pv(ri
, ri_bitbytes
, "%u");
123 void gfs2_rgrp_in(struct gfs2_rgrp
*rg
, const void *buf
)
125 const struct gfs2_rgrp
*str
= buf
;
127 gfs2_meta_header_in(&rg
->rg_header
, buf
);
128 rg
->rg_flags
= be32_to_cpu(str
->rg_flags
);
129 rg
->rg_free
= be32_to_cpu(str
->rg_free
);
130 rg
->rg_dinodes
= be32_to_cpu(str
->rg_dinodes
);
131 rg
->rg_igeneration
= be64_to_cpu(str
->rg_igeneration
);
134 void gfs2_rgrp_out(const struct gfs2_rgrp
*rg
, void *buf
)
136 struct gfs2_rgrp
*str
= buf
;
138 gfs2_meta_header_out(&rg
->rg_header
, buf
);
139 str
->rg_flags
= cpu_to_be32(rg
->rg_flags
);
140 str
->rg_free
= cpu_to_be32(rg
->rg_free
);
141 str
->rg_dinodes
= cpu_to_be32(rg
->rg_dinodes
);
142 str
->__pad
= cpu_to_be32(0);
143 str
->rg_igeneration
= cpu_to_be64(rg
->rg_igeneration
);
144 memset(&str
->rg_reserved
, 0, sizeof(str
->rg_reserved
));
147 void gfs2_quota_in(struct gfs2_quota
*qu
, const void *buf
)
149 const struct gfs2_quota
*str
= buf
;
151 qu
->qu_limit
= be64_to_cpu(str
->qu_limit
);
152 qu
->qu_warn
= be64_to_cpu(str
->qu_warn
);
153 qu
->qu_value
= be64_to_cpu(str
->qu_value
);
156 void gfs2_dinode_in(struct gfs2_dinode
*di
, const void *buf
)
158 const struct gfs2_dinode
*str
= buf
;
160 gfs2_meta_header_in(&di
->di_header
, buf
);
161 gfs2_inum_in(&di
->di_num
, &str
->di_num
);
163 di
->di_mode
= be32_to_cpu(str
->di_mode
);
164 di
->di_uid
= be32_to_cpu(str
->di_uid
);
165 di
->di_gid
= be32_to_cpu(str
->di_gid
);
166 di
->di_nlink
= be32_to_cpu(str
->di_nlink
);
167 di
->di_size
= be64_to_cpu(str
->di_size
);
168 di
->di_blocks
= be64_to_cpu(str
->di_blocks
);
169 di
->di_atime
= be64_to_cpu(str
->di_atime
);
170 di
->di_mtime
= be64_to_cpu(str
->di_mtime
);
171 di
->di_ctime
= be64_to_cpu(str
->di_ctime
);
172 di
->di_major
= be32_to_cpu(str
->di_major
);
173 di
->di_minor
= be32_to_cpu(str
->di_minor
);
175 di
->di_goal_meta
= be64_to_cpu(str
->di_goal_meta
);
176 di
->di_goal_data
= be64_to_cpu(str
->di_goal_data
);
177 di
->di_generation
= be64_to_cpu(str
->di_generation
);
179 di
->di_flags
= be32_to_cpu(str
->di_flags
);
180 di
->di_payload_format
= be32_to_cpu(str
->di_payload_format
);
181 di
->di_height
= be16_to_cpu(str
->di_height
);
183 di
->di_depth
= be16_to_cpu(str
->di_depth
);
184 di
->di_entries
= be32_to_cpu(str
->di_entries
);
186 di
->di_eattr
= be64_to_cpu(str
->di_eattr
);
190 void gfs2_dinode_out(const struct gfs2_dinode
*di
, void *buf
)
192 struct gfs2_dinode
*str
= buf
;
194 gfs2_meta_header_out(&di
->di_header
, buf
);
195 gfs2_inum_out(&di
->di_num
, (char *)&str
->di_num
);
197 str
->di_mode
= cpu_to_be32(di
->di_mode
);
198 str
->di_uid
= cpu_to_be32(di
->di_uid
);
199 str
->di_gid
= cpu_to_be32(di
->di_gid
);
200 str
->di_nlink
= cpu_to_be32(di
->di_nlink
);
201 str
->di_size
= cpu_to_be64(di
->di_size
);
202 str
->di_blocks
= cpu_to_be64(di
->di_blocks
);
203 str
->di_atime
= cpu_to_be64(di
->di_atime
);
204 str
->di_mtime
= cpu_to_be64(di
->di_mtime
);
205 str
->di_ctime
= cpu_to_be64(di
->di_ctime
);
206 str
->di_major
= cpu_to_be32(di
->di_major
);
207 str
->di_minor
= cpu_to_be32(di
->di_minor
);
209 str
->di_goal_meta
= cpu_to_be64(di
->di_goal_meta
);
210 str
->di_goal_data
= cpu_to_be64(di
->di_goal_data
);
211 str
->di_generation
= cpu_to_be64(di
->di_generation
);
213 str
->di_flags
= cpu_to_be32(di
->di_flags
);
214 str
->di_payload_format
= cpu_to_be32(di
->di_payload_format
);
215 str
->di_height
= cpu_to_be16(di
->di_height
);
217 str
->di_depth
= cpu_to_be16(di
->di_depth
);
218 str
->di_entries
= cpu_to_be32(di
->di_entries
);
220 str
->di_eattr
= cpu_to_be64(di
->di_eattr
);
224 void gfs2_dinode_print(const struct gfs2_dinode
*di
)
226 gfs2_meta_header_print(&di
->di_header
);
227 gfs2_inum_print(&di
->di_num
);
229 pv(di
, di_mode
, "0%o");
230 pv(di
, di_uid
, "%u");
231 pv(di
, di_gid
, "%u");
232 pv(di
, di_nlink
, "%u");
233 printk(KERN_INFO
" di_size = %llu\n", (unsigned long long)di
->di_size
);
234 printk(KERN_INFO
" di_blocks = %llu\n", (unsigned long long)di
->di_blocks
);
235 printk(KERN_INFO
" di_atime = %lld\n", (long long)di
->di_atime
);
236 printk(KERN_INFO
" di_mtime = %lld\n", (long long)di
->di_mtime
);
237 printk(KERN_INFO
" di_ctime = %lld\n", (long long)di
->di_ctime
);
238 pv(di
, di_major
, "%u");
239 pv(di
, di_minor
, "%u");
241 printk(KERN_INFO
" di_goal_meta = %llu\n", (unsigned long long)di
->di_goal_meta
);
242 printk(KERN_INFO
" di_goal_data = %llu\n", (unsigned long long)di
->di_goal_data
);
244 pv(di
, di_flags
, "0x%.8X");
245 pv(di
, di_payload_format
, "%u");
246 pv(di
, di_height
, "%u");
248 pv(di
, di_depth
, "%u");
249 pv(di
, di_entries
, "%u");
251 printk(KERN_INFO
" di_eattr = %llu\n", (unsigned long long)di
->di_eattr
);
254 void gfs2_log_header_in(struct gfs2_log_header
*lh
, const void *buf
)
256 const struct gfs2_log_header
*str
= buf
;
258 gfs2_meta_header_in(&lh
->lh_header
, buf
);
259 lh
->lh_sequence
= be64_to_cpu(str
->lh_sequence
);
260 lh
->lh_flags
= be32_to_cpu(str
->lh_flags
);
261 lh
->lh_tail
= be32_to_cpu(str
->lh_tail
);
262 lh
->lh_blkno
= be32_to_cpu(str
->lh_blkno
);
263 lh
->lh_hash
= be32_to_cpu(str
->lh_hash
);
266 void gfs2_inum_range_in(struct gfs2_inum_range
*ir
, const void *buf
)
268 const struct gfs2_inum_range
*str
= buf
;
270 ir
->ir_start
= be64_to_cpu(str
->ir_start
);
271 ir
->ir_length
= be64_to_cpu(str
->ir_length
);
274 void gfs2_inum_range_out(const struct gfs2_inum_range
*ir
, void *buf
)
276 struct gfs2_inum_range
*str
= buf
;
278 str
->ir_start
= cpu_to_be64(ir
->ir_start
);
279 str
->ir_length
= cpu_to_be64(ir
->ir_length
);
282 void gfs2_statfs_change_in(struct gfs2_statfs_change
*sc
, const void *buf
)
284 const struct gfs2_statfs_change
*str
= buf
;
286 sc
->sc_total
= be64_to_cpu(str
->sc_total
);
287 sc
->sc_free
= be64_to_cpu(str
->sc_free
);
288 sc
->sc_dinodes
= be64_to_cpu(str
->sc_dinodes
);
291 void gfs2_statfs_change_out(const struct gfs2_statfs_change
*sc
, void *buf
)
293 struct gfs2_statfs_change
*str
= buf
;
295 str
->sc_total
= cpu_to_be64(sc
->sc_total
);
296 str
->sc_free
= cpu_to_be64(sc
->sc_free
);
297 str
->sc_dinodes
= cpu_to_be64(sc
->sc_dinodes
);
300 void gfs2_quota_change_in(struct gfs2_quota_change
*qc
, const void *buf
)
302 const struct gfs2_quota_change
*str
= buf
;
304 qc
->qc_change
= be64_to_cpu(str
->qc_change
);
305 qc
->qc_flags
= be32_to_cpu(str
->qc_flags
);
306 qc
->qc_id
= be32_to_cpu(str
->qc_id
);