1ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin/*
2ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin * Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
3ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
4ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
5ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin * Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
6ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin * Copyright (c) 2005, 2006 Dmitry V. Levin <ldv@altlinux.org>
7ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin * All rights reserved.
8ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin *
9ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin * Redistribution and use in source and binary forms, with or without
10ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin * modification, are permitted provided that the following conditions
11ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin * are met:
12ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin * 1. Redistributions of source code must retain the above copyright
13ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin *    notice, this list of conditions and the following disclaimer.
14ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin * 2. Redistributions in binary form must reproduce the above copyright
15ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin *    notice, this list of conditions and the following disclaimer in the
16ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin *    documentation and/or other materials provided with the distribution.
17ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin * 3. The name of the author may not be used to endorse or promote products
18ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin *    derived from this software without specific prior written permission.
19ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin *
20ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin */
31ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
32ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#include "defs.h"
33ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
34ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define SUBCMDMASK  0x00ff
35ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define SUBCMDSHIFT 8
36ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define QCMD_CMD(cmd)	((u_int32_t)(cmd) >> SUBCMDSHIFT)
37ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define QCMD_TYPE(cmd)	((u_int32_t)(cmd) & SUBCMDMASK)
38ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
39ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define OLD_CMD(cmd)	((u_int32_t)(cmd) << 8)
40ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define NEW_CMD(cmd)	((u_int32_t)(cmd) | 0x800000)
41ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define XQM_CMD(cmd)	((u_int32_t)(cmd) | ('X'<<8))
42ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
43ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define Q_V1_QUOTAON	OLD_CMD(0x1)
44ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define Q_V1_QUOTAOFF	OLD_CMD(0x2)
45ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define Q_V1_GETQUOTA	OLD_CMD(0x3)
46ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define Q_V1_SETQUOTA	OLD_CMD(0x4)
47ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define Q_V1_SETUSE	OLD_CMD(0x5)
48ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define Q_V1_SYNC	OLD_CMD(0x6)
49ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define Q_SETQLIM	OLD_CMD(0x7)
50ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define Q_V1_GETSTATS	OLD_CMD(0x8)
51ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define Q_V1_RSQUASH	OLD_CMD(0x10)
52ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
53ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define Q_V2_GETQUOTA	OLD_CMD(0xD)
54ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define Q_V2_SETQUOTA	OLD_CMD(0xE)
55ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define Q_V2_SETUSE	OLD_CMD(0xF)
56ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define Q_V2_GETINFO	OLD_CMD(0x9)
57ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define Q_V2_SETINFO	OLD_CMD(0xA)
58ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define Q_V2_SETGRACE	OLD_CMD(0xB)
59ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define Q_V2_SETFLAGS	OLD_CMD(0xC)
60ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define Q_V2_GETSTATS	OLD_CMD(0x11)
61ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
62ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define Q_SYNC		NEW_CMD(0x1)
63ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define Q_QUOTAON	NEW_CMD(0x2)
64ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define Q_QUOTAOFF	NEW_CMD(0x3)
65ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define Q_GETFMT	NEW_CMD(0x4)
66ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define Q_GETINFO	NEW_CMD(0x5)
67ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define Q_SETINFO	NEW_CMD(0x6)
68ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define Q_GETQUOTA	NEW_CMD(0x7)
69ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define Q_SETQUOTA	NEW_CMD(0x8)
70ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
71ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define Q_XQUOTAON	XQM_CMD(0x1)
72ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define Q_XQUOTAOFF	XQM_CMD(0x2)
73ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define Q_XGETQUOTA	XQM_CMD(0x3)
74ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define Q_XSETQLIM	XQM_CMD(0x4)
75ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define Q_XGETQSTAT	XQM_CMD(0x5)
76ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define Q_XQUOTARM	XQM_CMD(0x6)
77ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define Q_XQUOTASYNC	XQM_CMD(0x7)
78ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
790ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/quotacmds.h"
80ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
81ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define USRQUOTA 0
82ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define GRPQUOTA 1
83ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
840ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/quotatypes.h"
85ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
86ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin/* Quota format identifiers */
87ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define QFMT_VFS_OLD 1
88ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define QFMT_VFS_V0  2
89ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
900ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/quota_formats.h"
91ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
92ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define XFS_QUOTA_UDQ_ACCT	(1<<0)	/* user quota accounting */
93ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define XFS_QUOTA_UDQ_ENFD	(1<<1)	/* user quota limits enforcement */
94ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define XFS_QUOTA_GDQ_ACCT	(1<<2)	/* group quota accounting */
95ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define XFS_QUOTA_GDQ_ENFD	(1<<3)	/* group quota limits enforcement */
96ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
97ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define XFS_USER_QUOTA		(1<<0)	/* user quota type */
98ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define XFS_PROJ_QUOTA		(1<<1)	/* (IRIX) project quota type */
99ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define XFS_GROUP_QUOTA		(1<<2)	/* group quota type */
100ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
1010ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/xfs_quota_flags.h"
1020ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/xfs_dqblk_flags.h"
103ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
104ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin/*
105ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin * Following flags are used to specify which fields are valid
106ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin */
107ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define QIF_BLIMITS	1
108ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define QIF_SPACE	2
109ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define QIF_ILIMITS	4
110ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define QIF_INODES	8
111ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define QIF_BTIME	16
112ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define QIF_ITIME	32
113ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
1140ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/if_dqblk_valid.h"
115ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
116ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levinstruct if_dqblk
117ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin{
118ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int64_t dqb_bhardlimit;
119ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int64_t dqb_bsoftlimit;
120ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int64_t dqb_curspace;
121ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int64_t dqb_ihardlimit;
122ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int64_t dqb_isoftlimit;
123ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int64_t dqb_curinodes;
124ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int64_t dqb_btime;
125ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int64_t dqb_itime;
126ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int32_t dqb_valid;
127ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin};
128ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
129ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levinstruct v1_dqblk
130ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin{
131ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int32_t dqb_bhardlimit;	/* absolute limit on disk blks alloc */
132ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int32_t dqb_bsoftlimit;	/* preferred limit on disk blks */
133ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int32_t dqb_curblocks;	/* current block count */
134ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int32_t dqb_ihardlimit;	/* maximum # allocated inodes */
135ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int32_t dqb_isoftlimit;	/* preferred inode limit */
136ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int32_t dqb_curinodes;	/* current # allocated inodes */
137ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	time_t  dqb_btime;	/* time limit for excessive disk use */
138ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	time_t  dqb_itime;	/* time limit for excessive files */
139ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin};
140ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
141ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levinstruct v2_dqblk
142ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin{
143ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	unsigned int dqb_ihardlimit;
144ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	unsigned int dqb_isoftlimit;
145ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	unsigned int dqb_curinodes;
146ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	unsigned int dqb_bhardlimit;
147ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	unsigned int dqb_bsoftlimit;
148ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int64_t dqb_curspace;
149ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	time_t  dqb_btime;
150ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	time_t  dqb_itime;
151ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin};
152ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
153ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levinstruct xfs_dqblk
154ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin{
155ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	int8_t  d_version;	/* version of this structure */
156ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	int8_t  d_flags;	/* XFS_{USER,PROJ,GROUP}_QUOTA */
157ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int16_t d_fieldmask;	/* field specifier */
158ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int32_t d_id;		/* user, project, or group ID */
159ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int64_t d_blk_hardlimit;	/* absolute limit on disk blks */
160ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int64_t d_blk_softlimit;	/* preferred limit on disk blks */
161ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int64_t d_ino_hardlimit;	/* maximum # allocated inodes */
162ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int64_t d_ino_softlimit;	/* preferred inode limit */
163ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int64_t d_bcount;	/* # disk blocks owned by the user */
164ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int64_t d_icount;	/* # inodes owned by the user */
165ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	int32_t d_itimer;	/* zero if within inode limits */
166ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	int32_t d_btimer;	/* similar to above; for disk blocks */
167ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int16_t d_iwarns;	/* # warnings issued wrt num inodes */
168ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int16_t d_bwarns;	/* # warnings issued wrt disk blocks */
169ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	int32_t d_padding2;	/* padding2 - for future use */
170ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int64_t d_rtb_hardlimit;	/* absolute limit on realtime blks */
171ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int64_t d_rtb_softlimit;	/* preferred limit on RT disk blks */
172ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int64_t d_rtbcount;	/* # realtime blocks owned */
173ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	int32_t d_rtbtimer;	/* similar to above; for RT disk blks */
174ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int16_t d_rtbwarns;	/* # warnings issued wrt RT disk blks */
175ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	int16_t d_padding3;	/* padding3 - for future use */
176ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	char    d_padding4[8];	/* yet more padding */
177ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin};
178ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
179ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin/*
180ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin * Following flags are used to specify which fields are valid
181ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin */
182ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define IIF_BGRACE	1
183ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define IIF_IGRACE	2
184ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin#define IIF_FLAGS	4
185ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
1860ed617bd66624cec6138102545d73b2e2346f1f6Dmitry V. Levin#include "xlat/if_dqinfo_valid.h"
187ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
188ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levinstruct if_dqinfo
189ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin{
190ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int64_t dqi_bgrace;
191ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int64_t dqi_igrace;
192ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int32_t dqi_flags;
193ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int32_t dqi_valid;
194ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin};
195ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
196ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levinstruct v2_dqinfo
197ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin{
198ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	unsigned int dqi_bgrace;
199ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	unsigned int dqi_igrace;
200ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	unsigned int dqi_flags;
201ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	unsigned int dqi_blocks;
202ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	unsigned int dqi_free_blk;
203ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	unsigned int dqi_free_entry;
204ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin};
205ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
206ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levinstruct v1_dqstats
207ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin{
208ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int32_t lookups;
209ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int32_t drops;
210ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int32_t reads;
211ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int32_t writes;
212ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int32_t cache_hits;
213ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int32_t allocated_dquots;
214ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int32_t free_dquots;
215ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int32_t syncs;
216ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin};
217ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
218ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levinstruct v2_dqstats
219ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin{
220ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int32_t lookups;
221ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int32_t drops;
222ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int32_t reads;
223ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int32_t writes;
224ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int32_t cache_hits;
225ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int32_t allocated_dquots;
226ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int32_t free_dquots;
227ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int32_t syncs;
228ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int32_t version;
229ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin};
230ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
231ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levintypedef struct fs_qfilestat
232ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin{
233ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int64_t qfs_ino;	/* inode number */
234ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int64_t qfs_nblks;	/* number of BBs 512-byte-blks */
235ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int32_t qfs_nextents;	/* number of extents */
236ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin} fs_qfilestat_t;
237ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
238ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levinstruct xfs_dqstats
239ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin{
240ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	int8_t  qs_version;	/* version number for future changes */
241ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int16_t qs_flags;	/* XFS_QUOTA_{U,P,G}DQ_{ACCT,ENFD} */
242ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	int8_t  qs_pad;		/* unused */
243ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	fs_qfilestat_t qs_uquota;	/* user quota storage information */
244ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	fs_qfilestat_t qs_gquota;	/* group quota storage information */
245ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int32_t qs_incoredqs;	/* number of dquots incore */
246ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	int32_t qs_btimelimit;	/* limit for blks timer */
247ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	int32_t qs_itimelimit;	/* limit for inodes timer */
248ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	int32_t qs_rtbtimelimit;	/* limit for rt blks timer */
249ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int16_t qs_bwarnlimit;	/* limit for num warnings */
250ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int16_t qs_iwarnlimit;	/* limit for num warnings */
251ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin};
252ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
253ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levinstatic void
254ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levindecode_cmd_data(struct tcb *tcp, u_int32_t cmd, unsigned long data)
255ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin{
2567b609d5ba0852e6c56ba311350ebd4412361777bDenys Vlasenko	switch (cmd) {
257ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		case Q_GETQUOTA:
258ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		case Q_SETQUOTA:
259ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		{
260ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			struct if_dqblk dq;
261ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
2627b609d5ba0852e6c56ba311350ebd4412361777bDenys Vlasenko			if (cmd == Q_GETQUOTA && syserror(tcp)) {
263ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				tprintf("%#lx", data);
264ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				break;
265ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			}
2667b609d5ba0852e6c56ba311350ebd4412361777bDenys Vlasenko			if (umove(tcp, data, &dq) < 0) {
267ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				tprintf("{???} %#lx", data);
268ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				break;
269ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			}
270ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("{bhardlimit=%" PRIu64 ", ", dq.dqb_bhardlimit);
271ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("bsoftlimit=%" PRIu64 ", ", dq.dqb_bsoftlimit);
272ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("curspace=%" PRIu64 ", ", dq.dqb_curspace);
273ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("ihardlimit=%" PRIu64 ", ", dq.dqb_ihardlimit);
274ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("isoftlimit=%" PRIu64 ", ", dq.dqb_isoftlimit);
275ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("curinodes=%" PRIu64 ", ", dq.dqb_curinodes);
2767b609d5ba0852e6c56ba311350ebd4412361777bDenys Vlasenko			if (!abbrev(tcp)) {
277ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				tprintf("btime=%" PRIu64 ", ", dq.dqb_btime);
278ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				tprintf("itime=%" PRIu64 ", ", dq.dqb_itime);
27960fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko				tprints("valid=");
280ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				printflags(if_dqblk_valid,
281ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin					   dq.dqb_valid, "QIF_???");
28260fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko				tprints("}");
283ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			} else
28460fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko				tprints("...}");
285ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			break;
286ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		}
287ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		case Q_V1_GETQUOTA:
288ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		case Q_V1_SETQUOTA:
289ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		{
290ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			struct v1_dqblk dq;
291ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
2927b609d5ba0852e6c56ba311350ebd4412361777bDenys Vlasenko			if (cmd == Q_V1_GETQUOTA && syserror(tcp)) {
293ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				tprintf("%#lx", data);
294ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				break;
295ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			}
2967b609d5ba0852e6c56ba311350ebd4412361777bDenys Vlasenko			if (umove(tcp, data, &dq) < 0) {
297ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				tprintf("{???} %#lx", data);
298ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				break;
299ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			}
300ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("{bhardlimit=%u, ", dq.dqb_bhardlimit);
301ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("bsoftlimit=%u, ", dq.dqb_bsoftlimit);
302ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("curblocks=%u, ", dq.dqb_curblocks);
303ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("ihardlimit=%u, ", dq.dqb_ihardlimit);
304ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("isoftlimit=%u, ", dq.dqb_isoftlimit);
305ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("curinodes=%u, ", dq.dqb_curinodes);
3060b315b65432cda20c7e5608c5124289036522fa7H.J. Lu			tprintf("btime=%lu, ", (long) dq.dqb_btime);
3070b315b65432cda20c7e5608c5124289036522fa7H.J. Lu			tprintf("itime=%lu}", (long) dq.dqb_itime);
308ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			break;
309ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		}
310ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		case Q_V2_GETQUOTA:
311ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		case Q_V2_SETQUOTA:
312ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		{
313ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			struct v2_dqblk dq;
314ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
3157b609d5ba0852e6c56ba311350ebd4412361777bDenys Vlasenko			if (cmd == Q_V2_GETQUOTA && syserror(tcp)) {
316ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				tprintf("%#lx", data);
317ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				break;
318ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			}
3197b609d5ba0852e6c56ba311350ebd4412361777bDenys Vlasenko			if (umove(tcp, data, &dq) < 0) {
320ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				tprintf("{???} %#lx", data);
321ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				break;
322ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			}
323ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("{ihardlimit=%u, ", dq.dqb_ihardlimit);
324ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("isoftlimit=%u, ", dq.dqb_isoftlimit);
325ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("curinodes=%u, ", dq.dqb_curinodes);
326ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("bhardlimit=%u, ", dq.dqb_bhardlimit);
327ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("bsoftlimit=%u, ", dq.dqb_bsoftlimit);
328ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("curspace=%" PRIu64 ", ", dq.dqb_curspace);
3290b315b65432cda20c7e5608c5124289036522fa7H.J. Lu			tprintf("btime=%lu, ", (long) dq.dqb_btime);
3300b315b65432cda20c7e5608c5124289036522fa7H.J. Lu			tprintf("itime=%lu}", (long) dq.dqb_itime);
331ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			break;
332ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		}
333ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		case Q_XGETQUOTA:
334ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		case Q_XSETQLIM:
335ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		{
336ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			struct xfs_dqblk dq;
337ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
3387b609d5ba0852e6c56ba311350ebd4412361777bDenys Vlasenko			if (cmd == Q_XGETQUOTA && syserror(tcp)) {
339ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				tprintf("%#lx", data);
340ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				break;
341ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			}
3427b609d5ba0852e6c56ba311350ebd4412361777bDenys Vlasenko			if (umove(tcp, data, &dq) < 0) {
343ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				tprintf("{???} %#lx", data);
344ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				break;
345ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			}
346ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("{version=%d, ", dq.d_version);
34760fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("flags=");
348ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			printflags(xfs_dqblk_flags,
349ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				   dq.d_flags, "XFS_???_QUOTA");
350ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf(", fieldmask=%#x, ", dq.d_fieldmask);
351ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("id=%u, ", dq.d_id);
352ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("blk_hardlimit=%" PRIu64 ", ", dq.d_blk_hardlimit);
353ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("blk_softlimit=%" PRIu64 ", ", dq.d_blk_softlimit);
354ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("ino_hardlimit=%" PRIu64 ", ", dq.d_ino_hardlimit);
355ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("ino_softlimit=%" PRIu64 ", ", dq.d_ino_softlimit);
356ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("bcount=%" PRIu64 ", ", dq.d_bcount);
357ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("icount=%" PRIu64 ", ", dq.d_icount);
3587b609d5ba0852e6c56ba311350ebd4412361777bDenys Vlasenko			if (!abbrev(tcp)) {
359ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				tprintf("itimer=%d, ", dq.d_itimer);
360ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				tprintf("btimer=%d, ", dq.d_btimer);
361ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				tprintf("iwarns=%u, ", dq.d_iwarns);
362ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				tprintf("bwarns=%u, ", dq.d_bwarns);
363ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				tprintf("rtbcount=%" PRIu64 ", ", dq.d_rtbcount);
364ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				tprintf("rtbtimer=%d, ", dq.d_rtbtimer);
365ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				tprintf("rtbwarns=%u}", dq.d_rtbwarns);
366ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			} else
36760fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko				tprints("...}");
368ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			break;
369ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		}
370ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		case Q_GETFMT:
371ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		{
372ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			u_int32_t fmt;
373ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
3747b609d5ba0852e6c56ba311350ebd4412361777bDenys Vlasenko			if (syserror(tcp)) {
375ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				tprintf("%#lx", data);
376ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				break;
377ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			}
3787b609d5ba0852e6c56ba311350ebd4412361777bDenys Vlasenko			if (umove(tcp, data, &fmt) < 0) {
379ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				tprintf("{???} %#lx", data);
380ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				break;
381ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			}
38260fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("{");
383ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			printxval(quota_formats, fmt, "QFMT_VFS_???");
38460fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("}");
385ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			break;
386ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		}
387ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		case Q_GETINFO:
388ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		case Q_SETINFO:
389ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		{
390ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			struct if_dqinfo dq;
391ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
3927b609d5ba0852e6c56ba311350ebd4412361777bDenys Vlasenko			if (cmd == Q_GETINFO && syserror(tcp)) {
393ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				tprintf("%#lx", data);
394ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				break;
395ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			}
3967b609d5ba0852e6c56ba311350ebd4412361777bDenys Vlasenko			if (umove(tcp, data, &dq) < 0) {
397ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				tprintf("{???} %#lx", data);
398ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				break;
399ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			}
400ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("{bgrace=%" PRIu64 ", ", dq.dqi_bgrace);
401ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("igrace=%" PRIu64 ", ", dq.dqi_igrace);
402ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("flags=%#x, ", dq.dqi_flags);
40360fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("valid=");
404ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			printflags(if_dqinfo_valid, dq.dqi_valid, "IIF_???");
40560fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("}");
406ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			break;
407ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		}
408ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		case Q_V2_GETINFO:
409ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		case Q_V2_SETINFO:
410ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		{
411ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			struct v2_dqinfo dq;
412ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
4137b609d5ba0852e6c56ba311350ebd4412361777bDenys Vlasenko			if (cmd == Q_V2_GETINFO && syserror(tcp)) {
414ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				tprintf("%#lx", data);
415ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				break;
416ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			}
4177b609d5ba0852e6c56ba311350ebd4412361777bDenys Vlasenko			if (umove(tcp, data, &dq) < 0) {
418ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				tprintf("{???} %#lx", data);
419ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				break;
420ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			}
421ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("{bgrace=%u, ", dq.dqi_bgrace);
422ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("igrace=%u, ", dq.dqi_igrace);
423ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("flags=%#x, ", dq.dqi_flags);
424ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("blocks=%u, ", dq.dqi_blocks);
425ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("free_blk=%u, ", dq.dqi_free_blk);
426ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("free_entry=%u}", dq.dqi_free_entry);
427ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			break;
428ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		}
429ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		case Q_V1_GETSTATS:
430ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		{
431ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			struct v1_dqstats dq;
432ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
4337b609d5ba0852e6c56ba311350ebd4412361777bDenys Vlasenko			if (syserror(tcp)) {
434ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				tprintf("%#lx", data);
435ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				break;
436ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			}
4377b609d5ba0852e6c56ba311350ebd4412361777bDenys Vlasenko			if (umove(tcp, data, &dq) < 0) {
438ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				tprintf("{???} %#lx", data);
439ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				break;
440ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			}
441ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("{lookups=%u, ", dq.lookups);
442ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("drops=%u, ", dq.drops);
443ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("reads=%u, ", dq.reads);
444ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("writes=%u, ", dq.writes);
445ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("cache_hits=%u, ", dq.cache_hits);
446ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("allocated_dquots=%u, ", dq.allocated_dquots);
447ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("free_dquots=%u, ", dq.free_dquots);
448ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("syncs=%u}", dq.syncs);
449ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			break;
450ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		}
451ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		case Q_V2_GETSTATS:
452ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		{
453ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			struct v2_dqstats dq;
454ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
4557b609d5ba0852e6c56ba311350ebd4412361777bDenys Vlasenko			if (syserror(tcp)) {
456ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				tprintf("%#lx", data);
457ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				break;
458ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			}
4597b609d5ba0852e6c56ba311350ebd4412361777bDenys Vlasenko			if (umove(tcp, data, &dq) < 0) {
460ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				tprintf("{???} %#lx", data);
461ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				break;
462ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			}
463ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("{lookups=%u, ", dq.lookups);
464ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("drops=%u, ", dq.drops);
465ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("reads=%u, ", dq.reads);
466ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("writes=%u, ", dq.writes);
467ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("cache_hits=%u, ", dq.cache_hits);
468ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("allocated_dquots=%u, ", dq.allocated_dquots);
469ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("free_dquots=%u, ", dq.free_dquots);
470ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("syncs=%u, ", dq.syncs);
471ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("version=%u}", dq.version);
472ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			break;
473ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		}
474ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		case Q_XGETQSTAT:
475ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		{
476ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			struct xfs_dqstats dq;
477ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
4787b609d5ba0852e6c56ba311350ebd4412361777bDenys Vlasenko			if (syserror(tcp)) {
479ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				tprintf("%#lx", data);
480ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				break;
481ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			}
4827b609d5ba0852e6c56ba311350ebd4412361777bDenys Vlasenko			if (umove(tcp, data, &dq) < 0) {
483ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				tprintf("{???} %#lx", data);
484ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				break;
485ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			}
486ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("{version=%d, ", dq.qs_version);
4877b609d5ba0852e6c56ba311350ebd4412361777bDenys Vlasenko			if (abbrev(tcp)) {
48860fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko				tprints("...}");
489ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				break;
490ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			}
49160fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("flags=");
492ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			printflags(xfs_quota_flags,
493ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				   dq.qs_flags, "XFS_QUOTA_???");
494ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf(", incoredqs=%u, ", dq.qs_incoredqs);
495ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("u_ino=%" PRIu64 ", ", dq.qs_uquota.qfs_ino);
496ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("u_nblks=%" PRIu64 ", ", dq.qs_uquota.qfs_nblks);
497ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("u_nextents=%u, ", dq.qs_uquota.qfs_nextents);
498ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("g_ino=%" PRIu64 ", ", dq.qs_gquota.qfs_ino);
499ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("g_nblks=%" PRIu64 ", ", dq.qs_gquota.qfs_nblks);
500ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("g_nextents=%u, ", dq.qs_gquota.qfs_nextents);
501ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("btimelimit=%d, ", dq.qs_btimelimit);
502ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("itimelimit=%d, ", dq.qs_itimelimit);
503ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("rtbtimelimit=%d, ", dq.qs_rtbtimelimit);
504ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("bwarnlimit=%u, ", dq.qs_bwarnlimit);
505ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("iwarnlimit=%u}", dq.qs_iwarnlimit);
506ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			break;
507ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		}
508ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		case Q_XQUOTAON:
509ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		{
510ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			u_int32_t flag;
511ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
5127b609d5ba0852e6c56ba311350ebd4412361777bDenys Vlasenko			if (umove(tcp, data, &flag) < 0) {
513ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				tprintf("{???} %#lx", data);
514ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				break;
515ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			}
51660fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("{");
517ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			printflags(xfs_quota_flags, flag, "XFS_QUOTA_???");
51860fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("}");
519ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			break;
520ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		}
521ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		default:
522ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			tprintf("%#lx", data);
523ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			break;
524ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	}
525ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin}
526ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
527a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(quotactl)
528ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin{
529ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	/*
530ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	 * The Linux kernel only looks at the low 32 bits of command and id
531ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	 * arguments, but on some 64-bit architectures (s390x) this word
532ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	 * will have been sign-extended when we see it.  The high 1 bits
533ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	 * don't mean anything, so don't confuse the output with them.
534ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	 */
535ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int32_t qcmd = tcp->u_arg[0];
536ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int32_t cmd = QCMD_CMD(qcmd);
537ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int32_t type = QCMD_TYPE(qcmd);
538ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	u_int32_t id = tcp->u_arg[2];
539ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
540ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	if (!verbose(tcp))
541ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		return printargs(tcp);
542ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin
5437b609d5ba0852e6c56ba311350ebd4412361777bDenys Vlasenko	if (entering(tcp)) {
544ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		printxval(quotacmds, cmd, "Q_???");
54560fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints("|");
546ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		printxval(quotatypes, type, "???QUOTA");
54760fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints(", ");
5487943966f6cd137e44f27d56aaf21b023fb1fae63Dmitry V. Levin		printpath(tcp, tcp->u_arg[1]);
54960fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints(", ");
5507b609d5ba0852e6c56ba311350ebd4412361777bDenys Vlasenko		switch (cmd) {
551ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			case Q_V1_QUOTAON:
552ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			case Q_QUOTAON:
553ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				printxval(quota_formats, id, "QFMT_VFS_???");
554ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				break;
555ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			case Q_V1_GETQUOTA:
556ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			case Q_V2_GETQUOTA:
557ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			case Q_GETQUOTA:
558ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			case Q_V1_SETQUOTA:
559ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			case Q_V2_SETQUOTA:
560ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			case Q_V1_SETUSE:
561ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			case Q_V2_SETUSE:
562ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			case Q_SETQLIM:
563ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			case Q_SETQUOTA:
564ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			case Q_XGETQUOTA:
565ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			case Q_XSETQLIM:
566ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				tprintf("%u", id);
567ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				break;
568ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			default:
569ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				tprintf("%#lx", tcp->u_arg[2]);
570ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin				break;
571ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		}
57260fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko		tprints(", ");
5737b609d5ba0852e6c56ba311350ebd4412361777bDenys Vlasenko	} else {
574ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		if (!tcp->u_arg[3])
57560fe8c139c6f2febefe595781812ddf0864a6ab8Denys Vlasenko			tprints("NULL");
576ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin		else
577ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin			decode_cmd_data(tcp, cmd, tcp->u_arg[3]);
578ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	}
579ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin	return 0;
580ef5c3d657dee362898d84e697efea4a5e48a7b96Dmitry V. Levin}
581