os-linux.h revision f3de88a7a8806016ebb27af3f4be1fced172122e
1ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#ifndef FIO_OS_LINUX_H
2ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define FIO_OS_LINUX_H
3ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
4ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#include <sys/ioctl.h>
58756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe#include <sys/uio.h>
63c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe#include <sys/syscall.h>
73c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe#include <unistd.h>
897fbdfa1a48a6b535d420e3f53bcb62ed4eff3f1Jens Axboe#include <fcntl.h>
9ea421790658582e392c5bb562ff461f8f5c71844Jens Axboe#include <linux/unistd.h>
1007e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe#include <linux/raw.h>
1107e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe#include <linux/major.h>
12ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
13f3de88a7a8806016ebb27af3f4be1fced172122eJens Axboe#include "indirect.h"
14f3de88a7a8806016ebb27af3f4be1fced172122eJens Axboe
15ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define FIO_HAVE_LIBAIO
16ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define FIO_HAVE_POSIXAIO
17ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define FIO_HAVE_FADVISE
18ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define FIO_HAVE_CPU_AFFINITY
19ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define FIO_HAVE_DISK_UTIL
20ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define FIO_HAVE_SGIO
21ba4f8923a7d7b02e69f6daee8dee5ed6e44722ceJens Axboe#define FIO_HAVE_IOPRIO
228756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe#define FIO_HAVE_SPLICE
2322f78b320a8d2ffa32b5736fe754c108a8d21525Jens Axboe#define FIO_HAVE_IOSCHED_SWITCH
242c0ecd28459b6a1b236c865defb5ef76ce8bfa02Jens Axboe#define FIO_HAVE_ODIRECT
2574b025b071b5bfbffa7ad7682b66b749e8d1f955Jens Axboe#define FIO_HAVE_HUGETLB
2607e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe#define FIO_HAVE_RAWBIND
275e62c22a669c7a8c03b7871852cf85ad6d355980Jens Axboe#define FIO_HAVE_BLKTRACE
28b6959b55efa7f464dbb7e7f2021dd67d297219bdJens Axboe
29ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define OS_MAP_ANON		(MAP_ANONYMOUS)
30ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
314d8947de2b50578a4f6290be567cb5de5bf46776Shawn Lewis#ifndef CLOCK_MONOTONIC
324d8947de2b50578a4f6290be567cb5de5bf46776Shawn Lewis#define CLOCK_MONOTONIC 1
334d8947de2b50578a4f6290be567cb5de5bf46776Shawn Lewis#endif
344d8947de2b50578a4f6290be567cb5de5bf46776Shawn Lewis
354d8947de2b50578a4f6290be567cb5de5bf46776Shawn Lewis#ifdef FIO_HAVE_CPU_AFFINITY
36ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboetypedef cpu_set_t os_cpu_mask_t;
374d8947de2b50578a4f6290be567cb5de5bf46776Shawn Lewis#else
384d8947de2b50578a4f6290be567cb5de5bf46776Shawn Lewistypedef int os_cpu_mask_t;
394d8947de2b50578a4f6290be567cb5de5bf46776Shawn Lewis#endif
406dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboetypedef struct drand48_data os_random_state_t;
41ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
42ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe/*
43ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe * we want fadvise64 really, but it's so tangled... later
44ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe */
454d8947de2b50578a4f6290be567cb5de5bf46776Shawn Lewis#ifdef FIO_HAVE_FADVISE
46ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define fadvise(fd, off, len, advice)	\
47ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	posix_fadvise((fd), (off_t)(off), (len), (advice))
484d8947de2b50578a4f6290be567cb5de5bf46776Shawn Lewis#endif
49ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
50c8f025f8a33e05b10fe928d5899ac4e948847eb6Jens Axboe/*
51c8f025f8a33e05b10fe928d5899ac4e948847eb6Jens Axboe * If you are on an ancient glibc (2.3.2), then define GLIBC_2_3_2 if you want
52c8f025f8a33e05b10fe928d5899ac4e948847eb6Jens Axboe * the affinity helpers to work.
53c8f025f8a33e05b10fe928d5899ac4e948847eb6Jens Axboe */
544d8947de2b50578a4f6290be567cb5de5bf46776Shawn Lewis#ifdef FIO_HAVE_CPU_AFFINITY
55c8f025f8a33e05b10fe928d5899ac4e948847eb6Jens Axboe#ifndef GLIBC_2_3_2
56ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define fio_setaffinity(td)		\
572dc1bbeb58edc85f2829eed6729862c438ea2353Jens Axboe	sched_setaffinity((td)->pid, sizeof((td)->o.cpumask), &(td)->o.cpumask)
58ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define fio_getaffinity(pid, ptr)	\
59ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	sched_getaffinity((pid), sizeof(cpu_set_t), (ptr))
60c8f025f8a33e05b10fe928d5899ac4e948847eb6Jens Axboe#else
61c8f025f8a33e05b10fe928d5899ac4e948847eb6Jens Axboe#define fio_setaffinity(td)		\
62c8f025f8a33e05b10fe928d5899ac4e948847eb6Jens Axboe	sched_setaffinity((td)->pid, &(td)->o.cpumask)
63c8f025f8a33e05b10fe928d5899ac4e948847eb6Jens Axboe#define fio_getaffinity(pid, ptr)	\
64c8f025f8a33e05b10fe928d5899ac4e948847eb6Jens Axboe	sched_getaffinity((pid), (ptr))
65c8f025f8a33e05b10fe928d5899ac4e948847eb6Jens Axboe#endif
664d8947de2b50578a4f6290be567cb5de5bf46776Shawn Lewis#endif
674d8947de2b50578a4f6290be567cb5de5bf46776Shawn Lewis
68ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboestatic inline int ioprio_set(int which, int who, int ioprio)
69ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
70ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	return syscall(__NR_ioprio_set, which, who, ioprio);
71ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
72ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
7397fbdfa1a48a6b535d420e3f53bcb62ed4eff3f1Jens Axboe/*
7497fbdfa1a48a6b535d420e3f53bcb62ed4eff3f1Jens Axboe * Just check for SPLICE_F_MOVE, if that isn't there, assume the others
7597fbdfa1a48a6b535d420e3f53bcb62ed4eff3f1Jens Axboe * aren't either.
7697fbdfa1a48a6b535d420e3f53bcb62ed4eff3f1Jens Axboe */
7797fbdfa1a48a6b535d420e3f53bcb62ed4eff3f1Jens Axboe#ifndef SPLICE_F_MOVE
7897fbdfa1a48a6b535d420e3f53bcb62ed4eff3f1Jens Axboe#define SPLICE_F_MOVE	(0x01)	/* move pages instead of copying */
7997fbdfa1a48a6b535d420e3f53bcb62ed4eff3f1Jens Axboe#define SPLICE_F_NONBLOCK (0x02) /* don't block on the pipe splicing (but */
8097fbdfa1a48a6b535d420e3f53bcb62ed4eff3f1Jens Axboe				 /* we may still block on the fd we splice */
8197fbdfa1a48a6b535d420e3f53bcb62ed4eff3f1Jens Axboe				 /* from/to, of course */
8297fbdfa1a48a6b535d420e3f53bcb62ed4eff3f1Jens Axboe#define SPLICE_F_MORE	(0x04)	/* expect more data */
8397fbdfa1a48a6b535d420e3f53bcb62ed4eff3f1Jens Axboe#define SPLICE_F_GIFT   (0x08)  /* pages passed in are a gift */
848756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe
858756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboestatic inline int splice(int fdin, loff_t *off_in, int fdout, loff_t *off_out,
86495ee9b632c5629e79a46d1074cacf4eda965e13Jens Axboe			 size_t len, unsigned int flags)
878756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe{
8897fbdfa1a48a6b535d420e3f53bcb62ed4eff3f1Jens Axboe	return syscall(__NR_sys_splice, fdin, off_in, fdout, off_out, len, flags);
898756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe}
908756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe
918756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboestatic inline int tee(int fdin, int fdout, size_t len, unsigned int flags)
928756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe{
9397fbdfa1a48a6b535d420e3f53bcb62ed4eff3f1Jens Axboe	return syscall(__NR_sys_tee, fdin, fdout, len, flags);
948756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe}
958756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe
968756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboestatic inline int vmsplice(int fd, const struct iovec *iov,
978756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe			   unsigned long nr_segs, unsigned int flags)
988756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe{
9997fbdfa1a48a6b535d420e3f53bcb62ed4eff3f1Jens Axboe	return syscall(__NR_sys_vmsplice, fd, iov, nr_segs, flags);
1008756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe}
10197fbdfa1a48a6b535d420e3f53bcb62ed4eff3f1Jens Axboe#endif
1028756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe
1033feedc608f168479bde2f2e079cedd6852cb3b3bJens Axboe#define SPLICE_DEF_SIZE	(64*1024)
1043feedc608f168479bde2f2e079cedd6852cb3b3bJens Axboe
105b6959b55efa7f464dbb7e7f2021dd67d297219bdJens Axboe#ifdef FIO_HAVE_SYSLET
106bf0dc8fae8b21c666a0a927c1d473ad59101e7fdIngo Molnar
107bf0dc8fae8b21c666a0a927c1d473ad59101e7fdIngo Molnarstruct syslet_uatom;
108bf0dc8fae8b21c666a0a927c1d473ad59101e7fdIngo Molnarstruct async_head_user;
109bf0dc8fae8b21c666a0a927c1d473ad59101e7fdIngo Molnar
110a4f4fdd7c9e46a50bc33ecef44d9f06036580ad4Jens Axboe/*
111a4f4fdd7c9e46a50bc33ecef44d9f06036580ad4Jens Axboe * syslet stuff
112a4f4fdd7c9e46a50bc33ecef44d9f06036580ad4Jens Axboe */
113bf0dc8fae8b21c666a0a927c1d473ad59101e7fdIngo Molnarstatic inline struct syslet_uatom *
114bf0dc8fae8b21c666a0a927c1d473ad59101e7fdIngo Molnarasync_exec(struct syslet_uatom *atom, struct async_head_user *ahu)
115a4f4fdd7c9e46a50bc33ecef44d9f06036580ad4Jens Axboe{
1161df341ff45360d5d1a4f942f76862f11a0da8fa6Jens Axboe	return (void *) syscall(__NR_async_exec, atom, ahu);
117a4f4fdd7c9e46a50bc33ecef44d9f06036580ad4Jens Axboe}
118a4f4fdd7c9e46a50bc33ecef44d9f06036580ad4Jens Axboe
119bf0dc8fae8b21c666a0a927c1d473ad59101e7fdIngo Molnarstatic inline long
120bf0dc8fae8b21c666a0a927c1d473ad59101e7fdIngo Molnarasync_wait(unsigned long min_wait_events, unsigned long user_ring_idx,
121bf0dc8fae8b21c666a0a927c1d473ad59101e7fdIngo Molnar	   struct async_head_user *ahu)
122a4f4fdd7c9e46a50bc33ecef44d9f06036580ad4Jens Axboe{
123bf0dc8fae8b21c666a0a927c1d473ad59101e7fdIngo Molnar	return syscall(__NR_async_wait, min_wait_events,
124bf0dc8fae8b21c666a0a927c1d473ad59101e7fdIngo Molnar			user_ring_idx, ahu);
125a4f4fdd7c9e46a50bc33ecef44d9f06036580ad4Jens Axboe}
126a4f4fdd7c9e46a50bc33ecef44d9f06036580ad4Jens Axboe
1277756b0d046ef74c32df134c8b716237cc5e16badJens Axboestatic inline long async_thread(void *event, struct async_head_user *ahu)
128a4f4fdd7c9e46a50bc33ecef44d9f06036580ad4Jens Axboe{
1297756b0d046ef74c32df134c8b716237cc5e16badJens Axboe	return syscall(__NR_async_thread, event, ahu);
130a4f4fdd7c9e46a50bc33ecef44d9f06036580ad4Jens Axboe}
131a4f4fdd7c9e46a50bc33ecef44d9f06036580ad4Jens Axboe
132a4f4fdd7c9e46a50bc33ecef44d9f06036580ad4Jens Axboestatic inline long umem_add(unsigned long *uptr, unsigned long inc)
133a4f4fdd7c9e46a50bc33ecef44d9f06036580ad4Jens Axboe{
134a4f4fdd7c9e46a50bc33ecef44d9f06036580ad4Jens Axboe	return syscall(__NR_umem_add, uptr, inc);
135a4f4fdd7c9e46a50bc33ecef44d9f06036580ad4Jens Axboe}
136b6959b55efa7f464dbb7e7f2021dd67d297219bdJens Axboe#endif /* FIO_HAVE_SYSLET */
137a4f4fdd7c9e46a50bc33ecef44d9f06036580ad4Jens Axboe
138ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboeenum {
1396cefbe338b159edc9417da5840383765acbd92c7Jens Axboe	IOPRIO_CLASS_NONE,
1406cefbe338b159edc9417da5840383765acbd92c7Jens Axboe	IOPRIO_CLASS_RT,
1416cefbe338b159edc9417da5840383765acbd92c7Jens Axboe	IOPRIO_CLASS_BE,
1426cefbe338b159edc9417da5840383765acbd92c7Jens Axboe	IOPRIO_CLASS_IDLE,
1436cefbe338b159edc9417da5840383765acbd92c7Jens Axboe};
1446cefbe338b159edc9417da5840383765acbd92c7Jens Axboe
1456cefbe338b159edc9417da5840383765acbd92c7Jens Axboeenum {
146ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	IOPRIO_WHO_PROCESS = 1,
147ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	IOPRIO_WHO_PGRP,
148ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	IOPRIO_WHO_USER,
149ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe};
150ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
1516cefbe338b159edc9417da5840383765acbd92c7Jens Axboe#define IOPRIO_BITS		16
152ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define IOPRIO_CLASS_SHIFT	13
153ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
154ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#ifndef BLKGETSIZE64
155ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define BLKGETSIZE64	_IOR(0x12,114,size_t)
156ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#endif
157ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
158e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe#ifndef BLKFLSBUF
159e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe#define BLKFLSBUF	_IO(0x12,97)
160e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe#endif
161e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
162e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboestatic inline int blockdev_invalidate_cache(int fd)
163e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe{
164a16211bb932067978f74606eb5d3f92e5227eee2Jens Axboe	return ioctl(fd, BLKFLSBUF);
165e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe}
166e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
1679104f874d726e84739d3b4008eee0f6ddfe96714Jens Axboestatic inline int blockdev_size(int fd, unsigned long long *bytes)
168ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
169ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	if (!ioctl(fd, BLKGETSIZE64, bytes))
170ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 0;
171ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
172ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	return errno;
173ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
174ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
17532cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboestatic inline unsigned long long os_phys_mem(void)
17632cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe{
17732cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe	long pagesize, pages;
17832cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe
17932cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe	pagesize = sysconf(_SC_PAGESIZE);
18032cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe	pages = sysconf(_SC_PHYS_PAGES);
18132cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe	if (pages == -1 || pagesize == -1)
18232cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe		return 0;
18332cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe
18432cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe	return (unsigned long long) pages * (unsigned long long) pagesize;
18532cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe}
18632cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe
1876dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboestatic inline void os_random_seed(unsigned long seed, os_random_state_t *rs)
1886dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe{
1896dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe	srand48_r(seed, rs);
1906dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe}
1916dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe
1926dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboestatic inline long os_random_long(os_random_state_t *rs)
1936dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe{
1946dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe	long val;
1956dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe
1966dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe	lrand48_r(rs, &val);
1976dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe	return val;
1986dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe}
1996dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe
2008cc7afa91ddc5a0980b9d2dbfdd66e1511a0d4b1Jens Axboestatic inline int fio_lookup_raw(dev_t dev, int *majdev, int *mindev)
20107e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe{
20207e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe	struct raw_config_request rq;
20307e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe	int fd;
20407e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe
20507e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe	if (major(dev) != RAW_MAJOR)
2068cc7afa91ddc5a0980b9d2dbfdd66e1511a0d4b1Jens Axboe		return 1;
20707e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe
20807e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe	/*
20907e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe	 * we should be able to find /dev/rawctl or /dev/raw/rawctl
21007e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe	 */
21107e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe	fd = open("/dev/rawctl", O_RDONLY);
21207e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe	if (fd < 0) {
21307e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe		fd = open("/dev/raw/rawctl", O_RDONLY);
21407e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe		if (fd < 0)
2158cc7afa91ddc5a0980b9d2dbfdd66e1511a0d4b1Jens Axboe			return 1;
21607e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe	}
21707e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe
21807e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe	rq.raw_minor = minor(dev);
21907e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe	if (ioctl(fd, RAW_GETBIND, &rq) < 0) {
22007e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe		close(fd);
2218cc7afa91ddc5a0980b9d2dbfdd66e1511a0d4b1Jens Axboe		return 1;
22207e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe	}
22307e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe
22407e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe	close(fd);
22507e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe	*majdev = rq.block_major;
22607e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe	*mindev = rq.block_minor;
2278cc7afa91ddc5a0980b9d2dbfdd66e1511a0d4b1Jens Axboe	return 0;
22807e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe}
22907e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe
230ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#endif
231