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>
18 #include <linux/lm_interface.h>
21 #define pv(struct, member, fmt) printk(KERN_INFO " "#member" = "fmt"\n", \
25 * gfs2_xxx_in - read in an xxx struct
26 * first arg: the cpu-order structure
27 * buf: the disk-order buffer
29 * gfs2_xxx_out - write out an xxx struct
30 * first arg: the cpu-order structure
31 * buf: the disk-order buffer
33 * gfs2_xxx_print - print out an xxx struct
34 * first arg: the cpu-order structure
37 void gfs2_inum_in(struct gfs2_inum_host
*no
, const void *buf
)
39 const struct gfs2_inum
*str
= buf
;
41 no
->no_formal_ino
= be64_to_cpu(str
->no_formal_ino
);
42 no
->no_addr
= be64_to_cpu(str
->no_addr
);
45 void gfs2_inum_out(const struct gfs2_inum_host
*no
, void *buf
)
47 struct gfs2_inum
*str
= buf
;
49 str
->no_formal_ino
= cpu_to_be64(no
->no_formal_ino
);
50 str
->no_addr
= cpu_to_be64(no
->no_addr
);
53 static void gfs2_inum_print(const struct gfs2_inum_host
*no
)
55 printk(KERN_INFO
" no_formal_ino = %llu\n", (unsigned long long)no
->no_formal_ino
);
56 printk(KERN_INFO
" no_addr = %llu\n", (unsigned long long)no
->no_addr
);
59 static void gfs2_meta_header_in(struct gfs2_meta_header_host
*mh
, const void *buf
)
61 const struct gfs2_meta_header
*str
= buf
;
63 mh
->mh_magic
= be32_to_cpu(str
->mh_magic
);
64 mh
->mh_type
= be32_to_cpu(str
->mh_type
);
65 mh
->mh_format
= be32_to_cpu(str
->mh_format
);
68 void gfs2_sb_in(struct gfs2_sb_host
*sb
, const void *buf
)
70 const struct gfs2_sb
*str
= buf
;
72 gfs2_meta_header_in(&sb
->sb_header
, buf
);
74 sb
->sb_fs_format
= be32_to_cpu(str
->sb_fs_format
);
75 sb
->sb_multihost_format
= be32_to_cpu(str
->sb_multihost_format
);
76 sb
->sb_bsize
= be32_to_cpu(str
->sb_bsize
);
77 sb
->sb_bsize_shift
= be32_to_cpu(str
->sb_bsize_shift
);
79 gfs2_inum_in(&sb
->sb_master_dir
, (char *)&str
->sb_master_dir
);
80 gfs2_inum_in(&sb
->sb_root_dir
, (char *)&str
->sb_root_dir
);
82 memcpy(sb
->sb_lockproto
, str
->sb_lockproto
, GFS2_LOCKNAME_LEN
);
83 memcpy(sb
->sb_locktable
, str
->sb_locktable
, GFS2_LOCKNAME_LEN
);
86 void gfs2_rindex_in(struct gfs2_rindex_host
*ri
, const void *buf
)
88 const struct gfs2_rindex
*str
= buf
;
90 ri
->ri_addr
= be64_to_cpu(str
->ri_addr
);
91 ri
->ri_length
= be32_to_cpu(str
->ri_length
);
92 ri
->ri_data0
= be64_to_cpu(str
->ri_data0
);
93 ri
->ri_data
= be32_to_cpu(str
->ri_data
);
94 ri
->ri_bitbytes
= be32_to_cpu(str
->ri_bitbytes
);
98 void gfs2_rindex_print(const struct gfs2_rindex_host
*ri
)
100 printk(KERN_INFO
" ri_addr = %llu\n", (unsigned long long)ri
->ri_addr
);
101 pv(ri
, ri_length
, "%u");
103 printk(KERN_INFO
" ri_data0 = %llu\n", (unsigned long long)ri
->ri_data0
);
104 pv(ri
, ri_data
, "%u");
106 pv(ri
, ri_bitbytes
, "%u");
109 void gfs2_rgrp_in(struct gfs2_rgrp_host
*rg
, const void *buf
)
111 const struct gfs2_rgrp
*str
= buf
;
113 rg
->rg_flags
= be32_to_cpu(str
->rg_flags
);
114 rg
->rg_free
= be32_to_cpu(str
->rg_free
);
115 rg
->rg_dinodes
= be32_to_cpu(str
->rg_dinodes
);
116 rg
->rg_igeneration
= be64_to_cpu(str
->rg_igeneration
);
119 void gfs2_rgrp_out(const struct gfs2_rgrp_host
*rg
, void *buf
)
121 struct gfs2_rgrp
*str
= buf
;
123 str
->rg_flags
= cpu_to_be32(rg
->rg_flags
);
124 str
->rg_free
= cpu_to_be32(rg
->rg_free
);
125 str
->rg_dinodes
= cpu_to_be32(rg
->rg_dinodes
);
126 str
->__pad
= cpu_to_be32(0);
127 str
->rg_igeneration
= cpu_to_be64(rg
->rg_igeneration
);
128 memset(&str
->rg_reserved
, 0, sizeof(str
->rg_reserved
));
131 void gfs2_quota_in(struct gfs2_quota_host
*qu
, const void *buf
)
133 const struct gfs2_quota
*str
= buf
;
135 qu
->qu_limit
= be64_to_cpu(str
->qu_limit
);
136 qu
->qu_warn
= be64_to_cpu(str
->qu_warn
);
137 qu
->qu_value
= be64_to_cpu(str
->qu_value
);
140 void gfs2_dinode_out(const struct gfs2_inode
*ip
, void *buf
)
142 const struct gfs2_dinode_host
*di
= &ip
->i_di
;
143 struct gfs2_dinode
*str
= buf
;
145 str
->di_header
.mh_magic
= cpu_to_be32(GFS2_MAGIC
);
146 str
->di_header
.mh_type
= cpu_to_be32(GFS2_METATYPE_DI
);
147 str
->di_header
.__pad0
= 0;
148 str
->di_header
.mh_format
= cpu_to_be32(GFS2_FORMAT_DI
);
149 str
->di_header
.__pad1
= 0;
151 gfs2_inum_out(&ip
->i_num
, &str
->di_num
);
153 str
->di_mode
= cpu_to_be32(ip
->i_inode
.i_mode
);
154 str
->di_uid
= cpu_to_be32(ip
->i_inode
.i_uid
);
155 str
->di_gid
= cpu_to_be32(ip
->i_inode
.i_gid
);
156 str
->di_nlink
= cpu_to_be32(ip
->i_inode
.i_nlink
);
157 str
->di_size
= cpu_to_be64(di
->di_size
);
158 str
->di_blocks
= cpu_to_be64(di
->di_blocks
);
159 str
->di_atime
= cpu_to_be64(ip
->i_inode
.i_atime
.tv_sec
);
160 str
->di_mtime
= cpu_to_be64(ip
->i_inode
.i_mtime
.tv_sec
);
161 str
->di_ctime
= cpu_to_be64(ip
->i_inode
.i_ctime
.tv_sec
);
163 str
->di_goal_meta
= cpu_to_be64(di
->di_goal_meta
);
164 str
->di_goal_data
= cpu_to_be64(di
->di_goal_data
);
165 str
->di_generation
= cpu_to_be64(di
->di_generation
);
167 str
->di_flags
= cpu_to_be32(di
->di_flags
);
168 str
->di_height
= cpu_to_be16(di
->di_height
);
169 str
->di_payload_format
= cpu_to_be32(S_ISDIR(ip
->i_inode
.i_mode
) &&
170 !(ip
->i_di
.di_flags
& GFS2_DIF_EXHASH
) ?
172 str
->di_depth
= cpu_to_be16(di
->di_depth
);
173 str
->di_entries
= cpu_to_be32(di
->di_entries
);
175 str
->di_eattr
= cpu_to_be64(di
->di_eattr
);
178 void gfs2_dinode_print(const struct gfs2_inode
*ip
)
180 const struct gfs2_dinode_host
*di
= &ip
->i_di
;
182 gfs2_inum_print(&ip
->i_num
);
184 printk(KERN_INFO
" di_size = %llu\n", (unsigned long long)di
->di_size
);
185 printk(KERN_INFO
" di_blocks = %llu\n", (unsigned long long)di
->di_blocks
);
186 printk(KERN_INFO
" di_goal_meta = %llu\n", (unsigned long long)di
->di_goal_meta
);
187 printk(KERN_INFO
" di_goal_data = %llu\n", (unsigned long long)di
->di_goal_data
);
189 pv(di
, di_flags
, "0x%.8X");
190 pv(di
, di_height
, "%u");
192 pv(di
, di_depth
, "%u");
193 pv(di
, di_entries
, "%u");
195 printk(KERN_INFO
" di_eattr = %llu\n", (unsigned long long)di
->di_eattr
);
198 void gfs2_log_header_in(struct gfs2_log_header_host
*lh
, const void *buf
)
200 const struct gfs2_log_header
*str
= buf
;
202 gfs2_meta_header_in(&lh
->lh_header
, buf
);
203 lh
->lh_sequence
= be64_to_cpu(str
->lh_sequence
);
204 lh
->lh_flags
= be32_to_cpu(str
->lh_flags
);
205 lh
->lh_tail
= be32_to_cpu(str
->lh_tail
);
206 lh
->lh_blkno
= be32_to_cpu(str
->lh_blkno
);
207 lh
->lh_hash
= be32_to_cpu(str
->lh_hash
);
210 void gfs2_inum_range_in(struct gfs2_inum_range_host
*ir
, const void *buf
)
212 const struct gfs2_inum_range
*str
= buf
;
214 ir
->ir_start
= be64_to_cpu(str
->ir_start
);
215 ir
->ir_length
= be64_to_cpu(str
->ir_length
);
218 void gfs2_inum_range_out(const struct gfs2_inum_range_host
*ir
, void *buf
)
220 struct gfs2_inum_range
*str
= buf
;
222 str
->ir_start
= cpu_to_be64(ir
->ir_start
);
223 str
->ir_length
= cpu_to_be64(ir
->ir_length
);
226 void gfs2_statfs_change_in(struct gfs2_statfs_change_host
*sc
, const void *buf
)
228 const struct gfs2_statfs_change
*str
= buf
;
230 sc
->sc_total
= be64_to_cpu(str
->sc_total
);
231 sc
->sc_free
= be64_to_cpu(str
->sc_free
);
232 sc
->sc_dinodes
= be64_to_cpu(str
->sc_dinodes
);
235 void gfs2_statfs_change_out(const struct gfs2_statfs_change_host
*sc
, void *buf
)
237 struct gfs2_statfs_change
*str
= buf
;
239 str
->sc_total
= cpu_to_be64(sc
->sc_total
);
240 str
->sc_free
= cpu_to_be64(sc
->sc_free
);
241 str
->sc_dinodes
= cpu_to_be64(sc
->sc_dinodes
);
244 void gfs2_quota_change_in(struct gfs2_quota_change_host
*qc
, const void *buf
)
246 const struct gfs2_quota_change
*str
= buf
;
248 qc
->qc_change
= be64_to_cpu(str
->qc_change
);
249 qc
->qc_flags
= be32_to_cpu(str
->qc_flags
);
250 qc
->qc_id
= be32_to_cpu(str
->qc_id
);