From: Geert U. <Gee...@so...> - 2008-08-29 13:23:49
|
From: Geert Uytterhoeven <Gee...@so...> Convert bitfields to portable structures and use proper accessors: - squashfs_dir_* Signed-off-by: Geert Uytterhoeven <Gee...@so...> --- fs/squashfs/inode.c | 176 ++++++++++++++------------------------------ include/linux/squashfs_fs.h | 42 ++-------- 2 files changed, 65 insertions(+), 153 deletions(-) --- a/fs/squashfs/inode.c +++ b/fs/squashfs/inode.c @@ -1822,27 +1822,19 @@ static int get_dir_index_using_offset(st goto finish; for (i = 0; i < i_count; i++) { - if (SQUASHFS_SWAP_ON_READ) { - struct squashfs_dir_index sindex; - squashfs_get_cached_block(s, &sindex, index_start, - index_offset, sizeof(sindex), - &index_start, &index_offset); - SQUASHFS_SWAP_DIR_INDEX(&index, &sindex); - } else { - squashfs_get_cached_block(s, &index, index_start, - index_offset, sizeof(index), - &index_start, &index_offset); - } + squashfs_get_cached_block(s, &index, index_start, index_offset, + sizeof(index), &index_start, + &index_offset); - if (index.index > f_pos) + if (le32_to_cpu(index.index) > f_pos) break; squashfs_get_cached_block(s, NULL, index_start, index_offset, index.size + 1, &index_start, &index_offset); - length = index.index; - *next_block = index.start_block + + length = le32_to_cpu(index.index); + *next_block = le32_to_cpu(index.start_block) + le64_to_cpu(sblk->directory_table_start); } @@ -1880,17 +1872,9 @@ static int get_dir_index_using_name(stru str[size] = '\0'; for (i = 0; i < i_count; i++) { - if (SQUASHFS_SWAP_ON_READ) { - struct squashfs_dir_index sindex; - squashfs_get_cached_block(s, &sindex, index_start, - index_offset, sizeof(sindex), - &index_start, &index_offset); - SQUASHFS_SWAP_DIR_INDEX(index, &sindex); - } else - squashfs_get_cached_block(s, index, index_start, - index_offset, - sizeof(struct squashfs_dir_index), - &index_start, &index_offset); + squashfs_get_cached_block(s, index, index_start, index_offset, + sizeof(struct squashfs_dir_index), + &index_start, &index_offset); squashfs_get_cached_block(s, index->name, index_start, index_offset, index->size + 1, @@ -1901,8 +1885,8 @@ static int get_dir_index_using_name(stru if (strcmp(index->name, str) > 0) break; - length = index->index; - *next_block = index->start_block + + length = le32_to_cpu(index->index); + *next_block = le32_to_cpu(index->start_block) + le64_to_cpu(sblk->directory_table_start); } @@ -1925,6 +1909,9 @@ static int squashfs_readdir(struct file int length = 0, dir_count; struct squashfs_dir_header dirh; struct squashfs_dir_entry *dire; + unsigned int type; + u32 dirh_inode_number; + s16 dire_inode_number; TRACE("Entered squashfs_readdir [%llx:%x]\n", next_block, next_offset); @@ -1967,52 +1954,23 @@ static int squashfs_readdir(struct file file->f_pos); while (length < i_size_read(i)) { /* read directory header */ - if (SQUASHFS_SWAP_ON_READ) { - struct squashfs_dir_header sdirh; + if (!squashfs_get_cached_block(i->i_sb, &dirh, next_block, + next_offset, sizeof(dirh), + &next_block, &next_offset)) + goto failed_read; - if (!squashfs_get_cached_block(i->i_sb, &sdirh, - next_block, next_offset, sizeof(sdirh), - &next_block, &next_offset)) - goto failed_read; + length += sizeof(dirh); - length += sizeof(sdirh); - SQUASHFS_SWAP_DIR_HEADER(&dirh, &sdirh); - } else { - if (!squashfs_get_cached_block(i->i_sb, &dirh, + dir_count = dirh.count + 1; + while (dir_count--) { + if (!squashfs_get_cached_block(i->i_sb, dire, next_block, next_offset, - sizeof(dirh), + sizeof(*dire), &next_block, &next_offset)) goto failed_read; - length += sizeof(dirh); - } - - dir_count = dirh.count + 1; - while (dir_count--) { - if (SQUASHFS_SWAP_ON_READ) { - struct squashfs_dir_entry sdire; - if (!squashfs_get_cached_block(i->i_sb, &sdire, - next_block, - next_offset, - sizeof(sdire), - &next_block, - &next_offset)) - goto failed_read; - - length += sizeof(sdire); - SQUASHFS_SWAP_DIR_ENTRY(dire, &sdire); - } else { - if (!squashfs_get_cached_block(i->i_sb, dire, - next_block, - next_offset, - sizeof(*dire), - &next_block, - &next_offset)) - goto failed_read; - - length += sizeof(*dire); - } + length += sizeof(*dire); if (!squashfs_get_cached_block(i->i_sb, dire->name, next_block, next_offset, @@ -2028,17 +1986,21 @@ static int squashfs_readdir(struct file dire->name[dire->size + 1] = '\0'; + type = le16_to_cpu(dire->offset_type) >> 13; + dirh_inode_number = le32_to_cpu(dirh.inode_number); + dire_inode_number = le16_to_cpu(dire->inode_number); TRACE("Calling filldir(%p, %s, %d, %lld, %x:%x, %d, " "%d)\n", dirent, dire->name, dire->size + 1, file->f_pos, - dirh.start_block, dire->offset, - dirh.inode_number + dire->inode_number, - squashfs_filetype_table[dire->type]); + le32_to_cpu(dirh.start_block), + le16_to_cpu(dire->offset_type) & 0x1fff, + dirh_inode_number + dire_inode_number, + squashfs_filetype_table[type]); if (filldir(dirent, dire->name, dire->size + 1, file->f_pos, - dirh.inode_number + dire->inode_number, - squashfs_filetype_table[dire->type]) < 0) { + dirh_inode_number + dire_inode_number, + squashfs_filetype_table[type]) < 0) { TRACE("Filldir returned less than 0\n"); goto finish; } @@ -2092,53 +2054,23 @@ static struct dentry *squashfs_lookup(st while (length < i_size_read(i)) { /* read directory header */ - if (SQUASHFS_SWAP_ON_READ) { - struct squashfs_dir_header sdirh; - if (!squashfs_get_cached_block(i->i_sb, &sdirh, - next_block, next_offset, - sizeof(sdirh), - &next_block, - &next_offset)) - goto failed_read; + if (!squashfs_get_cached_block(i->i_sb, &dirh, next_block, + next_offset, sizeof(dirh), + &next_block, &next_offset)) + goto failed_read; - length += sizeof(sdirh); - SQUASHFS_SWAP_DIR_HEADER(&dirh, &sdirh); - } else { - if (!squashfs_get_cached_block(i->i_sb, &dirh, + length += sizeof(dirh); + + dir_count = dirh.count + 1; + while (dir_count--) { + if (!squashfs_get_cached_block(i->i_sb, dire, next_block, next_offset, - sizeof(dirh), + sizeof(*dire), &next_block, &next_offset)) goto failed_read; - length += sizeof(dirh); - } - - dir_count = dirh.count + 1; - while (dir_count--) { - if (SQUASHFS_SWAP_ON_READ) { - struct squashfs_dir_entry sdire; - if (!squashfs_get_cached_block(i->i_sb, &sdire, - next_block, - next_offset, - sizeof(sdire), - &next_block, - &next_offset)) - goto failed_read; - - length += sizeof(sdire); - SQUASHFS_SWAP_DIR_ENTRY(dire, &sdire); - } else { - if (!squashfs_get_cached_block(i->i_sb, dire, - next_block, - next_offset, - sizeof(*dire), - &next_block, - &next_offset)) - goto failed_read; - - length += sizeof(*dire); - } + length += sizeof(*dire); if (!squashfs_get_cached_block(i->i_sb, dire->name, next_block, next_offset, @@ -2154,18 +2086,24 @@ static struct dentry *squashfs_lookup(st if ((len == dire->size + 1) && !strncmp(name, dire->name, len)) { + u16 offset = + le16_to_cpu(dire->offset_type) & 0x1fff; + u32 dirh_inode_number = + le32_to_cpu(dirh.inode_number); + s16 dire_inode_number = + le16_to_cpu(dire->inode_number); + u32 start_block = le32_to_cpu(dirh.start_block); squashfs_inode_t ino = - SQUASHFS_MKINODE(dirh.start_block, - dire->offset); + SQUASHFS_MKINODE(start_block, offset); TRACE("calling squashfs_iget for directory " "entry %s, inode %x:%x, %d\n", - name, dirh.start_block, dire->offset, - dirh.inode_number + dire->inode_number); + name, start_block, offset, + dirh_inode_number + dire_inode_number); inode = squashfs_iget(i->i_sb, ino, - dirh.inode_number + - dire->inode_number); + dirh_inode_number + + dire_inode_number); goto exit_lookup; } @@ -2226,7 +2164,7 @@ static int __init init_squashfs_fs(void) goto out; printk(KERN_INFO "squashfs: version 3.4 (2008/08/26) " - "Phillip Lougher (step2-squashfs_inode_header)\n"); + "Phillip Lougher (step2-squashfs_dir)\n"); err = register_filesystem(&squashfs_fs_type); if (err) --- a/include/linux/squashfs_fs.h +++ b/include/linux/squashfs_fs.h @@ -248,8 +248,8 @@ struct squashfs_super_block { } __attribute__ ((packed)); struct squashfs_dir_index { - __u32 index; - __u32 start_block; + __le32 index; + __le32 start_block; __u8 size; unsigned char name[0]; } __attribute__ ((packed)); @@ -332,17 +332,16 @@ union squashfs_inode_header { }; struct squashfs_dir_entry { - unsigned int offset:13; - unsigned int type:3; - unsigned int size:8; - int inode_number:16; + __le16 offset_type; /* offset:13, type:3 */ + __u8 size; + __le16 inode_number; /* signed!! */ char name[0]; } __attribute__ ((packed)); struct squashfs_dir_header { - unsigned int count:8; - __u32 start_block; - __u32 inode_number; + __u8 count; + __le32 start_block; + __le32 inode_number; } __attribute__ ((packed)); struct squashfs_fragment_entry { @@ -362,31 +361,6 @@ extern int squashfs_uncompress_exit(void * */ -#define SQUASHFS_SWAP_DIR_INDEX(s, d) {\ - SQUASHFS_SWAP_START\ - SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_index));\ - SQUASHFS_SWAP((s)->index, d, 0, 32);\ - SQUASHFS_SWAP((s)->start_block, d, 32, 32);\ - SQUASHFS_SWAP((s)->size, d, 64, 8);\ -} - -#define SQUASHFS_SWAP_DIR_HEADER(s, d) {\ - SQUASHFS_SWAP_START\ - SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_header));\ - SQUASHFS_SWAP((s)->count, d, 0, 8);\ - SQUASHFS_SWAP((s)->start_block, d, 8, 32);\ - SQUASHFS_SWAP((s)->inode_number, d, 40, 32);\ -} - -#define SQUASHFS_SWAP_DIR_ENTRY(s, d) {\ - SQUASHFS_SWAP_START\ - SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_entry));\ - SQUASHFS_SWAP((s)->offset, d, 0, 13);\ - SQUASHFS_SWAP((s)->type, d, 13, 3);\ - SQUASHFS_SWAP((s)->size, d, 16, 8);\ - SQUASHFS_SWAP((s)->inode_number, d, 24, 16);\ -} - #define SQUASHFS_SWAP_FRAGMENT_ENTRY(s, d) {\ SQUASHFS_SWAP_START\ SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_fragment_entry));\ -- With kind regards, Geert Uytterhoeven Software Architect Sony Techsoft Centre Europe The Corporate Village · Da Vincilaan 7-D1 · B-1935 Zaventem · Belgium Phone: +32 (0)2 700 8453 Fax: +32 (0)2 700 8622 E-mail: Gee...@so... Internet: http://www.sony-europe.com/ A division of Sony Europe (Belgium) N.V. VAT BE 0413.825.160 · RPR Brussels Fortis · BIC GEBABEBB · IBAN BE41293037680010 |