static int fill_inode_item(struct btrfs_trans_handle *trans, struct btrfs_root *root, struct btrfs_inode_item *dst, struct stat *src) { u64 blocks = 0; u64 sectorsize = root->sectorsize; /* * btrfs_inode_item has some reserved fields * and represents on-disk inode entry, so * zero everything to prevent information leak */ memset(dst, 0, sizeof (*dst)); btrfs_set_stack_inode_generation(dst, trans->transid); btrfs_set_stack_inode_size(dst, src->st_size); btrfs_set_stack_inode_nbytes(dst, 0); btrfs_set_stack_inode_block_group(dst, 0); btrfs_set_stack_inode_nlink(dst, src->st_nlink); btrfs_set_stack_inode_uid(dst, src->st_uid); btrfs_set_stack_inode_gid(dst, src->st_gid); btrfs_set_stack_inode_mode(dst, src->st_mode); btrfs_set_stack_inode_rdev(dst, 0); btrfs_set_stack_inode_flags(dst, 0); btrfs_set_stack_timespec_sec(&dst->atime, src->st_atime); btrfs_set_stack_timespec_nsec(&dst->atime, 0); btrfs_set_stack_timespec_sec(&dst->ctime, src->st_ctime); btrfs_set_stack_timespec_nsec(&dst->ctime, 0); btrfs_set_stack_timespec_sec(&dst->mtime, src->st_mtime); btrfs_set_stack_timespec_nsec(&dst->mtime, 0); btrfs_set_stack_timespec_sec(&dst->otime, 0); btrfs_set_stack_timespec_nsec(&dst->otime, 0); if (S_ISDIR(src->st_mode)) { btrfs_set_stack_inode_size(dst, 0); btrfs_set_stack_inode_nlink(dst, 1); } if (S_ISREG(src->st_mode)) { btrfs_set_stack_inode_size(dst, (u64)src->st_size); if (src->st_size <= BTRFS_MAX_INLINE_DATA_SIZE(root)) btrfs_set_stack_inode_nbytes(dst, src->st_size); else { blocks = src->st_size / sectorsize; if (src->st_size % sectorsize) blocks += 1; blocks *= sectorsize; btrfs_set_stack_inode_nbytes(dst, blocks); } } if (S_ISLNK(src->st_mode)) btrfs_set_stack_inode_nbytes(dst, src->st_size + 1); return 0; }
/* Fill inode item with 'mode'. Uid/gid to root/root */ static void fill_inode_item(struct btrfs_trans_handle *trans, struct btrfs_inode_item *inode_item, u32 mode, u32 nlink) { time_t now = time(NULL); btrfs_set_stack_inode_generation(inode_item, trans->transid); btrfs_set_stack_inode_uid(inode_item, 0); btrfs_set_stack_inode_gid(inode_item, 0); btrfs_set_stack_inode_size(inode_item, 0); btrfs_set_stack_inode_mode(inode_item, mode); btrfs_set_stack_inode_nlink(inode_item, nlink); btrfs_set_stack_timespec_sec(&inode_item->atime, now); btrfs_set_stack_timespec_nsec(&inode_item->atime, 0); btrfs_set_stack_timespec_sec(&inode_item->mtime, now); btrfs_set_stack_timespec_nsec(&inode_item->mtime, 0); btrfs_set_stack_timespec_sec(&inode_item->ctime, now); btrfs_set_stack_timespec_nsec(&inode_item->ctime, 0); }