Changeset View
Changeset View
Standalone View
Standalone View
sys/fs/ext2fs/ext2_inode_cnv.c
Show First 20 Lines • Show All 90 Lines • ▼ Show 20 Lines | for (i = 0; i < (in->i_blocks <= 24 ? (in->i_blocks + 1) / 2 : 12); i++) | ||||
printf(" %d", in->i_db[i]); | printf(" %d", in->i_db[i]); | ||||
printf("\n"); | printf("\n"); | ||||
} | } | ||||
} | } | ||||
#endif /* EXT2FS_PRINT_EXTENTS */ | #endif /* EXT2FS_PRINT_EXTENTS */ | ||||
#define XTIME_TO_NSEC(x) ((le32toh(x) & EXT3_NSEC_MASK) >> 2) | #define XTIME_TO_NSEC(x) ((le32toh(x) & EXT3_NSEC_MASK) >> 2) | ||||
static bool | |||||
pfg: Shouldn't all these be inline? | |||||
ext2_old_valid_dev(dev_t dev) | |||||
{ | |||||
return (major(dev) < 256 && minor(dev) < 256); | |||||
} | |||||
static uint16_t | |||||
ext2_old_encode_dev(dev_t dev) | |||||
{ | |||||
return ((major(dev) << 8) | minor(dev)); | |||||
} | |||||
static dev_t | |||||
ext2_old_decode_dev(uint16_t val) | |||||
{ | |||||
return (makedev((val >> 8) & 255, val & 255)); | |||||
} | |||||
static uint32_t | |||||
ext2_new_encode_dev(dev_t dev) | |||||
{ | |||||
unsigned maj = major(dev); | |||||
unsigned min = minor(dev); | |||||
return ((min & 0xff) | (maj << 8) | ((min & ~0xff) << 12)); | |||||
} | |||||
static dev_t | |||||
ext2_new_decode_dev(uint32_t dev) | |||||
{ | |||||
unsigned maj = (dev & 0xfff00) >> 8; | |||||
unsigned min = (dev & 0xff) | ((dev >> 12) & 0xfff00); | |||||
return (makedev(maj, min)); | |||||
} | |||||
/* | /* | ||||
* raw ext2 inode LE to host inode conversion | * raw ext2 inode LE to host inode conversion | ||||
*/ | */ | ||||
int | int | ||||
ext2_ei2i(struct ext2fs_dinode *ei, struct inode *ip) | ext2_ei2i(struct ext2fs_dinode *ei, struct inode *ip) | ||||
{ | { | ||||
struct m_ext2fs *fs = ip->i_e2fs; | struct m_ext2fs *fs = ip->i_e2fs; | ||||
uint32_t ei_flags_host; | uint32_t ei_flags_host; | ||||
▲ Show 20 Lines • Show All 60 Lines • ▼ Show 20 Lines | if (ei_flags_host & EXT4_HUGE_FILE) | ||||
ip->i_blocks = fsbtodb(ip->i_e2fs, ip->i_blocks); | ip->i_blocks = fsbtodb(ip->i_e2fs, ip->i_blocks); | ||||
} | } | ||||
ip->i_gen = le32toh(ei->e2di_gen); | ip->i_gen = le32toh(ei->e2di_gen); | ||||
ip->i_uid = le16toh(ei->e2di_uid); | ip->i_uid = le16toh(ei->e2di_uid); | ||||
ip->i_gid = le16toh(ei->e2di_gid); | ip->i_gid = le16toh(ei->e2di_gid); | ||||
ip->i_uid |= (uint32_t)le16toh(ei->e2di_uid_high) << 16; | ip->i_uid |= (uint32_t)le16toh(ei->e2di_uid_high) << 16; | ||||
ip->i_gid |= (uint32_t)le16toh(ei->e2di_gid_high) << 16; | ip->i_gid |= (uint32_t)le16toh(ei->e2di_gid_high) << 16; | ||||
if ((ip->i_flag & IN_E4EXTENTS)) { | if (S_ISCHR(ip->i_mode) || S_ISBLK(ip->i_mode)) { | ||||
if (ei->e2di_blocks[0]) | |||||
ip->i_rdev = ext2_old_decode_dev(le32toh(ei->e2di_blocks[0])); | |||||
else | |||||
ip->i_rdev = ext2_new_decode_dev(le32toh(ei->e2di_blocks[1])); | |||||
} else if ((ip->i_flag & IN_E4EXTENTS)) { | |||||
memcpy(ip->i_data, ei->e2di_blocks, sizeof(ei->e2di_blocks)); | memcpy(ip->i_data, ei->e2di_blocks, sizeof(ei->e2di_blocks)); | ||||
} else { | } else { | ||||
for (i = 0; i < EXT2_NDADDR; i++) | for (i = 0; i < EXT2_NDADDR; i++) | ||||
ip->i_db[i] = le32toh(ei->e2di_blocks[i]); | ip->i_db[i] = le32toh(ei->e2di_blocks[i]); | ||||
for (i = 0; i < EXT2_NIADDR; i++) | for (i = 0; i < EXT2_NIADDR; i++) | ||||
ip->i_ib[i] = le32toh(ei->e2di_blocks[EXT2_NDIR_BLOCKS + i]); | ip->i_ib[i] = le32toh(ei->e2di_blocks[EXT2_NDIR_BLOCKS + i]); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 58 Lines • ▼ Show 20 Lines | ext2_i2ei(struct inode *ip, struct ext2fs_dinode *ei) | ||||
ei->e2di_facl = htole32(ip->i_facl & 0xffffffff); | ei->e2di_facl = htole32(ip->i_facl & 0xffffffff); | ||||
ei->e2di_facl_high = htole16(ip->i_facl >> 32 & 0xffff); | ei->e2di_facl_high = htole16(ip->i_facl >> 32 & 0xffff); | ||||
ei->e2di_gen = htole32(ip->i_gen); | ei->e2di_gen = htole32(ip->i_gen); | ||||
ei->e2di_uid = htole16(ip->i_uid & 0xffff); | ei->e2di_uid = htole16(ip->i_uid & 0xffff); | ||||
ei->e2di_uid_high = htole16(ip->i_uid >> 16 & 0xffff); | ei->e2di_uid_high = htole16(ip->i_uid >> 16 & 0xffff); | ||||
ei->e2di_gid = htole16(ip->i_gid & 0xffff); | ei->e2di_gid = htole16(ip->i_gid & 0xffff); | ||||
ei->e2di_gid_high = htole16(ip->i_gid >> 16 & 0xffff); | ei->e2di_gid_high = htole16(ip->i_gid >> 16 & 0xffff); | ||||
if ((ip->i_flag & IN_E4EXTENTS)) { | if (S_ISCHR(ip->i_mode) || S_ISBLK(ip->i_mode)) { | ||||
if (ext2_old_valid_dev(ip->i_rdev)) { | |||||
ei->e2di_blocks[0] = htole32(ext2_old_encode_dev(ip->i_rdev)); | |||||
ei->e2di_blocks[1] = 0; | |||||
} else { | |||||
ei->e2di_blocks[0] = 0; | |||||
ei->e2di_blocks[1] = htole32(ext2_new_encode_dev(ip->i_rdev)); | |||||
ei->e2di_blocks[2] = 0; | |||||
} | |||||
} else if ((ip->i_flag & IN_E4EXTENTS)) { | |||||
memcpy(ei->e2di_blocks, ip->i_data, sizeof(ei->e2di_blocks)); | memcpy(ei->e2di_blocks, ip->i_data, sizeof(ei->e2di_blocks)); | ||||
} else { | } else { | ||||
for (i = 0; i < EXT2_NDADDR; i++) | for (i = 0; i < EXT2_NDADDR; i++) | ||||
ei->e2di_blocks[i] = htole32(ip->i_db[i]); | ei->e2di_blocks[i] = htole32(ip->i_db[i]); | ||||
for (i = 0; i < EXT2_NIADDR; i++) | for (i = 0; i < EXT2_NIADDR; i++) | ||||
ei->e2di_blocks[EXT2_NDIR_BLOCKS + i] = htole32(ip->i_ib[i]); | ei->e2di_blocks[EXT2_NDIR_BLOCKS + i] = htole32(ip->i_ib[i]); | ||||
} | } | ||||
/* Set inode csum. */ | /* Set inode csum. */ | ||||
ext2_ei_csum_set(ip, ei); | ext2_ei_csum_set(ip, ei); | ||||
return (0); | return (0); | ||||
} | } |
Shouldn't all these be inline?