#include typedef unsigned long __uint64_t; typedef struct xfs_bmbt_rec_64 { __uint64_t l0, l1; } xfs_bmbt_rec_64_t; typedef __uint64_t xfs_bmbt_rec_base_t; typedef xfs_bmbt_rec_64_t xfs_bmbt_rec_t, xfs_bmdr_rec_t; typedef enum { XFS_EXT_NORM, XFS_EXT_UNWRITTEN, XFS_EXT_DMAPI_OFFLINE } xfs_exntst_t; typedef struct xfs_bmbt_irec { __uint64_t br_startoff; /* starting file offset */ __uint64_t br_startblock; /* starting block number */ __uint64_t br_blockcount; /* number of blocks */ xfs_exntst_t br_state; /* extent state */ } xfs_bmbt_irec_t; #define XFS_MASK64LO(n) (((__uint64_t)1 << (n)) - 1) #define XFS_MASK64HI(n) ((__uint64_t)-1 << (64 - (n))) int main(void) { xfs_bmbt_irec_t s; xfs_bmbt_rec_t r; int extent_flag; s.br_startoff = 0; s.br_blockcount = 5; s.br_startblock = 0xfffffffffffffff0; extent_flag = (s.br_state == XFS_EXT_NORM) ? 0 : 1; printf("blockcount = 0x%llx\n", s.br_startblock); r.l0 = ((xfs_bmbt_rec_base_t)extent_flag << 63) | ((xfs_bmbt_rec_base_t)s.br_startoff << 9) | ((xfs_bmbt_rec_base_t)s.br_startblock >> 43); r.l1 = ((xfs_bmbt_rec_base_t)s.br_startblock << 21) | ((xfs_bmbt_rec_base_t)s.br_blockcount & (xfs_bmbt_rec_base_t)XFS_MASK64LO(21)); printf("l0 = 0x%llx l1 = 0x%llx\n", r.l0, r.l1); r.l0 = (r.l0 & (xfs_bmbt_rec_base_t)XFS_MASK64HI(55)) | (xfs_bmbt_rec_base_t)((__uint64_t)100 >> 43); r.l1 = (r.l1 & (xfs_bmbt_rec_base_t)XFS_MASK64LO(21)) | (xfs_bmbt_rec_base_t)((__uint64_t)100 << 21); printf("l0 = 0x%llx l1 = 0x%llx\n", r.l0, r.l1); return 0; }