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