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 494ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#define BLKTRACESETUP _IOWR(0x12,115,struct blk_user_trace_setup) 504ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#endif 514ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#ifndef BLKTRACESTART 524ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#define BLKTRACESTART _IO(0x12,116) 534ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#endif 544cee0af77b0275740f7f97ae5d778f60d5ac7f88Dmitry V. Levin#ifndef BLKTRACESTOP 554ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#define BLKTRACESTOP _IO(0x12,117) 564ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#endif 574ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#ifndef BLKTRACETEARDOWN 584ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#define BLKTRACETEARDOWN _IO(0x12,118) 594ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#endif 604ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#ifndef BLKDISCARD 614ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#define BLKDISCARD _IO(0x12,119) 624ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#endif 634ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#ifndef BLKIOMIN 644ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#define BLKIOMIN _IO(0x12,120) 654ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#endif 664ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#ifndef BLKIOOPT 674ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#define BLKIOOPT _IO(0x12,121) 684ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#endif 694ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#ifndef BLKALIGNOFF 704ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#define BLKALIGNOFF _IO(0x12,122) 714ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#endif 724ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#ifndef BLKPBSZGET 734ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#define BLKPBSZGET _IO(0x12,123) 744ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#endif 754ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#ifndef BLKDISCARDZEROES 764ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#define BLKDISCARDZEROES _IO(0x12,124) 774ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#endif 784ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#ifndef BLKSECDISCARD 794ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#define BLKSECDISCARD _IO(0x12,125) 804ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#endif 814ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 820ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/blkpg_ops.h" 834ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 844ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levinstatic void 854ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levinprint_blkpg_req(struct tcb *tcp, struct blkpg_ioctl_arg *blkpg) 864ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin{ 874ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin struct blkpg_partition p; 884ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 8960fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko tprints("{"); 90be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin printxval(blkpg_ops, blkpg->op, "BLKPG_???"); 914ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 92be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin tprintf(", flags=%d, datalen=%d, ", 93be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin blkpg->flags, blkpg->datalen); 944ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 95be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin if (umove(tcp, (long) blkpg->data, &p) < 0) 96be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin tprintf("%#lx}", (long) blkpg->data); 970a870586405ef425760d7681d5ac092bb022365eDmitry V. Levin else { 980a870586405ef425760d7681d5ac092bb022365eDmitry V. Levin tprintf("{start=%lld, length=%lld, pno=%d, devname=", 990a870586405ef425760d7681d5ac092bb022365eDmitry V. Levin p.start, p.length, p.pno); 1000a870586405ef425760d7681d5ac092bb022365eDmitry V. Levin print_quoted_string(p.devname, sizeof(p.devname), 1010a870586405ef425760d7681d5ac092bb022365eDmitry V. Levin QUOTE_0_TERMINATED); 1020a870586405ef425760d7681d5ac092bb022365eDmitry V. Levin tprints(", volname="); 1030a870586405ef425760d7681d5ac092bb022365eDmitry V. Levin print_quoted_string(p.volname, sizeof(p.volname), 1040a870586405ef425760d7681d5ac092bb022365eDmitry V. Levin QUOTE_0_TERMINATED); 1050a870586405ef425760d7681d5ac092bb022365eDmitry V. Levin tprints("}}"); 1060a870586405ef425760d7681d5ac092bb022365eDmitry V. Levin } 1074ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin} 1084ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 1094ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levinint 110c7afb4881f14e44968f3a78ae5988f04ecc66b68Dmitry V. Levinblock_ioctl(struct tcb *tcp, const unsigned int code, long arg) 1114ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin{ 1124ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin switch (code) { 113be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin /* take arg as a value, not as a pointer */ 1144ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKRASET: 1154ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKFRASET: 1164ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin if (entering(tcp)) 1174ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin tprintf(", %ld", arg); 1184ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin break; 1194ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 120be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin /* take a signed int */ 1214ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKROSET: 1224ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKBSZSET: 1235b88608b296c44c67ffa25900b8c2e496c2b41a4Mike Frysinger#ifdef FIFREEZE 1245b88608b296c44c67ffa25900b8c2e496c2b41a4Mike Frysinger /* First seen in linux-2.6.29 */ 1255b88608b296c44c67ffa25900b8c2e496c2b41a4Mike Frysinger case FIFREEZE: 1265b88608b296c44c67ffa25900b8c2e496c2b41a4Mike Frysinger case FITHAW: 1275b88608b296c44c67ffa25900b8c2e496c2b41a4Mike Frysinger#endif 1284ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin if (entering(tcp)) { 129be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin int val; 130be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin if (umove(tcp, arg, &val) < 0) 1314ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin tprintf(", %#lx", arg); 1324ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin else 133be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin tprintf(", %d", val); 1344ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin } 1354ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin break; 1364ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 137be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin /* returns an unsigned short */ 1384ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKSECTGET: 1394ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin if (exiting(tcp)) { 140be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin unsigned short val; 141be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin if (syserror(tcp) || umove(tcp, arg, &val) < 0) 1424ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin tprintf(", %#lx", arg); 1434ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin else 14461d62cf9481f100f76f1e8a2dfe131f638566633Denys Vlasenko tprintf(", %u", (unsigned)val); 1454ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin } 1464ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin break; 1474ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 148be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin /* return a signed int */ 1494ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKROGET: 1504ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKBSZGET: 1514ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKSSZGET: 1524ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKALIGNOFF: 1534ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin if (exiting(tcp)) { 154be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin int val; 155be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin if (syserror(tcp) || umove(tcp, arg, &val) < 0) 1564ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin tprintf(", %#lx", arg); 1574ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin else 158be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin tprintf(", %d", val); 1594ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin } 1604ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin break; 1614ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 162be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin /* return an unsigned int */ 1634ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKPBSZGET: 1644ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKIOMIN: 1654ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKIOOPT: 1664ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKDISCARDZEROES: 1674ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin if (exiting(tcp)) { 168be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin unsigned int val; 169be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin if (syserror(tcp) || umove(tcp, arg, &val) < 0) 1704ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin tprintf(", %#lx", arg); 1714ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin else 172be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin tprintf(", %u", val); 1734ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin } 1744ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin break; 1754ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 176be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin /* return a signed long */ 1774ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKRAGET: 1784ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKFRAGET: 1794ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin if (exiting(tcp)) { 180be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin long val; 181be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin if (syserror(tcp) || umove(tcp, arg, &val) < 0) 1824ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin tprintf(", %#lx", arg); 1834ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin else 184be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin tprintf(", %ld", val); 1854ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin } 1864ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin break; 1874ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 188be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin /* returns an unsigned long */ 1894ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKGETSIZE: 1904ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin if (exiting(tcp)) { 191be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin unsigned long val; 192be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin if (syserror(tcp) || umove(tcp, arg, &val) < 0) 1934ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin tprintf(", %#lx", arg); 1944ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin else 195be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin tprintf(", %lu", val); 1967672946e74caa5b7cbc406a6dee4a94638fcf586Denys Vlasenko } 1974ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin break; 1984ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 19925caa318eedf38200cd7660320d95bf4662c6c5bDmitry V. Levin#ifdef HAVE_BLKGETSIZE64 200be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin /* return an uint64_t */ 2014ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKGETSIZE64: 2024ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin if (exiting(tcp)) { 203be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin uint64_t val; 204be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin if (syserror(tcp) || umove(tcp, arg, &val) < 0) 2054ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin tprintf(", %#lx", arg); 2064ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin else 207be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin tprintf(", %" PRIu64, val); 2084ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin } 2094ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin break; 2105bd67c86a93c658d258348e8f14af94fd45cbeb6Denys Vlasenko#endif 2114ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 2124ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin /* More complex types */ 2134ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKDISCARD: 2144ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKSECDISCARD: 2154ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin if (entering(tcp)) { 2164ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin uint64_t range[2]; 2174ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin if (umove(tcp, arg, range) < 0) 2184ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin tprintf(", %#lx", arg); 2194ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin else 220be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin tprintf(", {%" PRIx64 ", %" PRIx64 "}", 221be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin range[0], range[1]); 2224ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin } 2234ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin break; 2244ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 2254ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case HDIO_GETGEO: 2264ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin if (exiting(tcp)) { 2274ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin struct hd_geometry geo; 228be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin if (syserror(tcp) || umove(tcp, arg, &geo) < 0) 2294ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin tprintf(", %#lx", arg); 2304ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin else 23161d62cf9481f100f76f1e8a2dfe131f638566633Denys Vlasenko tprintf(", {heads=%u, sectors=%u, " 23261d62cf9481f100f76f1e8a2dfe131f638566633Denys Vlasenko "cylinders=%u, start=%lu}", 23361d62cf9481f100f76f1e8a2dfe131f638566633Denys Vlasenko (unsigned)geo.heads, 23461d62cf9481f100f76f1e8a2dfe131f638566633Denys Vlasenko (unsigned)geo.sectors, 23561d62cf9481f100f76f1e8a2dfe131f638566633Denys Vlasenko (unsigned)geo.cylinders, 23661d62cf9481f100f76f1e8a2dfe131f638566633Denys Vlasenko geo.start); 2374ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin } 2384ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin break; 239be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin 2404ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKPG: 2414ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin if (entering(tcp)) { 2424ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin struct blkpg_ioctl_arg blkpg; 2434ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin if (umove(tcp, arg, &blkpg) < 0) 2444ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin tprintf(", %#lx", arg); 2454ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin else { 24660fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko tprints(", "); 2474ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin print_blkpg_req(tcp, &blkpg); 2484ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin } 2494ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin } 2504ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin break; 251be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin 2524ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKTRACESETUP: 2534ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin if (entering(tcp)) { 2544ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin struct blk_user_trace_setup buts; 2554ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin if (umove(tcp, arg, &buts) < 0) 2564ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin tprintf(", %#lx", arg); 257be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin else 25861d62cf9481f100f76f1e8a2dfe131f638566633Denys Vlasenko tprintf(", {act_mask=%u, buf_size=%u, " 259be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin "buf_nr=%u, start_lba=%" PRIu64 ", " 260be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin "end_lba=%" PRIu64 ", pid=%u}", 26161d62cf9481f100f76f1e8a2dfe131f638566633Denys Vlasenko (unsigned)buts.act_mask, buts.buf_size, 262be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin buts.buf_nr, buts.start_lba, 263be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin buts.end_lba, buts.pid); 2644ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin } 2654ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin if (exiting(tcp)) { 2664ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin struct blk_user_trace_setup buts; 267be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin if (syserror(tcp) || umove(tcp, arg, &buts) < 0) 2684ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin tprintf(", %#lx", arg); 2690a870586405ef425760d7681d5ac092bb022365eDmitry V. Levin else { 2700a870586405ef425760d7681d5ac092bb022365eDmitry V. Levin tprints(", {name="); 2710a870586405ef425760d7681d5ac092bb022365eDmitry V. Levin print_quoted_string(buts.name, sizeof(buts.name), 2720a870586405ef425760d7681d5ac092bb022365eDmitry V. Levin QUOTE_0_TERMINATED); 2730a870586405ef425760d7681d5ac092bb022365eDmitry V. Levin tprints("}"); 2740a870586405ef425760d7681d5ac092bb022365eDmitry V. Levin } 2754ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin } 2764ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin break; 277be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin 2785b88608b296c44c67ffa25900b8c2e496c2b41a4Mike Frysinger#ifdef FITRIM 2795b88608b296c44c67ffa25900b8c2e496c2b41a4Mike Frysinger /* First seen in linux-2.6.37 */ 2805b88608b296c44c67ffa25900b8c2e496c2b41a4Mike Frysinger case FITRIM: 2815b88608b296c44c67ffa25900b8c2e496c2b41a4Mike Frysinger if (entering(tcp)) { 2825b88608b296c44c67ffa25900b8c2e496c2b41a4Mike Frysinger struct fstrim_range fstrim; 2835b88608b296c44c67ffa25900b8c2e496c2b41a4Mike Frysinger if (umove(tcp, arg, &fstrim)) 2845b88608b296c44c67ffa25900b8c2e496c2b41a4Mike Frysinger tprintf(", %#lx", arg); 2855b88608b296c44c67ffa25900b8c2e496c2b41a4Mike Frysinger else 2865b88608b296c44c67ffa25900b8c2e496c2b41a4Mike Frysinger tprintf(", {start=%#" PRIx64 ", len=%#" PRIx64 ", " 2875b88608b296c44c67ffa25900b8c2e496c2b41a4Mike Frysinger "minlen=%#" PRIx64 "}", (uint64_t) fstrim.start, 2885b88608b296c44c67ffa25900b8c2e496c2b41a4Mike Frysinger (uint64_t) fstrim.len, (uint64_t) fstrim.minlen); 2895b88608b296c44c67ffa25900b8c2e496c2b41a4Mike Frysinger } 2905b88608b296c44c67ffa25900b8c2e496c2b41a4Mike Frysinger break; 2915b88608b296c44c67ffa25900b8c2e496c2b41a4Mike Frysinger#endif 2925b88608b296c44c67ffa25900b8c2e496c2b41a4Mike Frysinger 2934ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin /* No arguments or unhandled */ 2944ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKTRACESTART: 2954ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKTRACESTOP: 2964ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKTRACETEARDOWN: 2974ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKFLSBUF: /* Requires driver knowlege */ 2984ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin case BLKRRPART: /* No args */ 2994ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin default: 3004ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin if (entering(tcp)) 3014ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin tprintf(", %#lx", arg); 3024ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin break; 3034ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin 3044ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin }; 3054ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin return 1; 3064ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin} 307