14ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin/* 24ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * Copyright (c) 2009, 2010 Jeff Mahoney <jeffm@suse.com> 34ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * All rights reserved. 44ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * 54ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * Redistribution and use in source and binary forms, with or without 64ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * modification, are permitted provided that the following conditions 74ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * are met: 84ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * 1. Redistributions of source code must retain the above copyright 94ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * notice, this list of conditions and the following disclaimer. 104ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * 2. Redistributions in binary form must reproduce the above copyright 114ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * notice, this list of conditions and the following disclaimer in the 124ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * documentation and/or other materials provided with the distribution. 134ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * 3. The name of the author may not be used to endorse or promote products 144ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * derived from this software without specific prior written permission. 154ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * 164ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 174ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 184ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 194ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 204ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 214ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 224ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 234ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 244ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 254ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 264ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin */ 274ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 284ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#include "defs.h" 294ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#include <linux/blkpg.h> 304ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#include <linux/fs.h> 314ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#include <linux/hdreg.h> 324ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 334ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin/* ioctls <= 114 are present in Linux 2.4. The following ones have been 344ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * added since then and headers containing them may not be available on 354ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * every system. */ 364ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 374ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#define BLKTRACE_BDEV_SIZE 32 384ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levinstruct blk_user_trace_setup { 394ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin char name[BLKTRACE_BDEV_SIZE]; /* output */ 404ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin uint16_t act_mask; /* input */ 414ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin uint32_t buf_size; /* input */ 424ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin uint32_t buf_nr; /* input */ 434ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin uint64_t start_lba; 444ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin uint64_t end_lba; 454ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin uint32_t pid; 464ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin}; 474ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 484ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#ifndef BLKTRACESETUP 49a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin# define BLKTRACESETUP _IOWR(0x12,115,struct blk_user_trace_setup) 504ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#endif 514ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#ifndef BLKTRACESTART 52a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin# define BLKTRACESTART _IO(0x12,116) 534ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#endif 544cee0af77b0275740f7f97ae5d778f60d5ac7f88Dmitry V. Levin#ifndef BLKTRACESTOP 55a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin# define BLKTRACESTOP _IO(0x12,117) 564ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#endif 574ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#ifndef BLKTRACETEARDOWN 58a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin# define BLKTRACETEARDOWN _IO(0x12,118) 594ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#endif 604ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#ifndef BLKDISCARD 61a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin# define BLKDISCARD _IO(0x12,119) 624ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#endif 634ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#ifndef BLKIOMIN 64a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin# define BLKIOMIN _IO(0x12,120) 654ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#endif 664ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#ifndef BLKIOOPT 67a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin# define BLKIOOPT _IO(0x12,121) 684ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#endif 694ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#ifndef BLKALIGNOFF 70a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin# define BLKALIGNOFF _IO(0x12,122) 714ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#endif 724ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#ifndef BLKPBSZGET 73a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin# define BLKPBSZGET _IO(0x12,123) 744ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#endif 754ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#ifndef BLKDISCARDZEROES 76a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin# define BLKDISCARDZEROES _IO(0x12,124) 774ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#endif 784ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#ifndef BLKSECDISCARD 79a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin# define BLKSECDISCARD _IO(0x12,125) 80a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin#endif 81a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin#ifndef BLKROTATIONAL 82a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin# define BLKROTATIONAL _IO(0x12,126) 83a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin#endif 84a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin#ifndef BLKZEROOUT 85a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin# define BLKZEROOUT _IO(0x12,127) 864ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#endif 874ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 880ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/blkpg_ops.h" 894ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 904ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levinstatic void 91a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levinprint_blkpg_req(struct tcb *tcp, const struct blkpg_ioctl_arg *blkpg) 924ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin{ 934ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin struct blkpg_partition p; 944ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 9560fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko tprints("{"); 96be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin printxval(blkpg_ops, blkpg->op, "BLKPG_???"); 974ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 98a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin tprintf(", flags=%d, datalen=%d, data=", 99be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin blkpg->flags, blkpg->datalen); 1004ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 101a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin if (!umove_or_printaddr(tcp, (long) blkpg->data, &p)) { 1020a870586405ef425760d7681d5ac092bb022365eDmitry V. Levin tprintf("{start=%lld, length=%lld, pno=%d, devname=", 1030a870586405ef425760d7681d5ac092bb022365eDmitry V. Levin p.start, p.length, p.pno); 1040a870586405ef425760d7681d5ac092bb022365eDmitry V. Levin print_quoted_string(p.devname, sizeof(p.devname), 1050a870586405ef425760d7681d5ac092bb022365eDmitry V. Levin QUOTE_0_TERMINATED); 1060a870586405ef425760d7681d5ac092bb022365eDmitry V. Levin tprints(", volname="); 1070a870586405ef425760d7681d5ac092bb022365eDmitry V. Levin print_quoted_string(p.volname, sizeof(p.volname), 1080a870586405ef425760d7681d5ac092bb022365eDmitry V. Levin QUOTE_0_TERMINATED); 109a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin tprints("}"); 1100a870586405ef425760d7681d5ac092bb022365eDmitry V. Levin } 111a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin tprints("}"); 1124ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin} 1134ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 1144ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levinint 115a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levinblock_ioctl(struct tcb *tcp, const unsigned int code, const long arg) 1164ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin{ 1174ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin switch (code) { 118be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin /* take arg as a value, not as a pointer */ 1194ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKRASET: 1204ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKFRASET: 121a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin tprintf(", %lu", arg); 1224ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin break; 1234ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 124be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin /* take a signed int */ 1254ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKROSET: 1264ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKBSZSET: 127a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin tprints(", "); 128a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin printnum_int(tcp, arg, "%d"); 1294ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin break; 1304ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 131a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin /* return an unsigned short */ 1324ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKSECTGET: 133a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin case BLKROTATIONAL: 134a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin if (entering(tcp)) 135a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin return 0; 136a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin tprints(", "); 137a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin printnum_short(tcp, arg, "%hu"); 1384ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin break; 1394ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 140be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin /* return a signed int */ 1414ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKROGET: 1424ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKBSZGET: 1434ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKSSZGET: 1444ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKALIGNOFF: 145a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin if (entering(tcp)) 146a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin return 0; 147a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin tprints(", "); 148a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin printnum_int(tcp, arg, "%d"); 1494ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin break; 1504ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 151be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin /* return an unsigned int */ 1524ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKPBSZGET: 1534ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKIOMIN: 1544ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKIOOPT: 1554ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKDISCARDZEROES: 156a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin if (entering(tcp)) 157a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin return 0; 158a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin tprints(", "); 159a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin printnum_int(tcp, arg, "%u"); 1604ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin break; 1614ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 162be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin /* return a signed long */ 1634ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKRAGET: 1644ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKFRAGET: 165a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin if (entering(tcp)) 166a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin return 0; 167a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin tprints(", "); 1682479ef0bceaa35ea353fd0ea372cf31d5eb8a216Dmitry V. Levin printnum_slong(tcp, arg); 1694ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin break; 1704ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 171be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin /* returns an unsigned long */ 1724ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKGETSIZE: 173a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin if (entering(tcp)) 174a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin return 0; 175a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin tprints(", "); 1762479ef0bceaa35ea353fd0ea372cf31d5eb8a216Dmitry V. Levin printnum_ulong(tcp, arg); 1774ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin break; 1784ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 17925caa318eedf38200cd7660320d95bf4662c6c5bDmitry V. Levin#ifdef HAVE_BLKGETSIZE64 180a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin /* returns an uint64_t */ 1814ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKGETSIZE64: 182a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin if (entering(tcp)) 183a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin return 0; 184a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin tprints(", "); 185a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin printnum_int64(tcp, arg, "%" PRIu64); 1864ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin break; 1875bd67c86a93c658d258348e8f14af94fd45cbeb6Denys Vlasenko#endif 1884ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 189a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin /* takes a pair of uint64_t */ 1904ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKDISCARD: 1914ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKSECDISCARD: 192a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin case BLKZEROOUT: 193a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin tprints(", "); 194a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin printpair_int64(tcp, arg, "%" PRIx64); 1954ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin break; 1964ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 197a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin /* More complex types */ 1984ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case HDIO_GETGEO: 199a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin if (entering(tcp)) 200a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin return 0; 201a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin else { 2024ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin struct hd_geometry geo; 203a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin 204a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin tprints(", "); 205a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin if (!umove_or_printaddr(tcp, arg, &geo)) 206a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin tprintf("{heads=%u, sectors=%u, " 20761d62cf9481f100f76f1e8a2dfe131f638566633Denys Vlasenko "cylinders=%u, start=%lu}", 20861d62cf9481f100f76f1e8a2dfe131f638566633Denys Vlasenko (unsigned)geo.heads, 20961d62cf9481f100f76f1e8a2dfe131f638566633Denys Vlasenko (unsigned)geo.sectors, 21061d62cf9481f100f76f1e8a2dfe131f638566633Denys Vlasenko (unsigned)geo.cylinders, 21161d62cf9481f100f76f1e8a2dfe131f638566633Denys Vlasenko geo.start); 2124ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin } 2134ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin break; 214be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin 215a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin case BLKPG: { 216a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin struct blkpg_ioctl_arg blkpg; 217a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin 218a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin tprints(", "); 219a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin if (!umove_or_printaddr(tcp, arg, &blkpg)) 220a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin print_blkpg_req(tcp, &blkpg); 2214ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin break; 222a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin } 223be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin 2244ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKTRACESETUP: 2254ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin if (entering(tcp)) { 2264ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin struct blk_user_trace_setup buts; 227a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin 228a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin tprints(", "); 229a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin if (umove_or_printaddr(tcp, arg, &buts)) 230a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin break; 231a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin tprintf("{act_mask=%u, buf_size=%u, " 232a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin "buf_nr=%u, start_lba=%" PRIu64 ", " 233a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin "end_lba=%" PRIu64 ", pid=%u", 234a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin (unsigned)buts.act_mask, buts.buf_size, 235a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin buts.buf_nr, buts.start_lba, 236a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin buts.end_lba, buts.pid); 237a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin return 1; 238a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin } else { 2394ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin struct blk_user_trace_setup buts; 240a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin 241a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin if (syserror(tcp)) { 2420a870586405ef425760d7681d5ac092bb022365eDmitry V. Levin tprints("}"); 243a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin break; 244a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin } 245a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin tprints(", "); 246a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin if (umove(tcp, arg, &buts) < 0) { 247a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin tprints("???}"); 248a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin break; 2490a870586405ef425760d7681d5ac092bb022365eDmitry V. Levin } 250a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin tprints(", name="); 251a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin print_quoted_string(buts.name, sizeof(buts.name), 252a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin QUOTE_0_TERMINATED); 253a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin tprints("}"); 254a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin break; 2554ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin } 256be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin 2575b88608b296c44c67ffa25900b8c2e496c2b41a4Mike Frysinger#ifdef FITRIM 2585b88608b296c44c67ffa25900b8c2e496c2b41a4Mike Frysinger /* First seen in linux-2.6.37 */ 259a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin case FITRIM: { 260a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin struct fstrim_range fstrim; 261a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin 262a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin tprints(", "); 263a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin if (!umove_or_printaddr(tcp, arg, &fstrim)) 264a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin tprintf("{start=%#" PRIx64 ", " 265a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin "len=%#" PRIx64 ", " 266a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin "minlen=%#" PRIx64 "}", 267a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin (uint64_t) fstrim.start, 268a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin (uint64_t) fstrim.len, 269a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin (uint64_t) fstrim.minlen); 2705b88608b296c44c67ffa25900b8c2e496c2b41a4Mike Frysinger break; 271a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin } 2725b88608b296c44c67ffa25900b8c2e496c2b41a4Mike Frysinger#endif 2735b88608b296c44c67ffa25900b8c2e496c2b41a4Mike Frysinger 274a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin /* No arguments */ 275a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin case BLKRRPART: 276a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin case BLKFLSBUF: 2774ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKTRACESTART: 2784ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKTRACESTOP: 2794ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKTRACETEARDOWN: 280a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin#ifdef FIFREEZE 281a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin case FIFREEZE: 282a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin case FITHAW: 283a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin#endif 2844ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin break; 285a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin default: 286a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin return RVAL_DECODED; 287a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin } 2884ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 289a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin return RVAL_DECODED | 1; 2904ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin} 291