block.c revision 2479ef0bceaa35ea353fd0ea372cf31d5eb8a216
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