Merge remote-tracking branches 'regulator/topic/axp20x', 'regulator/topic/da9211...
[linux-drm-fsl-dcu.git] / fs / xfs / xfs_qm_syscalls.c
1 /*
2  * Copyright (c) 2000-2005 Silicon Graphics, Inc.
3  * All Rights Reserved.
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it would be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write the Free Software Foundation,
16  * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17  */
18
19 #include <linux/capability.h>
20
21 #include "xfs.h"
22 #include "xfs_fs.h"
23 #include "xfs_shared.h"
24 #include "xfs_format.h"
25 #include "xfs_log_format.h"
26 #include "xfs_trans_resv.h"
27 #include "xfs_bit.h"
28 #include "xfs_sb.h"
29 #include "xfs_mount.h"
30 #include "xfs_inode.h"
31 #include "xfs_trans.h"
32 #include "xfs_error.h"
33 #include "xfs_quota.h"
34 #include "xfs_qm.h"
35 #include "xfs_trace.h"
36 #include "xfs_icache.h"
37
38 STATIC int      xfs_qm_log_quotaoff(xfs_mount_t *, xfs_qoff_logitem_t **, uint);
39 STATIC int      xfs_qm_log_quotaoff_end(xfs_mount_t *, xfs_qoff_logitem_t *,
40                                         uint);
41 STATIC uint     xfs_qm_export_flags(uint);
42
43 /*
44  * Turn off quota accounting and/or enforcement for all udquots and/or
45  * gdquots. Called only at unmount time.
46  *
47  * This assumes that there are no dquots of this file system cached
48  * incore, and modifies the ondisk dquot directly. Therefore, for example,
49  * it is an error to call this twice, without purging the cache.
50  */
51 int
52 xfs_qm_scall_quotaoff(
53         xfs_mount_t             *mp,
54         uint                    flags)
55 {
56         struct xfs_quotainfo    *q = mp->m_quotainfo;
57         uint                    dqtype;
58         int                     error;
59         uint                    inactivate_flags;
60         xfs_qoff_logitem_t      *qoffstart;
61
62         /*
63          * No file system can have quotas enabled on disk but not in core.
64          * Note that quota utilities (like quotaoff) _expect_
65          * errno == -EEXIST here.
66          */
67         if ((mp->m_qflags & flags) == 0)
68                 return -EEXIST;
69         error = 0;
70
71         flags &= (XFS_ALL_QUOTA_ACCT | XFS_ALL_QUOTA_ENFD);
72
73         /*
74          * We don't want to deal with two quotaoffs messing up each other,
75          * so we're going to serialize it. quotaoff isn't exactly a performance
76          * critical thing.
77          * If quotaoff, then we must be dealing with the root filesystem.
78          */
79         ASSERT(q);
80         mutex_lock(&q->qi_quotaofflock);
81
82         /*
83          * If we're just turning off quota enforcement, change mp and go.
84          */
85         if ((flags & XFS_ALL_QUOTA_ACCT) == 0) {
86                 mp->m_qflags &= ~(flags);
87
88                 spin_lock(&mp->m_sb_lock);
89                 mp->m_sb.sb_qflags = mp->m_qflags;
90                 spin_unlock(&mp->m_sb_lock);
91                 mutex_unlock(&q->qi_quotaofflock);
92
93                 /* XXX what to do if error ? Revert back to old vals incore ? */
94                 error = xfs_qm_write_sb_changes(mp, XFS_SB_QFLAGS);
95                 return error;
96         }
97
98         dqtype = 0;
99         inactivate_flags = 0;
100         /*
101          * If accounting is off, we must turn enforcement off, clear the
102          * quota 'CHKD' certificate to make it known that we have to
103          * do a quotacheck the next time this quota is turned on.
104          */
105         if (flags & XFS_UQUOTA_ACCT) {
106                 dqtype |= XFS_QMOPT_UQUOTA;
107                 flags |= (XFS_UQUOTA_CHKD | XFS_UQUOTA_ENFD);
108                 inactivate_flags |= XFS_UQUOTA_ACTIVE;
109         }
110         if (flags & XFS_GQUOTA_ACCT) {
111                 dqtype |= XFS_QMOPT_GQUOTA;
112                 flags |= (XFS_GQUOTA_CHKD | XFS_GQUOTA_ENFD);
113                 inactivate_flags |= XFS_GQUOTA_ACTIVE;
114         }
115         if (flags & XFS_PQUOTA_ACCT) {
116                 dqtype |= XFS_QMOPT_PQUOTA;
117                 flags |= (XFS_PQUOTA_CHKD | XFS_PQUOTA_ENFD);
118                 inactivate_flags |= XFS_PQUOTA_ACTIVE;
119         }
120
121         /*
122          * Nothing to do?  Don't complain. This happens when we're just
123          * turning off quota enforcement.
124          */
125         if ((mp->m_qflags & flags) == 0)
126                 goto out_unlock;
127
128         /*
129          * Write the LI_QUOTAOFF log record, and do SB changes atomically,
130          * and synchronously. If we fail to write, we should abort the
131          * operation as it cannot be recovered safely if we crash.
132          */
133         error = xfs_qm_log_quotaoff(mp, &qoffstart, flags);
134         if (error)
135                 goto out_unlock;
136
137         /*
138          * Next we clear the XFS_MOUNT_*DQ_ACTIVE bit(s) in the mount struct
139          * to take care of the race between dqget and quotaoff. We don't take
140          * any special locks to reset these bits. All processes need to check
141          * these bits *after* taking inode lock(s) to see if the particular
142          * quota type is in the process of being turned off. If *ACTIVE, it is
143          * guaranteed that all dquot structures and all quotainode ptrs will all
144          * stay valid as long as that inode is kept locked.
145          *
146          * There is no turning back after this.
147          */
148         mp->m_qflags &= ~inactivate_flags;
149
150         /*
151          * Give back all the dquot reference(s) held by inodes.
152          * Here we go thru every single incore inode in this file system, and
153          * do a dqrele on the i_udquot/i_gdquot that it may have.
154          * Essentially, as long as somebody has an inode locked, this guarantees
155          * that quotas will not be turned off. This is handy because in a
156          * transaction once we lock the inode(s) and check for quotaon, we can
157          * depend on the quota inodes (and other things) being valid as long as
158          * we keep the lock(s).
159          */
160         xfs_qm_dqrele_all_inodes(mp, flags);
161
162         /*
163          * Next we make the changes in the quota flag in the mount struct.
164          * This isn't protected by a particular lock directly, because we
165          * don't want to take a mrlock every time we depend on quotas being on.
166          */
167         mp->m_qflags &= ~flags;
168
169         /*
170          * Go through all the dquots of this file system and purge them,
171          * according to what was turned off.
172          */
173         xfs_qm_dqpurge_all(mp, dqtype);
174
175         /*
176          * Transactions that had started before ACTIVE state bit was cleared
177          * could have logged many dquots, so they'd have higher LSNs than
178          * the first QUOTAOFF log record does. If we happen to crash when
179          * the tail of the log has gone past the QUOTAOFF record, but
180          * before the last dquot modification, those dquots __will__
181          * recover, and that's not good.
182          *
183          * So, we have QUOTAOFF start and end logitems; the start
184          * logitem won't get overwritten until the end logitem appears...
185          */
186         error = xfs_qm_log_quotaoff_end(mp, qoffstart, flags);
187         if (error) {
188                 /* We're screwed now. Shutdown is the only option. */
189                 xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
190                 goto out_unlock;
191         }
192
193         /*
194          * If all quotas are completely turned off, close shop.
195          */
196         if (mp->m_qflags == 0) {
197                 mutex_unlock(&q->qi_quotaofflock);
198                 xfs_qm_destroy_quotainfo(mp);
199                 return 0;
200         }
201
202         /*
203          * Release our quotainode references if we don't need them anymore.
204          */
205         if ((dqtype & XFS_QMOPT_UQUOTA) && q->qi_uquotaip) {
206                 IRELE(q->qi_uquotaip);
207                 q->qi_uquotaip = NULL;
208         }
209         if ((dqtype & XFS_QMOPT_GQUOTA) && q->qi_gquotaip) {
210                 IRELE(q->qi_gquotaip);
211                 q->qi_gquotaip = NULL;
212         }
213         if ((dqtype & XFS_QMOPT_PQUOTA) && q->qi_pquotaip) {
214                 IRELE(q->qi_pquotaip);
215                 q->qi_pquotaip = NULL;
216         }
217
218 out_unlock:
219         mutex_unlock(&q->qi_quotaofflock);
220         return error;
221 }
222
223 STATIC int
224 xfs_qm_scall_trunc_qfile(
225         struct xfs_mount        *mp,
226         xfs_ino_t               ino)
227 {
228         struct xfs_inode        *ip;
229         struct xfs_trans        *tp;
230         int                     error;
231
232         if (ino == NULLFSINO)
233                 return 0;
234
235         error = xfs_iget(mp, NULL, ino, 0, 0, &ip);
236         if (error)
237                 return error;
238
239         xfs_ilock(ip, XFS_IOLOCK_EXCL);
240
241         tp = xfs_trans_alloc(mp, XFS_TRANS_TRUNCATE_FILE);
242         error = xfs_trans_reserve(tp, &M_RES(mp)->tr_itruncate, 0, 0);
243         if (error) {
244                 xfs_trans_cancel(tp, 0);
245                 xfs_iunlock(ip, XFS_IOLOCK_EXCL);
246                 goto out_put;
247         }
248
249         xfs_ilock(ip, XFS_ILOCK_EXCL);
250         xfs_trans_ijoin(tp, ip, 0);
251
252         ip->i_d.di_size = 0;
253         xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
254
255         error = xfs_itruncate_extents(&tp, ip, XFS_DATA_FORK, 0);
256         if (error) {
257                 xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES |
258                                      XFS_TRANS_ABORT);
259                 goto out_unlock;
260         }
261
262         ASSERT(ip->i_d.di_nextents == 0);
263
264         xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
265         error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES);
266
267 out_unlock:
268         xfs_iunlock(ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL);
269 out_put:
270         IRELE(ip);
271         return error;
272 }
273
274 int
275 xfs_qm_scall_trunc_qfiles(
276         xfs_mount_t     *mp,
277         uint            flags)
278 {
279         int             error = -EINVAL;
280
281         if (!xfs_sb_version_hasquota(&mp->m_sb) || flags == 0 ||
282             (flags & ~XFS_DQ_ALLTYPES)) {
283                 xfs_debug(mp, "%s: flags=%x m_qflags=%x",
284                         __func__, flags, mp->m_qflags);
285                 return -EINVAL;
286         }
287
288         if (flags & XFS_DQ_USER) {
289                 error = xfs_qm_scall_trunc_qfile(mp, mp->m_sb.sb_uquotino);
290                 if (error)
291                         return error;
292         }
293         if (flags & XFS_DQ_GROUP) {
294                 error = xfs_qm_scall_trunc_qfile(mp, mp->m_sb.sb_gquotino);
295                 if (error)
296                         return error;
297         }
298         if (flags & XFS_DQ_PROJ)
299                 error = xfs_qm_scall_trunc_qfile(mp, mp->m_sb.sb_pquotino);
300
301         return error;
302 }
303
304 /*
305  * Switch on (a given) quota enforcement for a filesystem.  This takes
306  * effect immediately.
307  * (Switching on quota accounting must be done at mount time.)
308  */
309 int
310 xfs_qm_scall_quotaon(
311         xfs_mount_t     *mp,
312         uint            flags)
313 {
314         int             error;
315         uint            qf;
316         __int64_t       sbflags;
317
318         flags &= (XFS_ALL_QUOTA_ACCT | XFS_ALL_QUOTA_ENFD);
319         /*
320          * Switching on quota accounting must be done at mount time.
321          */
322         flags &= ~(XFS_ALL_QUOTA_ACCT);
323
324         sbflags = 0;
325
326         if (flags == 0) {
327                 xfs_debug(mp, "%s: zero flags, m_qflags=%x",
328                         __func__, mp->m_qflags);
329                 return -EINVAL;
330         }
331
332         /* No fs can turn on quotas with a delayed effect */
333         ASSERT((flags & XFS_ALL_QUOTA_ACCT) == 0);
334
335         /*
336          * Can't enforce without accounting. We check the superblock
337          * qflags here instead of m_qflags because rootfs can have
338          * quota acct on ondisk without m_qflags' knowing.
339          */
340         if (((flags & XFS_UQUOTA_ACCT) == 0 &&
341              (mp->m_sb.sb_qflags & XFS_UQUOTA_ACCT) == 0 &&
342              (flags & XFS_UQUOTA_ENFD)) ||
343             ((flags & XFS_GQUOTA_ACCT) == 0 &&
344              (mp->m_sb.sb_qflags & XFS_GQUOTA_ACCT) == 0 &&
345              (flags & XFS_GQUOTA_ENFD)) ||
346             ((flags & XFS_PQUOTA_ACCT) == 0 &&
347              (mp->m_sb.sb_qflags & XFS_PQUOTA_ACCT) == 0 &&
348              (flags & XFS_PQUOTA_ENFD))) {
349                 xfs_debug(mp,
350                         "%s: Can't enforce without acct, flags=%x sbflags=%x",
351                         __func__, flags, mp->m_sb.sb_qflags);
352                 return -EINVAL;
353         }
354         /*
355          * If everything's up to-date incore, then don't waste time.
356          */
357         if ((mp->m_qflags & flags) == flags)
358                 return -EEXIST;
359
360         /*
361          * Change sb_qflags on disk but not incore mp->qflags
362          * if this is the root filesystem.
363          */
364         spin_lock(&mp->m_sb_lock);
365         qf = mp->m_sb.sb_qflags;
366         mp->m_sb.sb_qflags = qf | flags;
367         spin_unlock(&mp->m_sb_lock);
368
369         /*
370          * There's nothing to change if it's the same.
371          */
372         if ((qf & flags) == flags && sbflags == 0)
373                 return -EEXIST;
374         sbflags |= XFS_SB_QFLAGS;
375
376         if ((error = xfs_qm_write_sb_changes(mp, sbflags)))
377                 return error;
378         /*
379          * If we aren't trying to switch on quota enforcement, we are done.
380          */
381         if  (((mp->m_sb.sb_qflags & XFS_UQUOTA_ACCT) !=
382              (mp->m_qflags & XFS_UQUOTA_ACCT)) ||
383              ((mp->m_sb.sb_qflags & XFS_PQUOTA_ACCT) !=
384              (mp->m_qflags & XFS_PQUOTA_ACCT)) ||
385              ((mp->m_sb.sb_qflags & XFS_GQUOTA_ACCT) !=
386              (mp->m_qflags & XFS_GQUOTA_ACCT)) ||
387             (flags & XFS_ALL_QUOTA_ENFD) == 0)
388                 return 0;
389
390         if (! XFS_IS_QUOTA_RUNNING(mp))
391                 return -ESRCH;
392
393         /*
394          * Switch on quota enforcement in core.
395          */
396         mutex_lock(&mp->m_quotainfo->qi_quotaofflock);
397         mp->m_qflags |= (flags & XFS_ALL_QUOTA_ENFD);
398         mutex_unlock(&mp->m_quotainfo->qi_quotaofflock);
399
400         return 0;
401 }
402
403
404 /*
405  * Return quota status information, such as uquota-off, enforcements, etc.
406  * for Q_XGETQSTAT command.
407  */
408 int
409 xfs_qm_scall_getqstat(
410         struct xfs_mount        *mp,
411         struct fs_quota_stat    *out)
412 {
413         struct xfs_quotainfo    *q = mp->m_quotainfo;
414         struct xfs_inode        *uip = NULL;
415         struct xfs_inode        *gip = NULL;
416         struct xfs_inode        *pip = NULL;
417         bool                    tempuqip = false;
418         bool                    tempgqip = false;
419         bool                    temppqip = false;
420
421         memset(out, 0, sizeof(fs_quota_stat_t));
422
423         out->qs_version = FS_QSTAT_VERSION;
424         if (!xfs_sb_version_hasquota(&mp->m_sb)) {
425                 out->qs_uquota.qfs_ino = NULLFSINO;
426                 out->qs_gquota.qfs_ino = NULLFSINO;
427                 return 0;
428         }
429
430         out->qs_flags = (__uint16_t) xfs_qm_export_flags(mp->m_qflags &
431                                                         (XFS_ALL_QUOTA_ACCT|
432                                                          XFS_ALL_QUOTA_ENFD));
433         if (q) {
434                 uip = q->qi_uquotaip;
435                 gip = q->qi_gquotaip;
436                 pip = q->qi_pquotaip;
437         }
438         if (!uip && mp->m_sb.sb_uquotino != NULLFSINO) {
439                 if (xfs_iget(mp, NULL, mp->m_sb.sb_uquotino,
440                                         0, 0, &uip) == 0)
441                         tempuqip = true;
442         }
443         if (!gip && mp->m_sb.sb_gquotino != NULLFSINO) {
444                 if (xfs_iget(mp, NULL, mp->m_sb.sb_gquotino,
445                                         0, 0, &gip) == 0)
446                         tempgqip = true;
447         }
448         /*
449          * Q_XGETQSTAT doesn't have room for both group and project quotas.
450          * So, allow the project quota values to be copied out only if
451          * there is no group quota information available.
452          */
453         if (!gip) {
454                 if (!pip && mp->m_sb.sb_pquotino != NULLFSINO) {
455                         if (xfs_iget(mp, NULL, mp->m_sb.sb_pquotino,
456                                                 0, 0, &pip) == 0)
457                                 temppqip = true;
458                 }
459         } else
460                 pip = NULL;
461         if (uip) {
462                 out->qs_uquota.qfs_ino = mp->m_sb.sb_uquotino;
463                 out->qs_uquota.qfs_nblks = uip->i_d.di_nblocks;
464                 out->qs_uquota.qfs_nextents = uip->i_d.di_nextents;
465                 if (tempuqip)
466                         IRELE(uip);
467         }
468
469         if (gip) {
470                 out->qs_gquota.qfs_ino = mp->m_sb.sb_gquotino;
471                 out->qs_gquota.qfs_nblks = gip->i_d.di_nblocks;
472                 out->qs_gquota.qfs_nextents = gip->i_d.di_nextents;
473                 if (tempgqip)
474                         IRELE(gip);
475         }
476         if (pip) {
477                 out->qs_gquota.qfs_ino = mp->m_sb.sb_gquotino;
478                 out->qs_gquota.qfs_nblks = pip->i_d.di_nblocks;
479                 out->qs_gquota.qfs_nextents = pip->i_d.di_nextents;
480                 if (temppqip)
481                         IRELE(pip);
482         }
483         if (q) {
484                 out->qs_incoredqs = q->qi_dquots;
485                 out->qs_btimelimit = q->qi_btimelimit;
486                 out->qs_itimelimit = q->qi_itimelimit;
487                 out->qs_rtbtimelimit = q->qi_rtbtimelimit;
488                 out->qs_bwarnlimit = q->qi_bwarnlimit;
489                 out->qs_iwarnlimit = q->qi_iwarnlimit;
490         }
491         return 0;
492 }
493
494 /*
495  * Return quota status information, such as uquota-off, enforcements, etc.
496  * for Q_XGETQSTATV command, to support separate project quota field.
497  */
498 int
499 xfs_qm_scall_getqstatv(
500         struct xfs_mount        *mp,
501         struct fs_quota_statv   *out)
502 {
503         struct xfs_quotainfo    *q = mp->m_quotainfo;
504         struct xfs_inode        *uip = NULL;
505         struct xfs_inode        *gip = NULL;
506         struct xfs_inode        *pip = NULL;
507         bool                    tempuqip = false;
508         bool                    tempgqip = false;
509         bool                    temppqip = false;
510
511         if (!xfs_sb_version_hasquota(&mp->m_sb)) {
512                 out->qs_uquota.qfs_ino = NULLFSINO;
513                 out->qs_gquota.qfs_ino = NULLFSINO;
514                 out->qs_pquota.qfs_ino = NULLFSINO;
515                 return 0;
516         }
517
518         out->qs_flags = (__uint16_t) xfs_qm_export_flags(mp->m_qflags &
519                                                         (XFS_ALL_QUOTA_ACCT|
520                                                          XFS_ALL_QUOTA_ENFD));
521         out->qs_uquota.qfs_ino = mp->m_sb.sb_uquotino;
522         out->qs_gquota.qfs_ino = mp->m_sb.sb_gquotino;
523         out->qs_pquota.qfs_ino = mp->m_sb.sb_pquotino;
524
525         if (q) {
526                 uip = q->qi_uquotaip;
527                 gip = q->qi_gquotaip;
528                 pip = q->qi_pquotaip;
529         }
530         if (!uip && mp->m_sb.sb_uquotino != NULLFSINO) {
531                 if (xfs_iget(mp, NULL, mp->m_sb.sb_uquotino,
532                                         0, 0, &uip) == 0)
533                         tempuqip = true;
534         }
535         if (!gip && mp->m_sb.sb_gquotino != NULLFSINO) {
536                 if (xfs_iget(mp, NULL, mp->m_sb.sb_gquotino,
537                                         0, 0, &gip) == 0)
538                         tempgqip = true;
539         }
540         if (!pip && mp->m_sb.sb_pquotino != NULLFSINO) {
541                 if (xfs_iget(mp, NULL, mp->m_sb.sb_pquotino,
542                                         0, 0, &pip) == 0)
543                         temppqip = true;
544         }
545         if (uip) {
546                 out->qs_uquota.qfs_nblks = uip->i_d.di_nblocks;
547                 out->qs_uquota.qfs_nextents = uip->i_d.di_nextents;
548                 if (tempuqip)
549                         IRELE(uip);
550         }
551
552         if (gip) {
553                 out->qs_gquota.qfs_nblks = gip->i_d.di_nblocks;
554                 out->qs_gquota.qfs_nextents = gip->i_d.di_nextents;
555                 if (tempgqip)
556                         IRELE(gip);
557         }
558         if (pip) {
559                 out->qs_pquota.qfs_nblks = pip->i_d.di_nblocks;
560                 out->qs_pquota.qfs_nextents = pip->i_d.di_nextents;
561                 if (temppqip)
562                         IRELE(pip);
563         }
564         if (q) {
565                 out->qs_incoredqs = q->qi_dquots;
566                 out->qs_btimelimit = q->qi_btimelimit;
567                 out->qs_itimelimit = q->qi_itimelimit;
568                 out->qs_rtbtimelimit = q->qi_rtbtimelimit;
569                 out->qs_bwarnlimit = q->qi_bwarnlimit;
570                 out->qs_iwarnlimit = q->qi_iwarnlimit;
571         }
572         return 0;
573 }
574
575 #define XFS_QC_MASK \
576         (QC_LIMIT_MASK | QC_TIMER_MASK | QC_WARNS_MASK)
577
578 /*
579  * Adjust quota limits, and start/stop timers accordingly.
580  */
581 int
582 xfs_qm_scall_setqlim(
583         struct xfs_mount        *mp,
584         xfs_dqid_t              id,
585         uint                    type,
586         struct qc_dqblk         *newlim)
587 {
588         struct xfs_quotainfo    *q = mp->m_quotainfo;
589         struct xfs_disk_dquot   *ddq;
590         struct xfs_dquot        *dqp;
591         struct xfs_trans        *tp;
592         int                     error;
593         xfs_qcnt_t              hard, soft;
594
595         if (newlim->d_fieldmask & ~XFS_QC_MASK)
596                 return -EINVAL;
597         if ((newlim->d_fieldmask & XFS_QC_MASK) == 0)
598                 return 0;
599
600         /*
601          * We don't want to race with a quotaoff so take the quotaoff lock.
602          * We don't hold an inode lock, so there's nothing else to stop
603          * a quotaoff from happening.
604          */
605         mutex_lock(&q->qi_quotaofflock);
606
607         /*
608          * Get the dquot (locked) before we start, as we need to do a
609          * transaction to allocate it if it doesn't exist. Once we have the
610          * dquot, unlock it so we can start the next transaction safely. We hold
611          * a reference to the dquot, so it's safe to do this unlock/lock without
612          * it being reclaimed in the mean time.
613          */
614         error = xfs_qm_dqget(mp, NULL, id, type, XFS_QMOPT_DQALLOC, &dqp);
615         if (error) {
616                 ASSERT(error != -ENOENT);
617                 goto out_unlock;
618         }
619         xfs_dqunlock(dqp);
620
621         tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SETQLIM);
622         error = xfs_trans_reserve(tp, &M_RES(mp)->tr_qm_setqlim, 0, 0);
623         if (error) {
624                 xfs_trans_cancel(tp, 0);
625                 goto out_rele;
626         }
627
628         xfs_dqlock(dqp);
629         xfs_trans_dqjoin(tp, dqp);
630         ddq = &dqp->q_core;
631
632         /*
633          * Make sure that hardlimits are >= soft limits before changing.
634          */
635         hard = (newlim->d_fieldmask & QC_SPC_HARD) ?
636                 (xfs_qcnt_t) XFS_B_TO_FSB(mp, newlim->d_spc_hardlimit) :
637                         be64_to_cpu(ddq->d_blk_hardlimit);
638         soft = (newlim->d_fieldmask & QC_SPC_SOFT) ?
639                 (xfs_qcnt_t) XFS_B_TO_FSB(mp, newlim->d_spc_softlimit) :
640                         be64_to_cpu(ddq->d_blk_softlimit);
641         if (hard == 0 || hard >= soft) {
642                 ddq->d_blk_hardlimit = cpu_to_be64(hard);
643                 ddq->d_blk_softlimit = cpu_to_be64(soft);
644                 xfs_dquot_set_prealloc_limits(dqp);
645                 if (id == 0) {
646                         q->qi_bhardlimit = hard;
647                         q->qi_bsoftlimit = soft;
648                 }
649         } else {
650                 xfs_debug(mp, "blkhard %Ld < blksoft %Ld", hard, soft);
651         }
652         hard = (newlim->d_fieldmask & QC_RT_SPC_HARD) ?
653                 (xfs_qcnt_t) XFS_B_TO_FSB(mp, newlim->d_rt_spc_hardlimit) :
654                         be64_to_cpu(ddq->d_rtb_hardlimit);
655         soft = (newlim->d_fieldmask & QC_RT_SPC_SOFT) ?
656                 (xfs_qcnt_t) XFS_B_TO_FSB(mp, newlim->d_rt_spc_softlimit) :
657                         be64_to_cpu(ddq->d_rtb_softlimit);
658         if (hard == 0 || hard >= soft) {
659                 ddq->d_rtb_hardlimit = cpu_to_be64(hard);
660                 ddq->d_rtb_softlimit = cpu_to_be64(soft);
661                 if (id == 0) {
662                         q->qi_rtbhardlimit = hard;
663                         q->qi_rtbsoftlimit = soft;
664                 }
665         } else {
666                 xfs_debug(mp, "rtbhard %Ld < rtbsoft %Ld", hard, soft);
667         }
668
669         hard = (newlim->d_fieldmask & QC_INO_HARD) ?
670                 (xfs_qcnt_t) newlim->d_ino_hardlimit :
671                         be64_to_cpu(ddq->d_ino_hardlimit);
672         soft = (newlim->d_fieldmask & QC_INO_SOFT) ?
673                 (xfs_qcnt_t) newlim->d_ino_softlimit :
674                         be64_to_cpu(ddq->d_ino_softlimit);
675         if (hard == 0 || hard >= soft) {
676                 ddq->d_ino_hardlimit = cpu_to_be64(hard);
677                 ddq->d_ino_softlimit = cpu_to_be64(soft);
678                 if (id == 0) {
679                         q->qi_ihardlimit = hard;
680                         q->qi_isoftlimit = soft;
681                 }
682         } else {
683                 xfs_debug(mp, "ihard %Ld < isoft %Ld", hard, soft);
684         }
685
686         /*
687          * Update warnings counter(s) if requested
688          */
689         if (newlim->d_fieldmask & QC_SPC_WARNS)
690                 ddq->d_bwarns = cpu_to_be16(newlim->d_spc_warns);
691         if (newlim->d_fieldmask & QC_INO_WARNS)
692                 ddq->d_iwarns = cpu_to_be16(newlim->d_ino_warns);
693         if (newlim->d_fieldmask & QC_RT_SPC_WARNS)
694                 ddq->d_rtbwarns = cpu_to_be16(newlim->d_rt_spc_warns);
695
696         if (id == 0) {
697                 /*
698                  * Timelimits for the super user set the relative time
699                  * the other users can be over quota for this file system.
700                  * If it is zero a default is used.  Ditto for the default
701                  * soft and hard limit values (already done, above), and
702                  * for warnings.
703                  */
704                 if (newlim->d_fieldmask & QC_SPC_TIMER) {
705                         q->qi_btimelimit = newlim->d_spc_timer;
706                         ddq->d_btimer = cpu_to_be32(newlim->d_spc_timer);
707                 }
708                 if (newlim->d_fieldmask & QC_INO_TIMER) {
709                         q->qi_itimelimit = newlim->d_ino_timer;
710                         ddq->d_itimer = cpu_to_be32(newlim->d_ino_timer);
711                 }
712                 if (newlim->d_fieldmask & QC_RT_SPC_TIMER) {
713                         q->qi_rtbtimelimit = newlim->d_rt_spc_timer;
714                         ddq->d_rtbtimer = cpu_to_be32(newlim->d_rt_spc_timer);
715                 }
716                 if (newlim->d_fieldmask & QC_SPC_WARNS)
717                         q->qi_bwarnlimit = newlim->d_spc_warns;
718                 if (newlim->d_fieldmask & QC_INO_WARNS)
719                         q->qi_iwarnlimit = newlim->d_ino_warns;
720                 if (newlim->d_fieldmask & QC_RT_SPC_WARNS)
721                         q->qi_rtbwarnlimit = newlim->d_rt_spc_warns;
722         } else {
723                 /*
724                  * If the user is now over quota, start the timelimit.
725                  * The user will not be 'warned'.
726                  * Note that we keep the timers ticking, whether enforcement
727                  * is on or off. We don't really want to bother with iterating
728                  * over all ondisk dquots and turning the timers on/off.
729                  */
730                 xfs_qm_adjust_dqtimers(mp, ddq);
731         }
732         dqp->dq_flags |= XFS_DQ_DIRTY;
733         xfs_trans_log_dquot(tp, dqp);
734
735         error = xfs_trans_commit(tp, 0);
736
737 out_rele:
738         xfs_qm_dqrele(dqp);
739 out_unlock:
740         mutex_unlock(&q->qi_quotaofflock);
741         return error;
742 }
743
744 STATIC int
745 xfs_qm_log_quotaoff_end(
746         xfs_mount_t             *mp,
747         xfs_qoff_logitem_t      *startqoff,
748         uint                    flags)
749 {
750         xfs_trans_t             *tp;
751         int                     error;
752         xfs_qoff_logitem_t      *qoffi;
753
754         tp = xfs_trans_alloc(mp, XFS_TRANS_QM_QUOTAOFF_END);
755
756         error = xfs_trans_reserve(tp, &M_RES(mp)->tr_qm_equotaoff, 0, 0);
757         if (error) {
758                 xfs_trans_cancel(tp, 0);
759                 return error;
760         }
761
762         qoffi = xfs_trans_get_qoff_item(tp, startqoff,
763                                         flags & XFS_ALL_QUOTA_ACCT);
764         xfs_trans_log_quotaoff_item(tp, qoffi);
765
766         /*
767          * We have to make sure that the transaction is secure on disk before we
768          * return and actually stop quota accounting. So, make it synchronous.
769          * We don't care about quotoff's performance.
770          */
771         xfs_trans_set_sync(tp);
772         error = xfs_trans_commit(tp, 0);
773         return error;
774 }
775
776
777 STATIC int
778 xfs_qm_log_quotaoff(
779         xfs_mount_t            *mp,
780         xfs_qoff_logitem_t     **qoffstartp,
781         uint                   flags)
782 {
783         xfs_trans_t            *tp;
784         int                     error;
785         xfs_qoff_logitem_t     *qoffi;
786
787         *qoffstartp = NULL;
788
789         tp = xfs_trans_alloc(mp, XFS_TRANS_QM_QUOTAOFF);
790         error = xfs_trans_reserve(tp, &M_RES(mp)->tr_qm_quotaoff, 0, 0);
791         if (error) {
792                 xfs_trans_cancel(tp, 0);
793                 goto out;
794         }
795
796         qoffi = xfs_trans_get_qoff_item(tp, NULL, flags & XFS_ALL_QUOTA_ACCT);
797         xfs_trans_log_quotaoff_item(tp, qoffi);
798
799         spin_lock(&mp->m_sb_lock);
800         mp->m_sb.sb_qflags = (mp->m_qflags & ~(flags)) & XFS_MOUNT_QUOTA_ALL;
801         spin_unlock(&mp->m_sb_lock);
802
803         xfs_mod_sb(tp, XFS_SB_QFLAGS);
804
805         /*
806          * We have to make sure that the transaction is secure on disk before we
807          * return and actually stop quota accounting. So, make it synchronous.
808          * We don't care about quotoff's performance.
809          */
810         xfs_trans_set_sync(tp);
811         error = xfs_trans_commit(tp, 0);
812         if (error)
813                 goto out;
814
815         *qoffstartp = qoffi;
816 out:
817         return error;
818 }
819
820
821 int
822 xfs_qm_scall_getquota(
823         struct xfs_mount        *mp,
824         xfs_dqid_t              id,
825         uint                    type,
826         struct qc_dqblk         *dst)
827 {
828         struct xfs_dquot        *dqp;
829         int                     error;
830
831         /*
832          * Try to get the dquot. We don't want it allocated on disk, so
833          * we aren't passing the XFS_QMOPT_DOALLOC flag. If it doesn't
834          * exist, we'll get ENOENT back.
835          */
836         error = xfs_qm_dqget(mp, NULL, id, type, 0, &dqp);
837         if (error)
838                 return error;
839
840         /*
841          * If everything's NULL, this dquot doesn't quite exist as far as
842          * our utility programs are concerned.
843          */
844         if (XFS_IS_DQUOT_UNINITIALIZED(dqp)) {
845                 error = -ENOENT;
846                 goto out_put;
847         }
848
849         memset(dst, 0, sizeof(*dst));
850         dst->d_spc_hardlimit =
851                 XFS_FSB_TO_B(mp, be64_to_cpu(dqp->q_core.d_blk_hardlimit));
852         dst->d_spc_softlimit =
853                 XFS_FSB_TO_B(mp, be64_to_cpu(dqp->q_core.d_blk_softlimit));
854         dst->d_ino_hardlimit = be64_to_cpu(dqp->q_core.d_ino_hardlimit);
855         dst->d_ino_softlimit = be64_to_cpu(dqp->q_core.d_ino_softlimit);
856         dst->d_space = XFS_FSB_TO_B(mp, dqp->q_res_bcount);
857         dst->d_ino_count = dqp->q_res_icount;
858         dst->d_spc_timer = be32_to_cpu(dqp->q_core.d_btimer);
859         dst->d_ino_timer = be32_to_cpu(dqp->q_core.d_itimer);
860         dst->d_ino_warns = be16_to_cpu(dqp->q_core.d_iwarns);
861         dst->d_spc_warns = be16_to_cpu(dqp->q_core.d_bwarns);
862         dst->d_rt_spc_hardlimit =
863                 XFS_FSB_TO_B(mp, be64_to_cpu(dqp->q_core.d_rtb_hardlimit));
864         dst->d_rt_spc_softlimit =
865                 XFS_FSB_TO_B(mp, be64_to_cpu(dqp->q_core.d_rtb_softlimit));
866         dst->d_rt_space = XFS_FSB_TO_B(mp, dqp->q_res_rtbcount);
867         dst->d_rt_spc_timer = be32_to_cpu(dqp->q_core.d_rtbtimer);
868         dst->d_rt_spc_warns = be16_to_cpu(dqp->q_core.d_rtbwarns);
869
870         /*
871          * Internally, we don't reset all the timers when quota enforcement
872          * gets turned off. No need to confuse the user level code,
873          * so return zeroes in that case.
874          */
875         if ((!XFS_IS_UQUOTA_ENFORCED(mp) &&
876              dqp->q_core.d_flags == XFS_DQ_USER) ||
877             (!XFS_IS_GQUOTA_ENFORCED(mp) &&
878              dqp->q_core.d_flags == XFS_DQ_GROUP) ||
879             (!XFS_IS_PQUOTA_ENFORCED(mp) &&
880              dqp->q_core.d_flags == XFS_DQ_PROJ)) {
881                 dst->d_spc_timer = 0;
882                 dst->d_ino_timer = 0;
883                 dst->d_rt_spc_timer = 0;
884         }
885
886 #ifdef DEBUG
887         if (((XFS_IS_UQUOTA_ENFORCED(mp) && type == XFS_DQ_USER) ||
888              (XFS_IS_GQUOTA_ENFORCED(mp) && type == XFS_DQ_GROUP) ||
889              (XFS_IS_PQUOTA_ENFORCED(mp) && type == XFS_DQ_PROJ)) &&
890             id != 0) {
891                 if ((dst->d_space > dst->d_spc_softlimit) &&
892                     (dst->d_spc_softlimit > 0)) {
893                         ASSERT(dst->d_spc_timer != 0);
894                 }
895                 if ((dst->d_ino_count > dst->d_ino_softlimit) &&
896                     (dst->d_ino_softlimit > 0)) {
897                         ASSERT(dst->d_ino_timer != 0);
898                 }
899         }
900 #endif
901 out_put:
902         xfs_qm_dqput(dqp);
903         return error;
904 }
905
906 STATIC uint
907 xfs_qm_export_flags(
908         uint flags)
909 {
910         uint uflags;
911
912         uflags = 0;
913         if (flags & XFS_UQUOTA_ACCT)
914                 uflags |= FS_QUOTA_UDQ_ACCT;
915         if (flags & XFS_GQUOTA_ACCT)
916                 uflags |= FS_QUOTA_GDQ_ACCT;
917         if (flags & XFS_PQUOTA_ACCT)
918                 uflags |= FS_QUOTA_PDQ_ACCT;
919         if (flags & XFS_UQUOTA_ENFD)
920                 uflags |= FS_QUOTA_UDQ_ENFD;
921         if (flags & XFS_GQUOTA_ENFD)
922                 uflags |= FS_QUOTA_GDQ_ENFD;
923         if (flags & XFS_PQUOTA_ENFD)
924                 uflags |= FS_QUOTA_PDQ_ENFD;
925         return uflags;
926 }
927
928
929 STATIC int
930 xfs_dqrele_inode(
931         struct xfs_inode        *ip,
932         int                     flags,
933         void                    *args)
934 {
935         /* skip quota inodes */
936         if (ip == ip->i_mount->m_quotainfo->qi_uquotaip ||
937             ip == ip->i_mount->m_quotainfo->qi_gquotaip ||
938             ip == ip->i_mount->m_quotainfo->qi_pquotaip) {
939                 ASSERT(ip->i_udquot == NULL);
940                 ASSERT(ip->i_gdquot == NULL);
941                 ASSERT(ip->i_pdquot == NULL);
942                 return 0;
943         }
944
945         xfs_ilock(ip, XFS_ILOCK_EXCL);
946         if ((flags & XFS_UQUOTA_ACCT) && ip->i_udquot) {
947                 xfs_qm_dqrele(ip->i_udquot);
948                 ip->i_udquot = NULL;
949         }
950         if ((flags & XFS_GQUOTA_ACCT) && ip->i_gdquot) {
951                 xfs_qm_dqrele(ip->i_gdquot);
952                 ip->i_gdquot = NULL;
953         }
954         if ((flags & XFS_PQUOTA_ACCT) && ip->i_pdquot) {
955                 xfs_qm_dqrele(ip->i_pdquot);
956                 ip->i_pdquot = NULL;
957         }
958         xfs_iunlock(ip, XFS_ILOCK_EXCL);
959         return 0;
960 }
961
962
963 /*
964  * Go thru all the inodes in the file system, releasing their dquots.
965  *
966  * Note that the mount structure gets modified to indicate that quotas are off
967  * AFTER this, in the case of quotaoff.
968  */
969 void
970 xfs_qm_dqrele_all_inodes(
971         struct xfs_mount *mp,
972         uint             flags)
973 {
974         ASSERT(mp->m_quotainfo);
975         xfs_inode_ag_iterator(mp, xfs_dqrele_inode, flags, NULL);
976 }