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