1 /* $NetBSD: ffs_bswap.c,v 1.37 2013/06/09 17:55:46 dholland Exp $ */
4 * Copyright (c) 1998 Manuel Bouyer.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 #if HAVE_NBTOOL_CONFIG_H
29 #include "nbtool_config.h"
32 #include <sys/cdefs.h>
33 __KERNEL_RCSID(0, "$NetBSD: ffs_bswap.c,v 1.37 2013/06/09 17:55:46 dholland Exp $");
35 #include <sys/param.h>
37 #include <sys/systm.h>
40 #include <ufs/ufs/dinode.h>
41 #include <ufs/ufs/quota.h>
42 #include <ufs/ufs/ufs_bswap.h>
43 #include <ufs/ffs/fs.h>
44 #include <ufs/ffs/ffs_extern.h>
51 #define panic(x) printf("%s\n", (x)), abort()
55 ffs_sb_swap(struct fs
*o
, struct fs
*n
)
61 * In order to avoid a lot of lines, as the first N fields (52)
62 * of the superblock up to fs_fmod are u_int32_t, we just loop
63 * here to convert them.
67 for (i
= 0; i
< offsetof(struct fs
, fs_fmod
) / sizeof(u_int32_t
); i
++)
68 n32
[i
] = bswap32(o32
[i
]);
70 n
->fs_swuid
= bswap64(o
->fs_swuid
);
71 n
->fs_cgrotor
= bswap32(o
->fs_cgrotor
); /* Unused */
72 n
->fs_old_cpc
= bswap32(o
->fs_old_cpc
);
74 /* These fields overlap with a possible location for the
75 * historic FS_DYNAMICPOSTBLFMT postbl table, and with the
76 * first half of the historic FS_42POSTBLFMT postbl table.
78 n
->fs_maxbsize
= bswap32(o
->fs_maxbsize
);
80 n
->fs_quota_magic
= bswap32(o
->fs_quota_magic
);
81 for (i
= 0; i
< MAXQUOTAS
; i
++)
82 n
->fs_quotafile
[i
] = bswap64(o
->fs_quotafile
[i
]);
83 n
->fs_sblockloc
= bswap64(o
->fs_sblockloc
);
84 ffs_csumtotal_swap(&o
->fs_cstotal
, &n
->fs_cstotal
);
85 n
->fs_time
= bswap64(o
->fs_time
);
86 n
->fs_size
= bswap64(o
->fs_size
);
87 n
->fs_dsize
= bswap64(o
->fs_dsize
);
88 n
->fs_csaddr
= bswap64(o
->fs_csaddr
);
89 n
->fs_pendingblocks
= bswap64(o
->fs_pendingblocks
);
90 n
->fs_pendinginodes
= bswap32(o
->fs_pendinginodes
);
92 /* These fields overlap with the second half of the
93 * historic FS_42POSTBLFMT postbl table
95 for (i
= 0; i
< FSMAXSNAP
; i
++)
96 n
->fs_snapinum
[i
] = bswap32(o
->fs_snapinum
[i
]);
97 n
->fs_avgfilesize
= bswap32(o
->fs_avgfilesize
);
98 n
->fs_avgfpdir
= bswap32(o
->fs_avgfpdir
);
99 /* fs_sparecon[28] - ignore for now */
100 n
->fs_flags
= bswap32(o
->fs_flags
);
101 n
->fs_contigsumsize
= bswap32(o
->fs_contigsumsize
);
102 n
->fs_maxsymlinklen
= bswap32(o
->fs_maxsymlinklen
);
103 n
->fs_old_inodefmt
= bswap32(o
->fs_old_inodefmt
);
104 n
->fs_maxfilesize
= bswap64(o
->fs_maxfilesize
);
105 n
->fs_qbmask
= bswap64(o
->fs_qbmask
);
106 n
->fs_qfmask
= bswap64(o
->fs_qfmask
);
107 n
->fs_state
= bswap32(o
->fs_state
);
108 n
->fs_old_postblformat
= bswap32(o
->fs_old_postblformat
);
109 n
->fs_old_nrpos
= bswap32(o
->fs_old_nrpos
);
110 n
->fs_old_postbloff
= bswap32(o
->fs_old_postbloff
);
111 n
->fs_old_rotbloff
= bswap32(o
->fs_old_rotbloff
);
113 n
->fs_magic
= bswap32(o
->fs_magic
);
117 ffs_dinode1_swap(struct ufs1_dinode
*o
, struct ufs1_dinode
*n
)
120 n
->di_mode
= bswap16(o
->di_mode
);
121 n
->di_nlink
= bswap16(o
->di_nlink
);
122 n
->di_oldids
[0] = bswap16(o
->di_oldids
[0]);
123 n
->di_oldids
[1] = bswap16(o
->di_oldids
[1]);
124 n
->di_size
= bswap64(o
->di_size
);
125 n
->di_atime
= bswap32(o
->di_atime
);
126 n
->di_atimensec
= bswap32(o
->di_atimensec
);
127 n
->di_mtime
= bswap32(o
->di_mtime
);
128 n
->di_mtimensec
= bswap32(o
->di_mtimensec
);
129 n
->di_ctime
= bswap32(o
->di_ctime
);
130 n
->di_ctimensec
= bswap32(o
->di_ctimensec
);
131 memcpy(n
->di_db
, o
->di_db
, (UFS_NDADDR
+ UFS_NIADDR
) * sizeof(u_int32_t
));
132 n
->di_flags
= bswap32(o
->di_flags
);
133 n
->di_blocks
= bswap32(o
->di_blocks
);
134 n
->di_gen
= bswap32(o
->di_gen
);
135 n
->di_uid
= bswap32(o
->di_uid
);
136 n
->di_gid
= bswap32(o
->di_gid
);
140 ffs_dinode2_swap(struct ufs2_dinode
*o
, struct ufs2_dinode
*n
)
142 n
->di_mode
= bswap16(o
->di_mode
);
143 n
->di_nlink
= bswap16(o
->di_nlink
);
144 n
->di_uid
= bswap32(o
->di_uid
);
145 n
->di_gid
= bswap32(o
->di_gid
);
146 n
->di_blksize
= bswap32(o
->di_blksize
);
147 n
->di_size
= bswap64(o
->di_size
);
148 n
->di_blocks
= bswap64(o
->di_blocks
);
149 n
->di_atime
= bswap64(o
->di_atime
);
150 n
->di_atimensec
= bswap32(o
->di_atimensec
);
151 n
->di_mtime
= bswap64(o
->di_mtime
);
152 n
->di_mtimensec
= bswap32(o
->di_mtimensec
);
153 n
->di_ctime
= bswap64(o
->di_ctime
);
154 n
->di_ctimensec
= bswap32(o
->di_ctimensec
);
155 n
->di_birthtime
= bswap64(o
->di_birthtime
);
156 n
->di_birthnsec
= bswap32(o
->di_birthnsec
);
157 n
->di_gen
= bswap32(o
->di_gen
);
158 n
->di_kernflags
= bswap32(o
->di_kernflags
);
159 n
->di_flags
= bswap32(o
->di_flags
);
160 n
->di_extsize
= bswap32(o
->di_extsize
);
161 memcpy(n
->di_extb
, o
->di_extb
, (UFS_NXADDR
+ UFS_NDADDR
+ UFS_NIADDR
) * 8);
165 ffs_csum_swap(struct csum
*o
, struct csum
*n
, int size
)
168 u_int32_t
*oint
, *nint
;
170 oint
= (u_int32_t
*)o
;
171 nint
= (u_int32_t
*)n
;
173 for (i
= 0; i
< size
/ sizeof(u_int32_t
); i
++)
174 nint
[i
] = bswap32(oint
[i
]);
178 ffs_csumtotal_swap(struct csum_total
*o
, struct csum_total
*n
)
180 n
->cs_ndir
= bswap64(o
->cs_ndir
);
181 n
->cs_nbfree
= bswap64(o
->cs_nbfree
);
182 n
->cs_nifree
= bswap64(o
->cs_nifree
);
183 n
->cs_nffree
= bswap64(o
->cs_nffree
);
187 * Note that ffs_cg_swap may be called with o == n.
190 ffs_cg_swap(struct cg
*o
, struct cg
*n
, struct fs
*fs
)
193 u_int32_t
*n32
, *o32
;
194 u_int16_t
*n16
, *o16
;
195 int32_t btotoff
, boff
, clustersumoff
;
197 n
->cg_firstfield
= bswap32(o
->cg_firstfield
);
198 n
->cg_magic
= bswap32(o
->cg_magic
);
199 n
->cg_old_time
= bswap32(o
->cg_old_time
);
200 n
->cg_cgx
= bswap32(o
->cg_cgx
);
201 n
->cg_old_ncyl
= bswap16(o
->cg_old_ncyl
);
202 n
->cg_old_niblk
= bswap16(o
->cg_old_niblk
);
203 n
->cg_ndblk
= bswap32(o
->cg_ndblk
);
204 n
->cg_cs
.cs_ndir
= bswap32(o
->cg_cs
.cs_ndir
);
205 n
->cg_cs
.cs_nbfree
= bswap32(o
->cg_cs
.cs_nbfree
);
206 n
->cg_cs
.cs_nifree
= bswap32(o
->cg_cs
.cs_nifree
);
207 n
->cg_cs
.cs_nffree
= bswap32(o
->cg_cs
.cs_nffree
);
208 n
->cg_rotor
= bswap32(o
->cg_rotor
);
209 n
->cg_frotor
= bswap32(o
->cg_frotor
);
210 n
->cg_irotor
= bswap32(o
->cg_irotor
);
211 for (i
= 0; i
< MAXFRAG
; i
++)
212 n
->cg_frsum
[i
] = bswap32(o
->cg_frsum
[i
]);
214 if ((fs
->fs_magic
!= FS_UFS2_MAGIC
) &&
215 (fs
->fs_old_postblformat
== FS_42POSTBLFMT
)) { /* old format */
218 on
= (struct ocg
*)n
;
219 oo
= (struct ocg
*)o
;
221 for (i
= 0; i
< 32; i
++) {
222 on
->cg_btot
[i
] = bswap32(oo
->cg_btot
[i
]);
223 for (j
= 0; j
< 8; j
++)
224 on
->cg_b
[i
][j
] = bswap16(oo
->cg_b
[i
][j
]);
226 memmove(on
->cg_iused
, oo
->cg_iused
, 256);
227 on
->cg_magic
= bswap32(oo
->cg_magic
);
228 } else { /* new format */
230 n
->cg_old_btotoff
= bswap32(o
->cg_old_btotoff
);
231 n
->cg_old_boff
= bswap32(o
->cg_old_boff
);
232 n
->cg_iusedoff
= bswap32(o
->cg_iusedoff
);
233 n
->cg_freeoff
= bswap32(o
->cg_freeoff
);
234 n
->cg_nextfreeoff
= bswap32(o
->cg_nextfreeoff
);
235 n
->cg_clustersumoff
= bswap32(o
->cg_clustersumoff
);
236 n
->cg_clusteroff
= bswap32(o
->cg_clusteroff
);
237 n
->cg_nclusterblks
= bswap32(o
->cg_nclusterblks
);
238 n
->cg_niblk
= bswap32(o
->cg_niblk
);
239 n
->cg_initediblk
= bswap32(o
->cg_initediblk
);
240 n
->cg_time
= bswap64(o
->cg_time
);
242 if (n
->cg_magic
== CG_MAGIC
) {
243 btotoff
= n
->cg_old_btotoff
;
244 boff
= n
->cg_old_boff
;
245 clustersumoff
= n
->cg_clustersumoff
;
247 btotoff
= bswap32(n
->cg_old_btotoff
);
248 boff
= bswap32(n
->cg_old_boff
);
249 clustersumoff
= bswap32(n
->cg_clustersumoff
);
252 n32
= (u_int32_t
*)((u_int8_t
*)n
+ clustersumoff
);
253 o32
= (u_int32_t
*)((u_int8_t
*)o
+ clustersumoff
);
254 for (i
= 1; i
< fs
->fs_contigsumsize
+ 1; i
++)
255 n32
[i
] = bswap32(o32
[i
]);
257 if (fs
->fs_magic
== FS_UFS2_MAGIC
)
260 n32
= (u_int32_t
*)((u_int8_t
*)n
+ btotoff
);
261 o32
= (u_int32_t
*)((u_int8_t
*)o
+ btotoff
);
262 n16
= (u_int16_t
*)((u_int8_t
*)n
+ boff
);
263 o16
= (u_int16_t
*)((u_int8_t
*)o
+ boff
);
265 for (i
= 0; i
< fs
->fs_old_cpg
; i
++)
266 n32
[i
] = bswap32(o32
[i
]);
268 for (i
= 0; i
< fs
->fs_old_cpg
* fs
->fs_old_nrpos
; i
++)
269 n16
[i
] = bswap16(o16
[i
]);