1ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#ifndef FIO_OS_ANDROID_H 2ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#define FIO_OS_ANDROID_H 3ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 4ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#define FIO_OS os_android 5ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 6ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#include <sys/ioctl.h> 7ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#include <sys/uio.h> 8ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#include <sys/syscall.h> 9ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#include <sys/vfs.h> 10ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#include <unistd.h> 11ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#include <fcntl.h> 12ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#include <errno.h> 13ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#include <sched.h> 14ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#include <linux/major.h> 15da52c582b76a8752ad3dd113696c9debcb3449e8Aaron Carroll#include <asm/byteorder.h> 163c77c1316cdd85e5c6dbb3d506e5fab44e5407ecMohamad Ayyash#include <byteswap.h> 17ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 18ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#include "binject.h" 19ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#include "../file.h" 20ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 21ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#define FIO_HAVE_DISK_UTIL 22ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#define FIO_HAVE_IOSCHED_SWITCH 23177380abbea4d8963513bd8ce1859bf3bc5a2f28Aaron Carroll#define FIO_HAVE_IOPRIO 24ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#define FIO_HAVE_ODIRECT 25ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#define FIO_HAVE_HUGETLB 26ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#define FIO_HAVE_BLKTRACE 27ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#define FIO_HAVE_PSHARED_MUTEX 28ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#define FIO_HAVE_CL_SIZE 29ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#define FIO_HAVE_FS_STAT 30ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#define FIO_HAVE_TRIM 31ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#define FIO_HAVE_GETTID 32ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#define FIO_USE_GENERIC_INIT_RANDOM_STATE 33ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#define FIO_HAVE_E4_ENG 34ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#define FIO_HAVE_BYTEORDER_FUNCS 356d0e9f83bdc1b9014ffb7200f923372de29eb713Aaron Carroll#define FIO_HAVE_MMAP_HUGE 36a5e0ee11ec34cfc70a78aee4f7a2eeb01d9cf41fOleg#define FIO_NO_HAVE_SHM_H 37ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 38ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#define OS_MAP_ANON MAP_ANONYMOUS 39ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 40ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#define posix_madvise madvise 41ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#define POSIX_MADV_DONTNEED MADV_DONTNEED 42ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#define POSIX_MADV_SEQUENTIAL MADV_SEQUENTIAL 43ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#define POSIX_MADV_RANDOM MADV_RANDOM 44ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#ifdef MADV_REMOVE 45ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#define FIO_MADV_FREE MADV_REMOVE 46ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#endif 47a5e0ee11ec34cfc70a78aee4f7a2eeb01d9cf41fOleg#ifndef MAP_HUGETLB 48a5e0ee11ec34cfc70a78aee4f7a2eeb01d9cf41fOleg#define MAP_HUGETLB 0x40000 /* arch specific */ 49a5e0ee11ec34cfc70a78aee4f7a2eeb01d9cf41fOleg#endif 50ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 51ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 52ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll/* 53ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll * The Android NDK doesn't currently export <sys/shm.h>, so define the 54ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll * necessary stuff here. 55ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll */ 56ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 57ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#include <linux/shm.h> 58ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#define SHM_HUGETLB 04000 59ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 60239a11de15959849a69508ff7cb46be114599bafAkers, Jason B#include <stdio.h> 61239a11de15959849a69508ff7cb46be114599bafAkers, Jason B#include <linux/ashmem.h> 62239a11de15959849a69508ff7cb46be114599bafAkers, Jason B#include <sys/mman.h> 63239a11de15959849a69508ff7cb46be114599bafAkers, Jason B 64239a11de15959849a69508ff7cb46be114599bafAkers, Jason B#define ASHMEM_DEVICE "/dev/ashmem" 65239a11de15959849a69508ff7cb46be114599bafAkers, Jason B 66ec5c6b125c1eab992882602158bab54957aa733dAaron Carrollstatic inline int shmctl (int __shmid, int __cmd, struct shmid_ds *__buf) 67ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll{ 68239a11de15959849a69508ff7cb46be114599bafAkers, Jason B int ret=0; 69239a11de15959849a69508ff7cb46be114599bafAkers, Jason B if (__cmd == IPC_RMID) 70239a11de15959849a69508ff7cb46be114599bafAkers, Jason B { 71239a11de15959849a69508ff7cb46be114599bafAkers, Jason B int length = ioctl(__shmid, ASHMEM_GET_SIZE, NULL); 72239a11de15959849a69508ff7cb46be114599bafAkers, Jason B struct ashmem_pin pin = {0 , length}; 73239a11de15959849a69508ff7cb46be114599bafAkers, Jason B ret = ioctl(__shmid, ASHMEM_UNPIN, &pin); 74239a11de15959849a69508ff7cb46be114599bafAkers, Jason B close(__shmid); 75239a11de15959849a69508ff7cb46be114599bafAkers, Jason B } 76239a11de15959849a69508ff7cb46be114599bafAkers, Jason B return ret; 77ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll} 78ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 79ec5c6b125c1eab992882602158bab54957aa733dAaron Carrollstatic inline int shmget (key_t __key, size_t __size, int __shmflg) 80ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll{ 81239a11de15959849a69508ff7cb46be114599bafAkers, Jason B int fd,ret; 82239a11de15959849a69508ff7cb46be114599bafAkers, Jason B char key[11]; 83239a11de15959849a69508ff7cb46be114599bafAkers, Jason B 84239a11de15959849a69508ff7cb46be114599bafAkers, Jason B fd = open(ASHMEM_DEVICE, O_RDWR); 85239a11de15959849a69508ff7cb46be114599bafAkers, Jason B if (fd < 0) 86239a11de15959849a69508ff7cb46be114599bafAkers, Jason B return fd; 87239a11de15959849a69508ff7cb46be114599bafAkers, Jason B 88239a11de15959849a69508ff7cb46be114599bafAkers, Jason B sprintf(key,"%d",__key); 89239a11de15959849a69508ff7cb46be114599bafAkers, Jason B ret = ioctl(fd, ASHMEM_SET_NAME, key); 90239a11de15959849a69508ff7cb46be114599bafAkers, Jason B if (ret < 0) 91239a11de15959849a69508ff7cb46be114599bafAkers, Jason B goto error; 92239a11de15959849a69508ff7cb46be114599bafAkers, Jason B 93239a11de15959849a69508ff7cb46be114599bafAkers, Jason B ret = ioctl(fd, ASHMEM_SET_SIZE, __size); 94239a11de15959849a69508ff7cb46be114599bafAkers, Jason B if (ret < 0) 95239a11de15959849a69508ff7cb46be114599bafAkers, Jason B goto error; 96239a11de15959849a69508ff7cb46be114599bafAkers, Jason B 97239a11de15959849a69508ff7cb46be114599bafAkers, Jason B return fd; 98239a11de15959849a69508ff7cb46be114599bafAkers, Jason B 99239a11de15959849a69508ff7cb46be114599bafAkers, Jason Berror: 100239a11de15959849a69508ff7cb46be114599bafAkers, Jason B close(fd); 101239a11de15959849a69508ff7cb46be114599bafAkers, Jason B return ret; 102ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll} 103ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 104ec5c6b125c1eab992882602158bab54957aa733dAaron Carrollstatic inline void *shmat (int __shmid, const void *__shmaddr, int __shmflg) 105ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll{ 106239a11de15959849a69508ff7cb46be114599bafAkers, Jason B size_t *ptr, size = ioctl(__shmid, ASHMEM_GET_SIZE, NULL); 107239a11de15959849a69508ff7cb46be114599bafAkers, Jason B ptr = mmap(NULL, size + sizeof(size_t), PROT_READ | PROT_WRITE, MAP_SHARED, __shmid, 0); 108239a11de15959849a69508ff7cb46be114599bafAkers, Jason B *ptr = size; //save size at beginning of buffer, for use with munmap 109239a11de15959849a69508ff7cb46be114599bafAkers, Jason B return &ptr[1]; 110ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll} 111ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 112ec5c6b125c1eab992882602158bab54957aa733dAaron Carrollstatic inline int shmdt (const void *__shmaddr) 113ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll{ 114239a11de15959849a69508ff7cb46be114599bafAkers, Jason B size_t *ptr, size; 115239a11de15959849a69508ff7cb46be114599bafAkers, Jason B ptr = (size_t *)__shmaddr; 116239a11de15959849a69508ff7cb46be114599bafAkers, Jason B ptr--; 117239a11de15959849a69508ff7cb46be114599bafAkers, Jason B size = *ptr; //find mmap size which we stored at the beginning of the buffer 118239a11de15959849a69508ff7cb46be114599bafAkers, Jason B return munmap((void *)ptr, size + sizeof(size_t)); 119ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll} 120ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 121ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#define SPLICE_DEF_SIZE (64*1024) 122ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 123177380abbea4d8963513bd8ce1859bf3bc5a2f28Aaron Carrollenum { 124177380abbea4d8963513bd8ce1859bf3bc5a2f28Aaron Carroll IOPRIO_CLASS_NONE, 125177380abbea4d8963513bd8ce1859bf3bc5a2f28Aaron Carroll IOPRIO_CLASS_RT, 126177380abbea4d8963513bd8ce1859bf3bc5a2f28Aaron Carroll IOPRIO_CLASS_BE, 127177380abbea4d8963513bd8ce1859bf3bc5a2f28Aaron Carroll IOPRIO_CLASS_IDLE, 128177380abbea4d8963513bd8ce1859bf3bc5a2f28Aaron Carroll}; 129177380abbea4d8963513bd8ce1859bf3bc5a2f28Aaron Carroll 130177380abbea4d8963513bd8ce1859bf3bc5a2f28Aaron Carrollenum { 131177380abbea4d8963513bd8ce1859bf3bc5a2f28Aaron Carroll IOPRIO_WHO_PROCESS = 1, 132177380abbea4d8963513bd8ce1859bf3bc5a2f28Aaron Carroll IOPRIO_WHO_PGRP, 133177380abbea4d8963513bd8ce1859bf3bc5a2f28Aaron Carroll IOPRIO_WHO_USER, 134177380abbea4d8963513bd8ce1859bf3bc5a2f28Aaron Carroll}; 135177380abbea4d8963513bd8ce1859bf3bc5a2f28Aaron Carroll 136177380abbea4d8963513bd8ce1859bf3bc5a2f28Aaron Carroll#define IOPRIO_BITS 16 137177380abbea4d8963513bd8ce1859bf3bc5a2f28Aaron Carroll#define IOPRIO_CLASS_SHIFT 13 138177380abbea4d8963513bd8ce1859bf3bc5a2f28Aaron Carroll 139a415b2ccee389e27a2d5c8cdb28de9dbd65cea57Aaron Carrollstatic inline int ioprio_set(int which, int who, int ioprio_class, int ioprio) 140a415b2ccee389e27a2d5c8cdb28de9dbd65cea57Aaron Carroll{ 141a415b2ccee389e27a2d5c8cdb28de9dbd65cea57Aaron Carroll /* 142a415b2ccee389e27a2d5c8cdb28de9dbd65cea57Aaron Carroll * If no class is set, assume BE 143a415b2ccee389e27a2d5c8cdb28de9dbd65cea57Aaron Carroll */ 144a415b2ccee389e27a2d5c8cdb28de9dbd65cea57Aaron Carroll if (!ioprio_class) 145a415b2ccee389e27a2d5c8cdb28de9dbd65cea57Aaron Carroll ioprio_class = IOPRIO_CLASS_BE; 146a415b2ccee389e27a2d5c8cdb28de9dbd65cea57Aaron Carroll 147a415b2ccee389e27a2d5c8cdb28de9dbd65cea57Aaron Carroll ioprio |= ioprio_class << IOPRIO_CLASS_SHIFT; 148a415b2ccee389e27a2d5c8cdb28de9dbd65cea57Aaron Carroll return syscall(__NR_ioprio_set, which, who, ioprio); 149a415b2ccee389e27a2d5c8cdb28de9dbd65cea57Aaron Carroll} 150a415b2ccee389e27a2d5c8cdb28de9dbd65cea57Aaron Carroll 151ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#ifndef BLKGETSIZE64 152ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#define BLKGETSIZE64 _IOR(0x12,114,size_t) 153ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#endif 154ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 155ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#ifndef BLKFLSBUF 156ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#define BLKFLSBUF _IO(0x12,97) 157ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#endif 158ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 159ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#ifndef BLKDISCARD 160ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#define BLKDISCARD _IO(0x12,119) 161ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#endif 162ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 163ec5c6b125c1eab992882602158bab54957aa733dAaron Carrollstatic inline int blockdev_invalidate_cache(struct fio_file *f) 164ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll{ 165ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll return ioctl(f->fd, BLKFLSBUF); 166ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll} 167ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 168ec5c6b125c1eab992882602158bab54957aa733dAaron Carrollstatic inline int blockdev_size(struct fio_file *f, unsigned long long *bytes) 169ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll{ 170ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll if (!ioctl(f->fd, BLKGETSIZE64, bytes)) 171ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll return 0; 172ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 173ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll return errno; 174ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll} 175ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 176ec5c6b125c1eab992882602158bab54957aa733dAaron Carrollstatic inline unsigned long long os_phys_mem(void) 177ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll{ 178ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll long pagesize, pages; 179ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 180ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll pagesize = sysconf(_SC_PAGESIZE); 181ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll pages = sysconf(_SC_PHYS_PAGES); 182ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll if (pages == -1 || pagesize == -1) 183ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll return 0; 184ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 185ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll return (unsigned long long) pages * (unsigned long long) pagesize; 186ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll} 187ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 188ec5c6b125c1eab992882602158bab54957aa733dAaron Carrolltypedef struct { unsigned short r[3]; } os_random_state_t; 189ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 190ec5c6b125c1eab992882602158bab54957aa733dAaron Carrollstatic inline void os_random_seed(unsigned long seed, os_random_state_t *rs) 191ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll{ 192ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll rs->r[0] = seed & 0xffff; 193ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll seed >>= 16; 194ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll rs->r[1] = seed & 0xffff; 195ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll seed >>= 16; 196ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll rs->r[2] = seed & 0xffff; 197ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll seed48(rs->r); 198ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll} 199ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 200ec5c6b125c1eab992882602158bab54957aa733dAaron Carrollstatic inline long os_random_long(os_random_state_t *rs) 201ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll{ 202ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll return nrand48(rs->r); 203ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll} 204ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 205ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#ifdef O_NOATIME 206ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#define FIO_O_NOATIME O_NOATIME 207ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#else 208ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#define FIO_O_NOATIME 0 209ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#endif 210ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 2113c77c1316cdd85e5c6dbb3d506e5fab44e5407ecMohamad Ayyash#define fio_swap16(x) bswap_16(x) 2123c77c1316cdd85e5c6dbb3d506e5fab44e5407ecMohamad Ayyash#define fio_swap32(x) bswap_32(x) 2133c77c1316cdd85e5c6dbb3d506e5fab44e5407ecMohamad Ayyash#define fio_swap64(x) bswap_64(x) 214ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 215ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#define CACHE_LINE_FILE \ 216ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll "/sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size" 217ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 218ec5c6b125c1eab992882602158bab54957aa733dAaron Carrollstatic inline int arch_cache_line_size(void) 219ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll{ 220ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll char size[32]; 221ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll int fd, ret; 222ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 223ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll fd = open(CACHE_LINE_FILE, O_RDONLY); 224ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll if (fd < 0) 225ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll return -1; 226ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 227ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll ret = read(fd, size, sizeof(size)); 228ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 229ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll close(fd); 230ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 231ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll if (ret <= 0) 232ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll return -1; 233ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll else 234ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll return atoi(size); 235ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll} 236ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 237ec5c6b125c1eab992882602158bab54957aa733dAaron Carrollstatic inline unsigned long long get_fs_size(const char *path) 238ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll{ 239ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll unsigned long long ret; 240ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll struct statfs s; 241ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 242ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll if (statfs(path, &s) < 0) 243ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll return -1ULL; 244ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 245ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll ret = s.f_bsize; 246ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll ret *= (unsigned long long) s.f_bfree; 247ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll return ret; 248ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll} 249ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 250ec5c6b125c1eab992882602158bab54957aa733dAaron Carrollstatic inline int os_trim(int fd, unsigned long long start, 251ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll unsigned long long len) 252ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll{ 253ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll uint64_t range[2]; 254ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 255ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll range[0] = start; 256ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll range[1] = len; 257ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 258ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll if (!ioctl(fd, BLKDISCARD, range)) 259ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll return 0; 260ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 261ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll return errno; 262ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll} 263ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll 264ec5c6b125c1eab992882602158bab54957aa733dAaron Carroll#endif 265