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