1 /* vi: set sw=4 ts=4: */
3 * swapfs.c --- swap ext2 filesystem data structures
5 * Copyright (C) 1995, 1996, 2002 Theodore Ts'o.
8 * This file may be redistributed under the terms of the GNU Public
20 #include "ext2_ext_attr.h"
23 void ext2fs_swap_super(struct ext2_super_block
* sb
)
26 sb
->s_inodes_count
= ext2fs_swab32(sb
->s_inodes_count
);
27 sb
->s_blocks_count
= ext2fs_swab32(sb
->s_blocks_count
);
28 sb
->s_r_blocks_count
= ext2fs_swab32(sb
->s_r_blocks_count
);
29 sb
->s_free_blocks_count
= ext2fs_swab32(sb
->s_free_blocks_count
);
30 sb
->s_free_inodes_count
= ext2fs_swab32(sb
->s_free_inodes_count
);
31 sb
->s_first_data_block
= ext2fs_swab32(sb
->s_first_data_block
);
32 sb
->s_log_block_size
= ext2fs_swab32(sb
->s_log_block_size
);
33 sb
->s_log_frag_size
= ext2fs_swab32(sb
->s_log_frag_size
);
34 sb
->s_blocks_per_group
= ext2fs_swab32(sb
->s_blocks_per_group
);
35 sb
->s_frags_per_group
= ext2fs_swab32(sb
->s_frags_per_group
);
36 sb
->s_inodes_per_group
= ext2fs_swab32(sb
->s_inodes_per_group
);
37 sb
->s_mtime
= ext2fs_swab32(sb
->s_mtime
);
38 sb
->s_wtime
= ext2fs_swab32(sb
->s_wtime
);
39 sb
->s_mnt_count
= ext2fs_swab16(sb
->s_mnt_count
);
40 sb
->s_max_mnt_count
= ext2fs_swab16(sb
->s_max_mnt_count
);
41 sb
->s_magic
= ext2fs_swab16(sb
->s_magic
);
42 sb
->s_state
= ext2fs_swab16(sb
->s_state
);
43 sb
->s_errors
= ext2fs_swab16(sb
->s_errors
);
44 sb
->s_minor_rev_level
= ext2fs_swab16(sb
->s_minor_rev_level
);
45 sb
->s_lastcheck
= ext2fs_swab32(sb
->s_lastcheck
);
46 sb
->s_checkinterval
= ext2fs_swab32(sb
->s_checkinterval
);
47 sb
->s_creator_os
= ext2fs_swab32(sb
->s_creator_os
);
48 sb
->s_rev_level
= ext2fs_swab32(sb
->s_rev_level
);
49 sb
->s_def_resuid
= ext2fs_swab16(sb
->s_def_resuid
);
50 sb
->s_def_resgid
= ext2fs_swab16(sb
->s_def_resgid
);
51 sb
->s_first_ino
= ext2fs_swab32(sb
->s_first_ino
);
52 sb
->s_inode_size
= ext2fs_swab16(sb
->s_inode_size
);
53 sb
->s_block_group_nr
= ext2fs_swab16(sb
->s_block_group_nr
);
54 sb
->s_feature_compat
= ext2fs_swab32(sb
->s_feature_compat
);
55 sb
->s_feature_incompat
= ext2fs_swab32(sb
->s_feature_incompat
);
56 sb
->s_feature_ro_compat
= ext2fs_swab32(sb
->s_feature_ro_compat
);
57 sb
->s_algorithm_usage_bitmap
= ext2fs_swab32(sb
->s_algorithm_usage_bitmap
);
58 sb
->s_reserved_gdt_blocks
= ext2fs_swab16(sb
->s_reserved_gdt_blocks
);
59 sb
->s_journal_inum
= ext2fs_swab32(sb
->s_journal_inum
);
60 sb
->s_journal_dev
= ext2fs_swab32(sb
->s_journal_dev
);
61 sb
->s_last_orphan
= ext2fs_swab32(sb
->s_last_orphan
);
62 sb
->s_default_mount_opts
= ext2fs_swab32(sb
->s_default_mount_opts
);
63 sb
->s_first_meta_bg
= ext2fs_swab32(sb
->s_first_meta_bg
);
64 sb
->s_mkfs_time
= ext2fs_swab32(sb
->s_mkfs_time
);
66 sb
->s_hash_seed
[i
] = ext2fs_swab32(sb
->s_hash_seed
[i
]);
67 for (i
=0; i
< 17; i
++)
68 sb
->s_jnl_blocks
[i
] = ext2fs_swab32(sb
->s_jnl_blocks
[i
]);
71 void ext2fs_swap_group_desc(struct ext2_group_desc
*gdp
)
73 gdp
->bg_block_bitmap
= ext2fs_swab32(gdp
->bg_block_bitmap
);
74 gdp
->bg_inode_bitmap
= ext2fs_swab32(gdp
->bg_inode_bitmap
);
75 gdp
->bg_inode_table
= ext2fs_swab32(gdp
->bg_inode_table
);
76 gdp
->bg_free_blocks_count
= ext2fs_swab16(gdp
->bg_free_blocks_count
);
77 gdp
->bg_free_inodes_count
= ext2fs_swab16(gdp
->bg_free_inodes_count
);
78 gdp
->bg_used_dirs_count
= ext2fs_swab16(gdp
->bg_used_dirs_count
);
81 void ext2fs_swap_ext_attr(char *to
, char *from
, int bufsize
, int has_header
)
83 struct ext2_ext_attr_header
*from_header
=
84 (struct ext2_ext_attr_header
*)from
;
85 struct ext2_ext_attr_header
*to_header
=
86 (struct ext2_ext_attr_header
*)to
;
87 struct ext2_ext_attr_entry
*from_entry
, *to_entry
;
88 char *from_end
= (char *)from_header
+ bufsize
;
91 if (to_header
!= from_header
)
92 memcpy(to_header
, from_header
, bufsize
);
94 from_entry
= (struct ext2_ext_attr_entry
*)from_header
;
95 to_entry
= (struct ext2_ext_attr_entry
*)to_header
;
98 to_header
->h_magic
= ext2fs_swab32(from_header
->h_magic
);
99 to_header
->h_blocks
= ext2fs_swab32(from_header
->h_blocks
);
100 to_header
->h_refcount
= ext2fs_swab32(from_header
->h_refcount
);
102 to_header
->h_reserved
[n
] =
103 ext2fs_swab32(from_header
->h_reserved
[n
]);
104 from_entry
= (struct ext2_ext_attr_entry
*)(from_header
+1);
105 to_entry
= (struct ext2_ext_attr_entry
*)(to_header
+1);
108 while ((char *)from_entry
< from_end
&& *(__u32
*)from_entry
) {
109 to_entry
->e_value_offs
=
110 ext2fs_swab16(from_entry
->e_value_offs
);
111 to_entry
->e_value_block
=
112 ext2fs_swab32(from_entry
->e_value_block
);
113 to_entry
->e_value_size
=
114 ext2fs_swab32(from_entry
->e_value_size
);
115 from_entry
= EXT2_EXT_ATTR_NEXT(from_entry
);
116 to_entry
= EXT2_EXT_ATTR_NEXT(to_entry
);
120 void ext2fs_swap_inode_full(ext2_filsys fs
, struct ext2_inode_large
*t
,
121 struct ext2_inode_large
*f
, int hostorder
,
128 if (hostorder
&& LINUX_S_ISLNK(f
->i_mode
))
130 t
->i_mode
= ext2fs_swab16(f
->i_mode
);
131 if (!hostorder
&& LINUX_S_ISLNK(t
->i_mode
))
133 t
->i_uid
= ext2fs_swab16(f
->i_uid
);
134 t
->i_size
= ext2fs_swab32(f
->i_size
);
135 t
->i_atime
= ext2fs_swab32(f
->i_atime
);
136 t
->i_ctime
= ext2fs_swab32(f
->i_ctime
);
137 t
->i_mtime
= ext2fs_swab32(f
->i_mtime
);
138 t
->i_dtime
= ext2fs_swab32(f
->i_dtime
);
139 t
->i_gid
= ext2fs_swab16(f
->i_gid
);
140 t
->i_links_count
= ext2fs_swab16(f
->i_links_count
);
141 t
->i_blocks
= ext2fs_swab32(f
->i_blocks
);
142 t
->i_flags
= ext2fs_swab32(f
->i_flags
);
143 t
->i_file_acl
= ext2fs_swab32(f
->i_file_acl
);
144 t
->i_dir_acl
= ext2fs_swab32(f
->i_dir_acl
);
145 if (!islnk
|| ext2fs_inode_data_blocks(fs
, (struct ext2_inode
*)t
)) {
146 for (i
= 0; i
< EXT2_N_BLOCKS
; i
++)
147 t
->i_block
[i
] = ext2fs_swab32(f
->i_block
[i
]);
149 for (i
= 0; i
< EXT2_N_BLOCKS
; i
++)
150 t
->i_block
[i
] = f
->i_block
[i
];
152 t
->i_generation
= ext2fs_swab32(f
->i_generation
);
153 t
->i_faddr
= ext2fs_swab32(f
->i_faddr
);
155 switch (fs
->super
->s_creator_os
) {
157 t
->osd1
.linux1
.l_i_reserved1
=
158 ext2fs_swab32(f
->osd1
.linux1
.l_i_reserved1
);
159 t
->osd2
.linux2
.l_i_frag
= f
->osd2
.linux2
.l_i_frag
;
160 t
->osd2
.linux2
.l_i_fsize
= f
->osd2
.linux2
.l_i_fsize
;
161 t
->osd2
.linux2
.i_pad1
= ext2fs_swab16(f
->osd2
.linux2
.i_pad1
);
162 t
->osd2
.linux2
.l_i_uid_high
=
163 ext2fs_swab16 (f
->osd2
.linux2
.l_i_uid_high
);
164 t
->osd2
.linux2
.l_i_gid_high
=
165 ext2fs_swab16 (f
->osd2
.linux2
.l_i_gid_high
);
166 t
->osd2
.linux2
.l_i_reserved2
=
167 ext2fs_swab32(f
->osd2
.linux2
.l_i_reserved2
);
170 t
->osd1
.hurd1
.h_i_translator
=
171 ext2fs_swab32 (f
->osd1
.hurd1
.h_i_translator
);
172 t
->osd2
.hurd2
.h_i_frag
= f
->osd2
.hurd2
.h_i_frag
;
173 t
->osd2
.hurd2
.h_i_fsize
= f
->osd2
.hurd2
.h_i_fsize
;
174 t
->osd2
.hurd2
.h_i_mode_high
=
175 ext2fs_swab16 (f
->osd2
.hurd2
.h_i_mode_high
);
176 t
->osd2
.hurd2
.h_i_uid_high
=
177 ext2fs_swab16 (f
->osd2
.hurd2
.h_i_uid_high
);
178 t
->osd2
.hurd2
.h_i_gid_high
=
179 ext2fs_swab16 (f
->osd2
.hurd2
.h_i_gid_high
);
180 t
->osd2
.hurd2
.h_i_author
=
181 ext2fs_swab32 (f
->osd2
.hurd2
.h_i_author
);
184 t
->osd1
.masix1
.m_i_reserved1
=
185 ext2fs_swab32(f
->osd1
.masix1
.m_i_reserved1
);
186 t
->osd2
.masix2
.m_i_frag
= f
->osd2
.masix2
.m_i_frag
;
187 t
->osd2
.masix2
.m_i_fsize
= f
->osd2
.masix2
.m_i_fsize
;
188 t
->osd2
.masix2
.m_pad1
= ext2fs_swab16(f
->osd2
.masix2
.m_pad1
);
189 t
->osd2
.masix2
.m_i_reserved2
[0] =
190 ext2fs_swab32(f
->osd2
.masix2
.m_i_reserved2
[0]);
191 t
->osd2
.masix2
.m_i_reserved2
[1] =
192 ext2fs_swab32(f
->osd2
.masix2
.m_i_reserved2
[1]);
196 if (bufsize
< (int) (sizeof(struct ext2_inode
) + sizeof(__u16
)))
197 return; /* no i_extra_isize field */
199 t
->i_extra_isize
= ext2fs_swab16(f
->i_extra_isize
);
200 if (t
->i_extra_isize
> EXT2_INODE_SIZE(fs
->super
) -
201 sizeof(struct ext2_inode
)) {
202 /* this is error case: i_extra_size is too large */
206 i
= sizeof(struct ext2_inode
) + t
->i_extra_isize
+ sizeof(__u32
);
207 if (bufsize
< (int) i
)
208 return; /* no space for EA magic */
210 eaf
= (__u32
*) (((char *) f
) + sizeof(struct ext2_inode
) +
213 if (ext2fs_swab32(*eaf
) != EXT2_EXT_ATTR_MAGIC
)
214 return; /* it seems no magic here */
216 eat
= (__u32
*) (((char *) t
) + sizeof(struct ext2_inode
) +
218 *eat
= ext2fs_swab32(*eaf
);
221 ext2fs_swap_ext_attr((char *) (eat
+ 1), (char *) (eaf
+ 1),
222 bufsize
- sizeof(struct ext2_inode
) -
223 t
->i_extra_isize
- sizeof(__u32
), 0);
226 void ext2fs_swap_inode(ext2_filsys fs
, struct ext2_inode
*t
,
227 struct ext2_inode
*f
, int hostorder
)
229 ext2fs_swap_inode_full(fs
, (struct ext2_inode_large
*) t
,
230 (struct ext2_inode_large
*) f
, hostorder
,
231 sizeof(struct ext2_inode
));