14ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin/*
24ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * Copyright (c) 2009, 2010 Jeff Mahoney <jeffm@suse.com>
337d1b3dd8c33983351f9d94ae60d6f55fc6e0be7Dmitry V. Levin * Copyright (c) 2011-2016 Dmitry V. Levin <ldv@altlinux.org>
44ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * All rights reserved.
54ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin *
64ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * Redistribution and use in source and binary forms, with or without
74ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * modification, are permitted provided that the following conditions
84ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * are met:
94ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * 1. Redistributions of source code must retain the above copyright
104ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin *    notice, this list of conditions and the following disclaimer.
114ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * 2. Redistributions in binary form must reproduce the above copyright
124ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin *    notice, this list of conditions and the following disclaimer in the
134ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin *    documentation and/or other materials provided with the distribution.
144ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * 3. The name of the author may not be used to endorse or promote products
154ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin *    derived from this software without specific prior written permission.
164ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin *
174ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
184ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
194ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
204ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
214ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
224ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
234ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
244ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
254ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
264ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
274ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin */
284ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin
294ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#include "defs.h"
3037d1b3dd8c33983351f9d94ae60d6f55fc6e0be7Dmitry V. Levin
3137d1b3dd8c33983351f9d94ae60d6f55fc6e0be7Dmitry V. Levin#include DEF_MPERS_TYPE(struct_blk_user_trace_setup)
3237d1b3dd8c33983351f9d94ae60d6f55fc6e0be7Dmitry V. Levin#include DEF_MPERS_TYPE(struct_blkpg_ioctl_arg)
3337d1b3dd8c33983351f9d94ae60d6f55fc6e0be7Dmitry V. Levin#include DEF_MPERS_TYPE(struct_blkpg_partition)
3437d1b3dd8c33983351f9d94ae60d6f55fc6e0be7Dmitry V. Levin
35d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <linux/ioctl.h>
364ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#include <linux/fs.h>
374ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin
38d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughestypedef struct {
39d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	int op;
40d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	int flags;
41d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	int datalen;
42d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	void *data;
43d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes} struct_blkpg_ioctl_arg;
44d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
45d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#define BLKPG_DEVNAMELTH	64
46d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#define BLKPG_VOLNAMELTH	64
47d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughestypedef struct {
48d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	int64_t start;			/* starting offset in bytes */
49d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	int64_t length;			/* length in bytes */
50d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	int pno;			/* partition number */
51d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	char devname[BLKPG_DEVNAMELTH];	/* partition name, like sda5 or c0d1p2,
52d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes					   to be used in kernel messages */
53d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	char volname[BLKPG_VOLNAMELTH];	/* volume label */
54d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes} struct_blkpg_partition;
55d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
564ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#define BLKTRACE_BDEV_SIZE      32
5737d1b3dd8c33983351f9d94ae60d6f55fc6e0be7Dmitry V. Levintypedef struct blk_user_trace_setup {
584ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin	char name[BLKTRACE_BDEV_SIZE];	/* output */
594ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin	uint16_t act_mask;		/* input */
604ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin	uint32_t buf_size;		/* input */
614ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin	uint32_t buf_nr;		/* input */
624ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin	uint64_t start_lba;
634ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin	uint64_t end_lba;
644ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin	uint32_t pid;
6537d1b3dd8c33983351f9d94ae60d6f55fc6e0be7Dmitry V. Levin} struct_blk_user_trace_setup;
6637d1b3dd8c33983351f9d94ae60d6f55fc6e0be7Dmitry V. Levin
6737d1b3dd8c33983351f9d94ae60d6f55fc6e0be7Dmitry V. Levin#include MPERS_DEFS
6837d1b3dd8c33983351f9d94ae60d6f55fc6e0be7Dmitry V. Levin
69d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#ifndef BLKPG
70dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes# define BLKPG      _IO(0x12, 105)
71d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#endif
72d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
7337d1b3dd8c33983351f9d94ae60d6f55fc6e0be7Dmitry V. Levin/*
7437d1b3dd8c33983351f9d94ae60d6f55fc6e0be7Dmitry V. Levin * ioctl numbers <= 114 are present in Linux 2.4.  The following ones have been
7537d1b3dd8c33983351f9d94ae60d6f55fc6e0be7Dmitry V. Levin * added since then and headers containing them may not be available on every
7637d1b3dd8c33983351f9d94ae60d6f55fc6e0be7Dmitry V. Levin * system.
7737d1b3dd8c33983351f9d94ae60d6f55fc6e0be7Dmitry V. Levin */
784ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin
794ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#ifndef BLKTRACESETUP
8037d1b3dd8c33983351f9d94ae60d6f55fc6e0be7Dmitry V. Levin# define BLKTRACESETUP _IOWR(0x12, 115, struct_blk_user_trace_setup)
814ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#endif
824ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#ifndef BLKTRACESTART
83dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes# define BLKTRACESTART _IO(0x12, 116)
844ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#endif
854cee0af77b0275740f7f97ae5d778f60d5ac7f88Dmitry V. Levin#ifndef BLKTRACESTOP
86dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes# define BLKTRACESTOP _IO(0x12, 117)
874ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#endif
884ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#ifndef BLKTRACETEARDOWN
89dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes# define BLKTRACETEARDOWN _IO(0x12, 118)
904ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#endif
914ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#ifndef BLKDISCARD
92dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes# define BLKDISCARD _IO(0x12, 119)
934ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#endif
944ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#ifndef BLKIOMIN
95dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes# define BLKIOMIN _IO(0x12, 120)
964ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#endif
974ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#ifndef BLKIOOPT
98dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes# define BLKIOOPT _IO(0x12, 121)
994ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#endif
1004ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#ifndef BLKALIGNOFF
101dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes# define BLKALIGNOFF _IO(0x12, 122)
1024ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#endif
1034ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#ifndef BLKPBSZGET
104dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes# define BLKPBSZGET _IO(0x12, 123)
1054ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#endif
1064ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#ifndef BLKDISCARDZEROES
107dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes# define BLKDISCARDZEROES _IO(0x12, 124)
1084ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#endif
1094ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#ifndef BLKSECDISCARD
110dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes# define BLKSECDISCARD _IO(0x12, 125)
111a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin#endif
112a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin#ifndef BLKROTATIONAL
113dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes# define BLKROTATIONAL _IO(0x12, 126)
114a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin#endif
115a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin#ifndef BLKZEROOUT
116dc75b01004a0588c1eb3bc26d7248a6e473b2cddElliott Hughes# define BLKZEROOUT _IO(0x12, 127)
1174ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin#endif
1184ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin
1190ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/blkpg_ops.h"
1204ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin
1214ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levinstatic void
12237d1b3dd8c33983351f9d94ae60d6f55fc6e0be7Dmitry V. Levinprint_blkpg_req(struct tcb *tcp, const struct_blkpg_ioctl_arg *blkpg)
1234ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin{
12437d1b3dd8c33983351f9d94ae60d6f55fc6e0be7Dmitry V. Levin	struct_blkpg_partition p;
1254ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin
12660fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko	tprints("{");
127be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin	printxval(blkpg_ops, blkpg->op, "BLKPG_???");
1284ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin
129a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin	tprintf(", flags=%d, datalen=%d, data=",
130be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin		blkpg->flags, blkpg->datalen);
1314ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin
132d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if (!umove_or_printaddr(tcp, ptr_to_kulong(blkpg->data), &p)) {
133d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		tprintf("{start=%" PRId64 ", length=%" PRId64
134d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			", pno=%d, devname=",
135d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			p.start, p.length, p.pno);
1360a870586405ef425760d7681d5ac092bb022365eDmitry V. Levin		print_quoted_string(p.devname, sizeof(p.devname),
1370a870586405ef425760d7681d5ac092bb022365eDmitry V. Levin				    QUOTE_0_TERMINATED);
1380a870586405ef425760d7681d5ac092bb022365eDmitry V. Levin		tprints(", volname=");
1390a870586405ef425760d7681d5ac092bb022365eDmitry V. Levin		print_quoted_string(p.volname, sizeof(p.volname),
1400a870586405ef425760d7681d5ac092bb022365eDmitry V. Levin				    QUOTE_0_TERMINATED);
141a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin		tprints("}");
1420a870586405ef425760d7681d5ac092bb022365eDmitry V. Levin	}
143a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin	tprints("}");
1444ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin}
1454ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin
146d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott HughesMPERS_PRINTER_DECL(int, block_ioctl, struct tcb *const tcp,
147d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		   const unsigned int code, const kernel_ulong_t arg)
1484ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin{
1494ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin	switch (code) {
150be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin	/* take arg as a value, not as a pointer */
1514ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin	case BLKRASET:
1524ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin	case BLKFRASET:
153d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		tprintf(", %" PRI_klu, arg);
1544ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin		break;
1554ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin
156a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin	/* return an unsigned short */
1574ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin	case BLKSECTGET:
158a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin	case BLKROTATIONAL:
159a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin		if (entering(tcp))
160a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin			return 0;
161a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin		tprints(", ");
162a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin		printnum_short(tcp, arg, "%hu");
1634ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin		break;
1644ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin
165be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin	/* return a signed int */
1664ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin	case BLKROGET:
1674ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin	case BLKBSZGET:
1684ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin	case BLKSSZGET:
1694ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin	case BLKALIGNOFF:
170a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin		if (entering(tcp))
171a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin			return 0;
1720c9087c1b5bc237801b1e56e4d735a63e27ea50cDmitry V. Levin		/* fall through */
1730c9087c1b5bc237801b1e56e4d735a63e27ea50cDmitry V. Levin	/* take a signed int */
1740c9087c1b5bc237801b1e56e4d735a63e27ea50cDmitry V. Levin	case BLKROSET:
1750c9087c1b5bc237801b1e56e4d735a63e27ea50cDmitry V. Levin	case BLKBSZSET:
176a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin		tprints(", ");
177a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin		printnum_int(tcp, arg, "%d");
1784ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin		break;
1794ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin
180be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin	/* return an unsigned int */
1814ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin	case BLKPBSZGET:
1824ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin	case BLKIOMIN:
1834ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin	case BLKIOOPT:
1844ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin	case BLKDISCARDZEROES:
185a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin		if (entering(tcp))
186a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin			return 0;
187a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin		tprints(", ");
188a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin		printnum_int(tcp, arg, "%u");
1894ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin		break;
1904ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin
191be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin	/* return a signed long */
1924ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin	case BLKRAGET:
1934ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin	case BLKFRAGET:
194a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin		if (entering(tcp))
195a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin			return 0;
196a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin		tprints(", ");
1972479ef0bceaa35ea353fd0ea372cf31d5eb8a216Dmitry V. Levin		printnum_slong(tcp, arg);
1984ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin		break;
1994ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin
200be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin	/* returns an unsigned long */
2014ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin	case BLKGETSIZE:
202a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin		if (entering(tcp))
203a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin			return 0;
204a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin		tprints(", ");
2052479ef0bceaa35ea353fd0ea372cf31d5eb8a216Dmitry V. Levin		printnum_ulong(tcp, arg);
2064ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin		break;
2074ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin
20825caa318eedf38200cd7660320d95bf4662c6c5bDmitry V. Levin#ifdef HAVE_BLKGETSIZE64
209a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin	/* returns an uint64_t */
2104ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin	case BLKGETSIZE64:
211a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin		if (entering(tcp))
212a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin			return 0;
213a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin		tprints(", ");
214a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin		printnum_int64(tcp, arg, "%" PRIu64);
2154ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin		break;
2165bd67c86a93c658d258348e8f14af94fd45cbeb6Denys Vlasenko#endif
2174ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin
218a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin	/* takes a pair of uint64_t */
2194ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin	case BLKDISCARD:
2204ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin	case BLKSECDISCARD:
221a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin	case BLKZEROOUT:
222a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin		tprints(", ");
22346d25c2b84bf834a8e6f7e00103a0304a8a7b1a2Dmitry V. Levin		printpair_int64(tcp, arg, "%" PRIu64);
2244ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin		break;
2254ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin
226a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin	/* More complex types */
227a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin	case BLKPG: {
22837d1b3dd8c33983351f9d94ae60d6f55fc6e0be7Dmitry V. Levin		struct_blkpg_ioctl_arg blkpg;
229a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin
230a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin		tprints(", ");
231a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin		if (!umove_or_printaddr(tcp, arg, &blkpg))
232a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin			print_blkpg_req(tcp, &blkpg);
2334ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin		break;
234a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin	}
235be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin
2364ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin	case BLKTRACESETUP:
2374ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin		if (entering(tcp)) {
23837d1b3dd8c33983351f9d94ae60d6f55fc6e0be7Dmitry V. Levin			struct_blk_user_trace_setup buts;
239a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin
240a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin			tprints(", ");
241a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin			if (umove_or_printaddr(tcp, arg, &buts))
242a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin				break;
243a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin			tprintf("{act_mask=%u, buf_size=%u, "
244a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin				"buf_nr=%u, start_lba=%" PRIu64 ", "
245a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin				"end_lba=%" PRIu64 ", pid=%u",
246a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin				(unsigned)buts.act_mask, buts.buf_size,
247a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin				buts.buf_nr, buts.start_lba,
248a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin				buts.end_lba, buts.pid);
249a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin			return 1;
250a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin		} else {
25137d1b3dd8c33983351f9d94ae60d6f55fc6e0be7Dmitry V. Levin			struct_blk_user_trace_setup buts;
252a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin
2530bea528fa8ff7804f6aa3809e7e01d76034f38dfDmitry V. Levin			if (!syserror(tcp) && !umove(tcp, arg, &buts)) {
2540bea528fa8ff7804f6aa3809e7e01d76034f38dfDmitry V. Levin				tprints(", name=");
2550bea528fa8ff7804f6aa3809e7e01d76034f38dfDmitry V. Levin				print_quoted_string(buts.name, sizeof(buts.name),
2560bea528fa8ff7804f6aa3809e7e01d76034f38dfDmitry V. Levin						    QUOTE_0_TERMINATED);
2570a870586405ef425760d7681d5ac092bb022365eDmitry V. Levin			}
258a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin			tprints("}");
259a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin			break;
2604ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin		}
261be284cae112d71a0073e24b34e16a63f31b32fd8Dmitry V. Levin
262a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin	/* No arguments */
263a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin	case BLKRRPART:
264a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin	case BLKFLSBUF:
2654ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin	case BLKTRACESTART:
2664ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin	case BLKTRACESTOP:
2674ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin	case BLKTRACETEARDOWN:
2684ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin		break;
269a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin	default:
270a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin		return RVAL_DECODED;
271a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin	}
2724ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin
273a0beac15389aa69135ce8f968c7f4e20e455940dDmitry V. Levin	return RVAL_DECODED | 1;
2744ef6db489a8a51ae03ffb78b58c679162a39f3c3Dmitry V. Levin}
275