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