]>
git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blob - fs/gfs2/ondisk.c
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_out(const struct gfs2_inode
*ip
, struct gfs2_dirent
*dent
)
38 dent
->de_inum
.no_formal_ino
= cpu_to_be64(ip
->i_no_formal_ino
);
39 dent
->de_inum
.no_addr
= cpu_to_be64(ip
->i_no_addr
);
42 static void gfs2_meta_header_in(struct gfs2_meta_header_host
*mh
, const void *buf
)
44 const struct gfs2_meta_header
*str
= buf
;
46 mh
->mh_magic
= be32_to_cpu(str
->mh_magic
);
47 mh
->mh_type
= be32_to_cpu(str
->mh_type
);
48 mh
->mh_format
= be32_to_cpu(str
->mh_format
);
51 void gfs2_sb_in(struct gfs2_sb_host
*sb
, const void *buf
)
53 const struct gfs2_sb
*str
= buf
;
55 gfs2_meta_header_in(&sb
->sb_header
, buf
);
57 sb
->sb_fs_format
= be32_to_cpu(str
->sb_fs_format
);
58 sb
->sb_multihost_format
= be32_to_cpu(str
->sb_multihost_format
);
59 sb
->sb_bsize
= be32_to_cpu(str
->sb_bsize
);
60 sb
->sb_bsize_shift
= be32_to_cpu(str
->sb_bsize_shift
);
61 sb
->sb_master_dir
.no_addr
= be64_to_cpu(str
->sb_master_dir
.no_addr
);
62 sb
->sb_master_dir
.no_formal_ino
= be64_to_cpu(str
->sb_master_dir
.no_formal_ino
);
63 sb
->sb_root_dir
.no_addr
= be64_to_cpu(str
->sb_root_dir
.no_addr
);
64 sb
->sb_root_dir
.no_formal_ino
= be64_to_cpu(str
->sb_root_dir
.no_formal_ino
);
66 memcpy(sb
->sb_lockproto
, str
->sb_lockproto
, GFS2_LOCKNAME_LEN
);
67 memcpy(sb
->sb_locktable
, str
->sb_locktable
, GFS2_LOCKNAME_LEN
);
70 void gfs2_rindex_in(struct gfs2_rindex_host
*ri
, const void *buf
)
72 const struct gfs2_rindex
*str
= buf
;
74 ri
->ri_addr
= be64_to_cpu(str
->ri_addr
);
75 ri
->ri_length
= be32_to_cpu(str
->ri_length
);
76 ri
->ri_data0
= be64_to_cpu(str
->ri_data0
);
77 ri
->ri_data
= be32_to_cpu(str
->ri_data
);
78 ri
->ri_bitbytes
= be32_to_cpu(str
->ri_bitbytes
);
82 void gfs2_rindex_print(const struct gfs2_rindex_host
*ri
)
84 printk(KERN_INFO
" ri_addr = %llu\n", (unsigned long long)ri
->ri_addr
);
85 pv(ri
, ri_length
, "%u");
87 printk(KERN_INFO
" ri_data0 = %llu\n", (unsigned long long)ri
->ri_data0
);
88 pv(ri
, ri_data
, "%u");
90 pv(ri
, ri_bitbytes
, "%u");
93 void gfs2_rgrp_in(struct gfs2_rgrp_host
*rg
, const void *buf
)
95 const struct gfs2_rgrp
*str
= buf
;
97 rg
->rg_flags
= be32_to_cpu(str
->rg_flags
);
98 rg
->rg_free
= be32_to_cpu(str
->rg_free
);
99 rg
->rg_dinodes
= be32_to_cpu(str
->rg_dinodes
);
100 rg
->rg_igeneration
= be64_to_cpu(str
->rg_igeneration
);
103 void gfs2_rgrp_out(const struct gfs2_rgrp_host
*rg
, void *buf
)
105 struct gfs2_rgrp
*str
= buf
;
107 str
->rg_flags
= cpu_to_be32(rg
->rg_flags
);
108 str
->rg_free
= cpu_to_be32(rg
->rg_free
);
109 str
->rg_dinodes
= cpu_to_be32(rg
->rg_dinodes
);
110 str
->__pad
= cpu_to_be32(0);
111 str
->rg_igeneration
= cpu_to_be64(rg
->rg_igeneration
);
112 memset(&str
->rg_reserved
, 0, sizeof(str
->rg_reserved
));
115 void gfs2_quota_in(struct gfs2_quota_host
*qu
, const void *buf
)
117 const struct gfs2_quota
*str
= buf
;
119 qu
->qu_limit
= be64_to_cpu(str
->qu_limit
);
120 qu
->qu_warn
= be64_to_cpu(str
->qu_warn
);
121 qu
->qu_value
= be64_to_cpu(str
->qu_value
);
124 void gfs2_dinode_out(const struct gfs2_inode
*ip
, void *buf
)
126 const struct gfs2_dinode_host
*di
= &ip
->i_di
;
127 struct gfs2_dinode
*str
= buf
;
129 str
->di_header
.mh_magic
= cpu_to_be32(GFS2_MAGIC
);
130 str
->di_header
.mh_type
= cpu_to_be32(GFS2_METATYPE_DI
);
131 str
->di_header
.__pad0
= 0;
132 str
->di_header
.mh_format
= cpu_to_be32(GFS2_FORMAT_DI
);
133 str
->di_header
.__pad1
= 0;
134 str
->di_num
.no_addr
= cpu_to_be64(ip
->i_no_addr
);
135 str
->di_num
.no_formal_ino
= cpu_to_be64(ip
->i_no_formal_ino
);
136 str
->di_mode
= cpu_to_be32(ip
->i_inode
.i_mode
);
137 str
->di_uid
= cpu_to_be32(ip
->i_inode
.i_uid
);
138 str
->di_gid
= cpu_to_be32(ip
->i_inode
.i_gid
);
139 str
->di_nlink
= cpu_to_be32(ip
->i_inode
.i_nlink
);
140 str
->di_size
= cpu_to_be64(di
->di_size
);
141 str
->di_blocks
= cpu_to_be64(di
->di_blocks
);
142 str
->di_atime
= cpu_to_be64(ip
->i_inode
.i_atime
.tv_sec
);
143 str
->di_mtime
= cpu_to_be64(ip
->i_inode
.i_mtime
.tv_sec
);
144 str
->di_ctime
= cpu_to_be64(ip
->i_inode
.i_ctime
.tv_sec
);
146 str
->di_goal_meta
= cpu_to_be64(di
->di_goal_meta
);
147 str
->di_goal_data
= cpu_to_be64(di
->di_goal_data
);
148 str
->di_generation
= cpu_to_be64(di
->di_generation
);
150 str
->di_flags
= cpu_to_be32(di
->di_flags
);
151 str
->di_height
= cpu_to_be16(di
->di_height
);
152 str
->di_payload_format
= cpu_to_be32(S_ISDIR(ip
->i_inode
.i_mode
) &&
153 !(ip
->i_di
.di_flags
& GFS2_DIF_EXHASH
) ?
155 str
->di_depth
= cpu_to_be16(di
->di_depth
);
156 str
->di_entries
= cpu_to_be32(di
->di_entries
);
158 str
->di_eattr
= cpu_to_be64(di
->di_eattr
);
161 void gfs2_dinode_print(const struct gfs2_inode
*ip
)
163 const struct gfs2_dinode_host
*di
= &ip
->i_di
;
165 printk(KERN_INFO
" no_formal_ino = %llu\n", (unsigned long long)ip
->i_no_formal_ino
);
166 printk(KERN_INFO
" no_addr = %llu\n", (unsigned long long)ip
->i_no_addr
);
168 printk(KERN_INFO
" di_size = %llu\n", (unsigned long long)di
->di_size
);
169 printk(KERN_INFO
" di_blocks = %llu\n", (unsigned long long)di
->di_blocks
);
170 printk(KERN_INFO
" di_goal_meta = %llu\n", (unsigned long long)di
->di_goal_meta
);
171 printk(KERN_INFO
" di_goal_data = %llu\n", (unsigned long long)di
->di_goal_data
);
173 pv(di
, di_flags
, "0x%.8X");
174 pv(di
, di_height
, "%u");
176 pv(di
, di_depth
, "%u");
177 pv(di
, di_entries
, "%u");
179 printk(KERN_INFO
" di_eattr = %llu\n", (unsigned long long)di
->di_eattr
);
182 void gfs2_log_header_in(struct gfs2_log_header_host
*lh
, const void *buf
)
184 const struct gfs2_log_header
*str
= buf
;
186 gfs2_meta_header_in(&lh
->lh_header
, buf
);
187 lh
->lh_sequence
= be64_to_cpu(str
->lh_sequence
);
188 lh
->lh_flags
= be32_to_cpu(str
->lh_flags
);
189 lh
->lh_tail
= be32_to_cpu(str
->lh_tail
);
190 lh
->lh_blkno
= be32_to_cpu(str
->lh_blkno
);
191 lh
->lh_hash
= be32_to_cpu(str
->lh_hash
);
194 void gfs2_inum_range_in(struct gfs2_inum_range_host
*ir
, const void *buf
)
196 const struct gfs2_inum_range
*str
= buf
;
198 ir
->ir_start
= be64_to_cpu(str
->ir_start
);
199 ir
->ir_length
= be64_to_cpu(str
->ir_length
);
202 void gfs2_inum_range_out(const struct gfs2_inum_range_host
*ir
, void *buf
)
204 struct gfs2_inum_range
*str
= buf
;
206 str
->ir_start
= cpu_to_be64(ir
->ir_start
);
207 str
->ir_length
= cpu_to_be64(ir
->ir_length
);
210 void gfs2_statfs_change_in(struct gfs2_statfs_change_host
*sc
, const void *buf
)
212 const struct gfs2_statfs_change
*str
= buf
;
214 sc
->sc_total
= be64_to_cpu(str
->sc_total
);
215 sc
->sc_free
= be64_to_cpu(str
->sc_free
);
216 sc
->sc_dinodes
= be64_to_cpu(str
->sc_dinodes
);
219 void gfs2_statfs_change_out(const struct gfs2_statfs_change_host
*sc
, void *buf
)
221 struct gfs2_statfs_change
*str
= buf
;
223 str
->sc_total
= cpu_to_be64(sc
->sc_total
);
224 str
->sc_free
= cpu_to_be64(sc
->sc_free
);
225 str
->sc_dinodes
= cpu_to_be64(sc
->sc_dinodes
);
228 void gfs2_quota_change_in(struct gfs2_quota_change_host
*qc
, const void *buf
)
230 const struct gfs2_quota_change
*str
= buf
;
232 qc
->qc_change
= be64_to_cpu(str
->qc_change
);
233 qc
->qc_flags
= be32_to_cpu(str
->qc_flags
);
234 qc
->qc_id
= be32_to_cpu(str
->qc_id
);