Commit a9721f31 authored by Al Viro's avatar Al Viro Committed by Linus Torvalds

[PATCH] befs: endianness annotations

split the data structures that exist in host- and disk-endian variants,
annotate the fields of disk-endian ones, propagate changes.
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent e5201c58
...@@ -94,7 +94,7 @@ void befs_debug(const struct super_block *sb, const char *fmt, ...); ...@@ -94,7 +94,7 @@ void befs_debug(const struct super_block *sb, const char *fmt, ...);
void befs_dump_super_block(const struct super_block *sb, befs_super_block *); void befs_dump_super_block(const struct super_block *sb, befs_super_block *);
void befs_dump_inode(const struct super_block *sb, befs_inode *); void befs_dump_inode(const struct super_block *sb, befs_inode *);
void befs_dump_index_entry(const struct super_block *sb, befs_btree_super *); void befs_dump_index_entry(const struct super_block *sb, befs_disk_btree_super *);
void befs_dump_index_node(const struct super_block *sb, befs_btree_nodehead *); void befs_dump_index_node(const struct super_block *sb, befs_btree_nodehead *);
/****************************/ /****************************/
...@@ -136,7 +136,7 @@ blockno2iaddr(struct super_block *sb, befs_blocknr_t blockno) ...@@ -136,7 +136,7 @@ blockno2iaddr(struct super_block *sb, befs_blocknr_t blockno)
static inline unsigned int static inline unsigned int
befs_iaddrs_per_block(struct super_block *sb) befs_iaddrs_per_block(struct super_block *sb)
{ {
return BEFS_SB(sb)->block_size / sizeof (befs_inode_addr); return BEFS_SB(sb)->block_size / sizeof (befs_disk_inode_addr);
} }
static inline int static inline int
......
...@@ -84,15 +84,22 @@ typedef u32 __bitwise fs32; ...@@ -84,15 +84,22 @@ typedef u32 __bitwise fs32;
typedef u16 __bitwise fs16; typedef u16 __bitwise fs16;
typedef u64 befs_off_t; typedef u64 befs_off_t;
typedef u64 befs_time_t; typedef fs64 befs_time_t;
/* Block runs */ /* Block runs */
typedef struct {
fs32 allocation_group;
fs16 start;
fs16 len;
} PACKED befs_disk_block_run;
typedef struct { typedef struct {
u32 allocation_group; u32 allocation_group;
u16 start; u16 start;
u16 len; u16 len;
} PACKED befs_block_run; } PACKED befs_block_run;
typedef befs_disk_block_run befs_disk_inode_addr;
typedef befs_block_run befs_inode_addr; typedef befs_block_run befs_inode_addr;
/* /*
...@@ -100,31 +107,31 @@ typedef befs_block_run befs_inode_addr; ...@@ -100,31 +107,31 @@ typedef befs_block_run befs_inode_addr;
*/ */
typedef struct { typedef struct {
char name[B_OS_NAME_LENGTH]; char name[B_OS_NAME_LENGTH];
u32 magic1; fs32 magic1;
u32 fs_byte_order; fs32 fs_byte_order;
u32 block_size; fs32 block_size;
u32 block_shift; fs32 block_shift;
befs_off_t num_blocks; fs64 num_blocks;
befs_off_t used_blocks; fs64 used_blocks;
u32 inode_size; fs32 inode_size;
u32 magic2; fs32 magic2;
u32 blocks_per_ag; fs32 blocks_per_ag;
u32 ag_shift; fs32 ag_shift;
u32 num_ags; fs32 num_ags;
u32 flags; fs32 flags;
befs_block_run log_blocks; befs_disk_block_run log_blocks;
befs_off_t log_start; fs64 log_start;
befs_off_t log_end; fs64 log_end;
u32 magic3; fs32 magic3;
befs_inode_addr root_dir; befs_disk_inode_addr root_dir;
befs_inode_addr indices; befs_disk_inode_addr indices;
} PACKED befs_super_block; } PACKED befs_super_block;
...@@ -132,6 +139,16 @@ typedef struct { ...@@ -132,6 +139,16 @@ typedef struct {
* Note: the indirect and dbl_indir block_runs may * Note: the indirect and dbl_indir block_runs may
* be longer than one block! * be longer than one block!
*/ */
typedef struct {
befs_disk_block_run direct[BEFS_NUM_DIRECT_BLOCKS];
fs64 max_direct_range;
befs_disk_block_run indirect;
fs64 max_indirect_range;
befs_disk_block_run double_indirect;
fs64 max_double_indirect_range;
fs64 size;
} PACKED befs_disk_data_stream;
typedef struct { typedef struct {
befs_block_run direct[BEFS_NUM_DIRECT_BLOCKS]; befs_block_run direct[BEFS_NUM_DIRECT_BLOCKS];
befs_off_t max_direct_range; befs_off_t max_direct_range;
...@@ -144,35 +161,35 @@ typedef struct { ...@@ -144,35 +161,35 @@ typedef struct {
/* Attribute */ /* Attribute */
typedef struct { typedef struct {
u32 type; fs32 type;
u16 name_size; fs16 name_size;
u16 data_size; fs16 data_size;
char name[1]; char name[1];
} PACKED befs_small_data; } PACKED befs_small_data;
/* Inode structure */ /* Inode structure */
typedef struct { typedef struct {
u32 magic1; fs32 magic1;
befs_inode_addr inode_num; befs_disk_inode_addr inode_num;
u32 uid; fs32 uid;
u32 gid; fs32 gid;
u32 mode; fs32 mode;
u32 flags; fs32 flags;
befs_time_t create_time; befs_time_t create_time;
befs_time_t last_modified_time; befs_time_t last_modified_time;
befs_inode_addr parent; befs_disk_inode_addr parent;
befs_inode_addr attributes; befs_disk_inode_addr attributes;
u32 type; fs32 type;
u32 inode_size; fs32 inode_size;
u32 etc; /* not use */ fs32 etc; /* not use */
union { union {
befs_data_stream datastream; befs_disk_data_stream datastream;
char symlink[BEFS_SYMLINK_LEN]; char symlink[BEFS_SYMLINK_LEN];
} data; } data;
u32 pad[4]; /* not use */ fs32 pad[4]; /* not use */
befs_small_data small_data[1]; befs_small_data small_data[1];
} PACKED befs_inode; } PACKED befs_inode;
...@@ -192,6 +209,16 @@ enum btree_types { ...@@ -192,6 +209,16 @@ enum btree_types {
BTREE_DOUBLE_TYPE = 6 BTREE_DOUBLE_TYPE = 6
}; };
typedef struct {
fs32 magic;
fs32 node_size;
fs32 max_depth;
fs32 data_type;
fs64 root_node_ptr;
fs64 free_node_ptr;
fs64 max_size;
} PACKED befs_disk_btree_super;
typedef struct { typedef struct {
u32 magic; u32 magic;
u32 node_size; u32 node_size;
...@@ -205,12 +232,20 @@ typedef struct { ...@@ -205,12 +232,20 @@ typedef struct {
/* /*
* Header stucture of each btree node * Header stucture of each btree node
*/ */
typedef struct {
fs64 left;
fs64 right;
fs64 overflow;
fs16 all_key_count;
fs16 all_key_length;
} PACKED befs_btree_nodehead;
typedef struct { typedef struct {
befs_off_t left; befs_off_t left;
befs_off_t right; befs_off_t right;
befs_off_t overflow; befs_off_t overflow;
u16 all_key_count; u16 all_key_count;
u16 all_key_length; u16 all_key_length;
} PACKED befs_btree_nodehead; } PACKED befs_host_btree_nodehead;
#endif /* _LINUX_BEFS_FS_TYPES */ #endif /* _LINUX_BEFS_FS_TYPES */
...@@ -79,7 +79,7 @@ ...@@ -79,7 +79,7 @@
* In memory structure of each btree node * In memory structure of each btree node
*/ */
typedef struct { typedef struct {
befs_btree_nodehead head; /* head of node converted to cpu byteorder */ befs_host_btree_nodehead head; /* head of node converted to cpu byteorder */
struct buffer_head *bh; struct buffer_head *bh;
befs_btree_nodehead *od_node; /* on disk node */ befs_btree_nodehead *od_node; /* on disk node */
} befs_btree_node; } befs_btree_node;
...@@ -101,9 +101,9 @@ static int befs_bt_read_node(struct super_block *sb, befs_data_stream * ds, ...@@ -101,9 +101,9 @@ static int befs_bt_read_node(struct super_block *sb, befs_data_stream * ds,
static int befs_leafnode(befs_btree_node * node); static int befs_leafnode(befs_btree_node * node);
static u16 *befs_bt_keylen_index(befs_btree_node * node); static fs16 *befs_bt_keylen_index(befs_btree_node * node);
static befs_off_t *befs_bt_valarray(befs_btree_node * node); static fs64 *befs_bt_valarray(befs_btree_node * node);
static char *befs_bt_keydata(befs_btree_node * node); static char *befs_bt_keydata(befs_btree_node * node);
...@@ -135,7 +135,7 @@ befs_bt_read_super(struct super_block *sb, befs_data_stream * ds, ...@@ -135,7 +135,7 @@ befs_bt_read_super(struct super_block *sb, befs_data_stream * ds,
befs_btree_super * sup) befs_btree_super * sup)
{ {
struct buffer_head *bh = NULL; struct buffer_head *bh = NULL;
befs_btree_super *od_sup = NULL; befs_disk_btree_super *od_sup = NULL;
befs_debug(sb, "---> befs_btree_read_super()"); befs_debug(sb, "---> befs_btree_read_super()");
...@@ -145,7 +145,7 @@ befs_bt_read_super(struct super_block *sb, befs_data_stream * ds, ...@@ -145,7 +145,7 @@ befs_bt_read_super(struct super_block *sb, befs_data_stream * ds,
befs_error(sb, "Couldn't read index header."); befs_error(sb, "Couldn't read index header.");
goto error; goto error;
} }
od_sup = (befs_btree_super *) bh->b_data; od_sup = (befs_disk_btree_super *) bh->b_data;
befs_dump_index_entry(sb, od_sup); befs_dump_index_entry(sb, od_sup);
sup->magic = fs32_to_cpu(sb, od_sup->magic); sup->magic = fs32_to_cpu(sb, od_sup->magic);
...@@ -341,7 +341,7 @@ befs_find_key(struct super_block *sb, befs_btree_node * node, ...@@ -341,7 +341,7 @@ befs_find_key(struct super_block *sb, befs_btree_node * node,
u16 keylen; u16 keylen;
int findkey_len; int findkey_len;
char *thiskey; char *thiskey;
befs_off_t *valarray; fs64 *valarray;
befs_debug(sb, "---> befs_find_key() %s", findkey); befs_debug(sb, "---> befs_find_key() %s", findkey);
...@@ -421,7 +421,7 @@ befs_btree_read(struct super_block *sb, befs_data_stream * ds, ...@@ -421,7 +421,7 @@ befs_btree_read(struct super_block *sb, befs_data_stream * ds,
befs_btree_super bt_super; befs_btree_super bt_super;
befs_off_t node_off = 0; befs_off_t node_off = 0;
int cur_key; int cur_key;
befs_off_t *valarray; fs64 *valarray;
char *keystart; char *keystart;
u16 keylen; u16 keylen;
int res; int res;
...@@ -571,7 +571,7 @@ befs_btree_seekleaf(struct super_block *sb, befs_data_stream * ds, ...@@ -571,7 +571,7 @@ befs_btree_seekleaf(struct super_block *sb, befs_data_stream * ds,
this_node->head.overflow); this_node->head.overflow);
*node_off = this_node->head.overflow; *node_off = this_node->head.overflow;
} else { } else {
befs_off_t *valarray = befs_bt_valarray(this_node); fs64 *valarray = befs_bt_valarray(this_node);
*node_off = fs64_to_cpu(sb, valarray[0]); *node_off = fs64_to_cpu(sb, valarray[0]);
} }
if (befs_bt_read_node(sb, ds, this_node, *node_off) != BEFS_OK) { if (befs_bt_read_node(sb, ds, this_node, *node_off) != BEFS_OK) {
...@@ -621,7 +621,7 @@ befs_leafnode(befs_btree_node * node) ...@@ -621,7 +621,7 @@ befs_leafnode(befs_btree_node * node)
* *
* Except that rounding up to 8 works, and rounding up to 4 doesn't. * Except that rounding up to 8 works, and rounding up to 4 doesn't.
*/ */
static u16 * static fs16 *
befs_bt_keylen_index(befs_btree_node * node) befs_bt_keylen_index(befs_btree_node * node)
{ {
const int keylen_align = 8; const int keylen_align = 8;
...@@ -632,7 +632,7 @@ befs_bt_keylen_index(befs_btree_node * node) ...@@ -632,7 +632,7 @@ befs_bt_keylen_index(befs_btree_node * node)
if (tmp) if (tmp)
off += keylen_align - tmp; off += keylen_align - tmp;
return (u16 *) ((void *) node->od_node + off); return (fs16 *) ((void *) node->od_node + off);
} }
/** /**
...@@ -642,13 +642,13 @@ befs_bt_keylen_index(befs_btree_node * node) ...@@ -642,13 +642,13 @@ befs_bt_keylen_index(befs_btree_node * node)
* Returns a pointer to the start of the value array * Returns a pointer to the start of the value array
* of the node pointed to by the node header * of the node pointed to by the node header
*/ */
static befs_off_t * static fs64 *
befs_bt_valarray(befs_btree_node * node) befs_bt_valarray(befs_btree_node * node)
{ {
void *keylen_index_start = (void *) befs_bt_keylen_index(node); void *keylen_index_start = (void *) befs_bt_keylen_index(node);
size_t keylen_index_size = node->head.all_key_count * sizeof (u16); size_t keylen_index_size = node->head.all_key_count * sizeof (fs16);
return (befs_off_t *) (keylen_index_start + keylen_index_size); return (fs64 *) (keylen_index_start + keylen_index_size);
} }
/** /**
...@@ -680,7 +680,7 @@ befs_bt_get_key(struct super_block *sb, befs_btree_node * node, ...@@ -680,7 +680,7 @@ befs_bt_get_key(struct super_block *sb, befs_btree_node * node,
{ {
int prev_key_end; int prev_key_end;
char *keystart; char *keystart;
u16 *keylen_index; fs16 *keylen_index;
if (index < 0 || index > node->head.all_key_count) { if (index < 0 || index > node->head.all_key_count) {
*keylen = 0; *keylen = 0;
......
...@@ -311,7 +311,7 @@ befs_find_brun_indirect(struct super_block *sb, ...@@ -311,7 +311,7 @@ befs_find_brun_indirect(struct super_block *sb,
befs_blocknr_t indir_start_blk; befs_blocknr_t indir_start_blk;
befs_blocknr_t search_blk; befs_blocknr_t search_blk;
struct buffer_head *indirblock; struct buffer_head *indirblock;
befs_block_run *array; befs_disk_block_run *array;
befs_block_run indirect = data->indirect; befs_block_run indirect = data->indirect;
befs_blocknr_t indirblockno = iaddr2blockno(sb, &indirect); befs_blocknr_t indirblockno = iaddr2blockno(sb, &indirect);
...@@ -333,7 +333,7 @@ befs_find_brun_indirect(struct super_block *sb, ...@@ -333,7 +333,7 @@ befs_find_brun_indirect(struct super_block *sb,
return BEFS_ERR; return BEFS_ERR;
} }
array = (befs_block_run *) indirblock->b_data; array = (befs_disk_block_run *) indirblock->b_data;
for (j = 0; j < arraylen; ++j) { for (j = 0; j < arraylen; ++j) {
int len = fs16_to_cpu(sb, array[j].len); int len = fs16_to_cpu(sb, array[j].len);
...@@ -426,7 +426,7 @@ befs_find_brun_dblindirect(struct super_block *sb, ...@@ -426,7 +426,7 @@ befs_find_brun_dblindirect(struct super_block *sb,
struct buffer_head *dbl_indir_block; struct buffer_head *dbl_indir_block;
struct buffer_head *indir_block; struct buffer_head *indir_block;
befs_block_run indir_run; befs_block_run indir_run;
befs_inode_addr *iaddr_array = NULL; befs_disk_inode_addr *iaddr_array = NULL;
befs_sb_info *befs_sb = BEFS_SB(sb); befs_sb_info *befs_sb = BEFS_SB(sb);
befs_blocknr_t indir_start_blk = befs_blocknr_t indir_start_blk =
...@@ -481,7 +481,7 @@ befs_find_brun_dblindirect(struct super_block *sb, ...@@ -481,7 +481,7 @@ befs_find_brun_dblindirect(struct super_block *sb,
dbl_block_indx = dbl_block_indx =
dblindir_indx - (dbl_which_block * befs_iaddrs_per_block(sb)); dblindir_indx - (dbl_which_block * befs_iaddrs_per_block(sb));
iaddr_array = (befs_inode_addr *) dbl_indir_block->b_data; iaddr_array = (befs_disk_inode_addr *) dbl_indir_block->b_data;
indir_run = fsrun_to_cpu(sb, iaddr_array[dbl_block_indx]); indir_run = fsrun_to_cpu(sb, iaddr_array[dbl_block_indx]);
brelse(dbl_indir_block); brelse(dbl_indir_block);
iaddr_array = NULL; iaddr_array = NULL;
...@@ -506,7 +506,7 @@ befs_find_brun_dblindirect(struct super_block *sb, ...@@ -506,7 +506,7 @@ befs_find_brun_dblindirect(struct super_block *sb,
} }
block_indx = indir_indx - (which_block * befs_iaddrs_per_block(sb)); block_indx = indir_indx - (which_block * befs_iaddrs_per_block(sb));
iaddr_array = (befs_inode_addr *) indir_block->b_data; iaddr_array = (befs_disk_inode_addr *) indir_block->b_data;
*run = fsrun_to_cpu(sb, iaddr_array[block_indx]); *run = fsrun_to_cpu(sb, iaddr_array[block_indx]);
brelse(indir_block); brelse(indir_block);
iaddr_array = NULL; iaddr_array = NULL;
......
...@@ -230,21 +230,20 @@ befs_dump_small_data(const struct super_block *sb, befs_small_data * sd) ...@@ -230,21 +230,20 @@ befs_dump_small_data(const struct super_block *sb, befs_small_data * sd)
/* unused */ /* unused */
void void
befs_dump_run(const struct super_block *sb, befs_block_run run) befs_dump_run(const struct super_block *sb, befs_disk_block_run run)
{ {
#ifdef CONFIG_BEFS_DEBUG #ifdef CONFIG_BEFS_DEBUG
run = fsrun_to_cpu(sb, run); befs_block_run n = fsrun_to_cpu(sb, run);
befs_debug(sb, "[%u, %hu, %hu]", befs_debug(sb, "[%u, %hu, %hu]", n.allocation_group, n.start, n.len);
run.allocation_group, run.start, run.len);
#endif //CONFIG_BEFS_DEBUG #endif //CONFIG_BEFS_DEBUG
} }
#endif /* 0 */ #endif /* 0 */
void void
befs_dump_index_entry(const struct super_block *sb, befs_btree_super * super) befs_dump_index_entry(const struct super_block *sb, befs_disk_btree_super * super)
{ {
#ifdef CONFIG_BEFS_DEBUG #ifdef CONFIG_BEFS_DEBUG
......
...@@ -68,26 +68,26 @@ cpu_to_fs16(const struct super_block *sb, u16 n) ...@@ -68,26 +68,26 @@ cpu_to_fs16(const struct super_block *sb, u16 n)
/* Composite types below here */ /* Composite types below here */
static inline befs_block_run static inline befs_block_run
fsrun_to_cpu(const struct super_block *sb, befs_block_run n) fsrun_to_cpu(const struct super_block *sb, befs_disk_block_run n)
{ {
befs_block_run run; befs_block_run run;
if (BEFS_SB(sb)->byte_order == BEFS_BYTESEX_LE) { if (BEFS_SB(sb)->byte_order == BEFS_BYTESEX_LE) {
run.allocation_group = le32_to_cpu(n.allocation_group); run.allocation_group = le32_to_cpu((__force __le32)n.allocation_group);
run.start = le16_to_cpu(n.start); run.start = le16_to_cpu((__force __le16)n.start);
run.len = le16_to_cpu(n.len); run.len = le16_to_cpu((__force __le16)n.len);
} else { } else {
run.allocation_group = be32_to_cpu(n.allocation_group); run.allocation_group = be32_to_cpu((__force __be32)n.allocation_group);
run.start = be16_to_cpu(n.start); run.start = be16_to_cpu((__force __be16)n.start);
run.len = be16_to_cpu(n.len); run.len = be16_to_cpu((__force __be16)n.len);
} }
return run; return run;
} }
static inline befs_block_run static inline befs_disk_block_run
cpu_to_fsrun(const struct super_block *sb, befs_block_run n) cpu_to_fsrun(const struct super_block *sb, befs_block_run n)
{ {
befs_block_run run; befs_disk_block_run run;
if (BEFS_SB(sb)->byte_order == BEFS_BYTESEX_LE) { if (BEFS_SB(sb)->byte_order == BEFS_BYTESEX_LE) {
run.allocation_group = cpu_to_le32(n.allocation_group); run.allocation_group = cpu_to_le32(n.allocation_group);
...@@ -102,7 +102,7 @@ cpu_to_fsrun(const struct super_block *sb, befs_block_run n) ...@@ -102,7 +102,7 @@ cpu_to_fsrun(const struct super_block *sb, befs_block_run n)
} }
static inline befs_data_stream static inline befs_data_stream
fsds_to_cpu(const struct super_block *sb, befs_data_stream n) fsds_to_cpu(const struct super_block *sb, befs_disk_data_stream n)
{ {
befs_data_stream data; befs_data_stream data;
int i; int i;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment