]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/blame - db/dquot.c
xfsprogs: Release v6.10.1
[thirdparty/xfsprogs-dev.git] / db / dquot.c
CommitLineData
959ef981 1// SPDX-License-Identifier: GPL-2.0
2bd0ea18 2/*
da23017d
NS
3 * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc.
4 * All Rights Reserved.
2bd0ea18
NS
5 */
6
6b803e5a 7#include "libxfs.h"
2bd0ea18
NS
8#include "bit.h"
9#include "bmap.h"
10#include "command.h"
2bd0ea18
NS
11#include "type.h"
12#include "faddr.h"
13#include "fprint.h"
14#include "field.h"
15#include "inode.h"
16#include "io.h"
4ca431fc 17#include "init.h"
2bd0ea18 18#include "output.h"
28d8e155 19#include "dquot.h"
2bd0ea18
NS
20
21static int dquot_f(int argc, char **argv);
22static void dquot_help(void);
23
fa247a5b
ES
24static const cmdinfo_t dquot_cmd = {
25 "dquot", NULL, dquot_f, 1, 2, 1, N_("[-g|-p|-u] id"),
26N_("set current address to a group, project or user quota block for given ID"),
27 dquot_help,
28};
2bd0ea18
NS
29
30const field_t dqblk_hfld[] = {
31 { "", FLDT_DQBLK, OI(0), C1, 0, TYP_NONE },
32 { NULL }
33};
34
bf0f6e17
CH
35#define DDOFF(f) bitize(offsetof(struct xfs_dqblk, dd_ ## f))
36#define DDSZC(f) szcount(struct xfs_dqblk, dd_ ## f)
2bd0ea18
NS
37const field_t dqblk_flds[] = {
38 { "diskdq", FLDT_DISK_DQUOT, OI(DDOFF(diskdq)), C1, 0, TYP_NONE },
39 { "fill", FLDT_CHARS, OI(DDOFF(fill)), CI(DDSZC(fill)), FLD_SKIPALL,
40 TYP_NONE },
0522f1cc 41 { "crc", FLDT_CRC, OI(DDOFF(crc)), C1, 0, TYP_NONE },
2121203a
DC
42 { "lsn", FLDT_UINT64X, OI(DDOFF(lsn)), C1, 0, TYP_NONE },
43 { "uuid", FLDT_UUID, OI(DDOFF(uuid)), C1, 0, TYP_NONE },
2bd0ea18
NS
44 { NULL }
45};
46
527e257f 47#define DOFF(f) bitize(offsetof(struct xfs_disk_dquot, d_ ## f))
2bd0ea18
NS
48const field_t disk_dquot_flds[] = {
49 { "magic", FLDT_UINT16X, OI(DOFF(magic)), C1, 0, TYP_NONE },
50 { "version", FLDT_UINT8X, OI(DOFF(version)), C1, 0, TYP_NONE },
cde0e6a6 51 { "type", FLDT_UINT8X, OI(DOFF(type)), C1, 0, TYP_NONE },
2bd0ea18
NS
52 { "id", FLDT_DQID, OI(DOFF(id)), C1, 0, TYP_NONE },
53 { "blk_hardlimit", FLDT_QCNT, OI(DOFF(blk_hardlimit)), C1, 0,
54 TYP_NONE },
55 { "blk_softlimit", FLDT_QCNT, OI(DOFF(blk_softlimit)), C1, 0,
56 TYP_NONE },
57 { "ino_hardlimit", FLDT_QCNT, OI(DOFF(ino_hardlimit)), C1, 0,
58 TYP_NONE },
59 { "ino_softlimit", FLDT_QCNT, OI(DOFF(ino_softlimit)), C1, 0,
60 TYP_NONE },
61 { "bcount", FLDT_QCNT, OI(DOFF(bcount)), C1, 0, TYP_NONE },
62 { "icount", FLDT_QCNT, OI(DOFF(icount)), C1, 0, TYP_NONE },
a9a32fcb
DW
63 { "itimer", FLDT_QTIMER, OI(DOFF(itimer)), C1, 0, TYP_NONE },
64 { "btimer", FLDT_QTIMER, OI(DOFF(btimer)), C1, 0, TYP_NONE },
2bd0ea18
NS
65 { "iwarns", FLDT_QWARNCNT, OI(DOFF(iwarns)), C1, 0, TYP_NONE },
66 { "bwarns", FLDT_QWARNCNT, OI(DOFF(bwarns)), C1, 0, TYP_NONE },
31df6ad1 67 { "pad0", FLDT_UINT32X, OI(DOFF(pad0)), C1, FLD_SKIPALL, TYP_NONE },
2bd0ea18
NS
68 { "rtb_hardlimit", FLDT_QCNT, OI(DOFF(rtb_hardlimit)), C1, 0,
69 TYP_NONE },
70 { "rtb_softlimit", FLDT_QCNT, OI(DOFF(rtb_softlimit)), C1, 0,
71 TYP_NONE },
72 { "rtbcount", FLDT_QCNT, OI(DOFF(rtbcount)), C1, 0, TYP_NONE },
a9a32fcb 73 { "rtbtimer", FLDT_QTIMER, OI(DOFF(rtbtimer)), C1, 0, TYP_NONE },
2bd0ea18
NS
74 { "rtbwarns", FLDT_QWARNCNT, OI(DOFF(rtbwarns)), C1, 0, TYP_NONE },
75 { "pad", FLDT_UINT16X, OI(DOFF(pad)), C1, FLD_SKIPALL, TYP_NONE },
76 { NULL }
77};
78
79static void
80dquot_help(void)
81{
82}
83
84static int
85dquot_f(
86 int argc,
87 char **argv)
88{
89 bmap_ext_t bm;
90 int c;
b36eef04 91 int dogrp;
9b27bdbb 92 int doprj;
2bd0ea18
NS
93 xfs_dqid_t id;
94 xfs_ino_t ino;
3a2414fa 95 xfs_extnum_t nex;
2bd0ea18
NS
96 char *p;
97 int perblock;
98 xfs_fileoff_t qbno;
99 int qoff;
100 char *s;
101
9b27bdbb
NS
102 dogrp = doprj = optind = 0;
103 while ((c = getopt(argc, argv, "gpu")) != EOF) {
2bd0ea18 104 switch (c) {
b36eef04
NS
105 case 'g':
106 dogrp = 1;
9b27bdbb 107 doprj = 0;
2bd0ea18 108 break;
9b27bdbb
NS
109 case 'p':
110 doprj = 1;
b36eef04 111 dogrp = 0;
2bd0ea18 112 break;
9b27bdbb
NS
113 case 'u':
114 dogrp = doprj = 0;
115 break;
2bd0ea18 116 default:
9ee7055c 117 dbprintf(_("bad option for dquot command\n"));
2bd0ea18
NS
118 return 0;
119 }
120 }
9ee7055c 121 s = doprj ? _("project") : dogrp ? _("group") : _("user");
2bd0ea18 122 if (optind != argc - 1) {
9ee7055c 123 dbprintf(_("dquot command requires one %s id argument\n"), s);
2bd0ea18
NS
124 return 0;
125 }
0340d706
CS
126 ino = mp->m_sb.sb_uquotino;
127 if (doprj)
128 ino = mp->m_sb.sb_pquotino;
129 else if (dogrp)
130 ino = mp->m_sb.sb_gquotino;
131
132 if (ino == 0 || ino == NULLFSINO) {
9ee7055c 133 dbprintf(_("no %s quota inode present\n"), s);
2bd0ea18
NS
134 return 0;
135 }
136 id = (xfs_dqid_t)strtol(argv[optind], &p, 0);
137 if (*p != '\0') {
9ee7055c 138 dbprintf(_("bad %s id for dquot %s\n"), s, argv[optind]);
2bd0ea18
NS
139 return 0;
140 }
bf0f6e17 141 perblock = (int)(mp->m_sb.sb_blocksize / sizeof(struct xfs_dqblk));
be8e601c 142 qbno = (xfs_fileoff_t)id / perblock;
2bd0ea18
NS
143 qoff = (int)(id % perblock);
144 push_cur();
145 set_cur_inode(ino);
146 nex = 1;
147 bmap(qbno, 1, XFS_DATA_FORK, &nex, &bm);
148 pop_cur();
149 if (nex == 0) {
9ee7055c 150 dbprintf(_("no %s quota data for id %d\n"), s, id);
2bd0ea18
NS
151 return 0;
152 }
153 set_cur(&typtab[TYP_DQBLK], XFS_FSB_TO_DADDR(mp, bm.startblock), blkbb,
154 DB_RING_IGN, NULL);
13061b87 155 iocur_top->dquot_buf = 1;
bf0f6e17 156 off_cur(qoff * (int)sizeof(struct xfs_dqblk), sizeof(struct xfs_dqblk));
2bd0ea18
NS
157 ring_add();
158 return 0;
159}
160
1e9c13c5
ES
161void
162xfs_dquot_set_crc(
163 struct xfs_buf *bp)
164{
165 ASSERT((iocur_top->dquot_buf));
166 ASSERT(iocur_top->bp == bp);
167
168 xfs_update_cksum(iocur_top->data, sizeof(struct xfs_dqblk),
169 XFS_DQUOT_CRC_OFF);
170}
171
2bd0ea18
NS
172void
173dquot_init(void)
174{
175 add_command(&dquot_cmd);
176}