1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2000-2006 Silicon Graphics, Inc.
8 #include "xfs_shared.h"
9 #include "xfs_format.h"
10 #include "xfs_log_format.h"
11 #include "xfs_trans_resv.h"
12 #include "xfs_mount.h"
13 #include "xfs_quota.h"
14 #include "xfs_inode.h"
15 #include "xfs_trans.h"
20 xfs_fill_statvfs_from_dquot(
21 struct kstatfs
*statp
,
23 struct xfs_dquot
*dqp
)
25 struct xfs_dquot_res
*blkres
= &dqp
->q_blk
;
28 if (XFS_IS_REALTIME_MOUNT(ip
->i_mount
) &&
29 (ip
->i_diflags
& (XFS_DIFLAG_RTINHERIT
| XFS_DIFLAG_REALTIME
)))
32 limit
= blkres
->softlimit
?
35 if (limit
&& statp
->f_blocks
> limit
) {
36 statp
->f_blocks
= limit
;
37 statp
->f_bfree
= statp
->f_bavail
=
38 (statp
->f_blocks
> blkres
->reserved
) ?
39 (statp
->f_blocks
- blkres
->reserved
) : 0;
42 limit
= dqp
->q_ino
.softlimit
?
43 dqp
->q_ino
.softlimit
:
45 if (limit
&& statp
->f_files
> limit
) {
46 statp
->f_files
= limit
;
48 (statp
->f_files
> dqp
->q_ino
.reserved
) ?
49 (statp
->f_files
- dqp
->q_ino
.reserved
) : 0;
55 * Directory tree accounting is implemented using project quotas, where
56 * the project identifier is inherited from parent directories.
57 * A statvfs (df, etc.) of a directory that is using project quota should
58 * return a statvfs of the project, not the entire filesystem.
59 * This makes such trees appear as if they are filesystems in themselves.
64 struct kstatfs
*statp
)
66 struct xfs_mount
*mp
= ip
->i_mount
;
67 struct xfs_dquot
*dqp
;
69 if (!xfs_qm_dqget(mp
, ip
->i_projid
, XFS_DQTYPE_PROJ
, false, &dqp
)) {
70 xfs_fill_statvfs_from_dquot(statp
, ip
, dqp
);
82 uint uquotaondisk
= 0, gquotaondisk
= 0, pquotaondisk
= 0;
84 quotaondisk
= xfs_has_quota(mp
) &&
85 (mp
->m_sb
.sb_qflags
& XFS_ALL_QUOTA_ACCT
);
88 uquotaondisk
= mp
->m_sb
.sb_qflags
& XFS_UQUOTA_ACCT
;
89 pquotaondisk
= mp
->m_sb
.sb_qflags
& XFS_PQUOTA_ACCT
;
90 gquotaondisk
= mp
->m_sb
.sb_qflags
& XFS_GQUOTA_ACCT
;
94 * If the device itself is read-only, we can't allow
95 * the user to change the state of quota on the mount -
96 * this would generate a transaction on the ro device,
97 * which would lead to an I/O error and shutdown
100 if (((uquotaondisk
&& !XFS_IS_UQUOTA_ON(mp
)) ||
101 (!uquotaondisk
&& XFS_IS_UQUOTA_ON(mp
)) ||
102 (gquotaondisk
&& !XFS_IS_GQUOTA_ON(mp
)) ||
103 (!gquotaondisk
&& XFS_IS_GQUOTA_ON(mp
)) ||
104 (pquotaondisk
&& !XFS_IS_PQUOTA_ON(mp
)) ||
105 (!pquotaondisk
&& XFS_IS_PQUOTA_ON(mp
))) &&
106 xfs_dev_is_read_only(mp
, "changing quota state")) {
107 xfs_warn(mp
, "please mount with%s%s%s%s.",
108 (!quotaondisk
? "out quota" : ""),
109 (uquotaondisk
? " usrquota" : ""),
110 (gquotaondisk
? " grpquota" : ""),
111 (pquotaondisk
? " prjquota" : ""));
115 if (XFS_IS_QUOTA_ON(mp
) || quotaondisk
) {
117 * Call mount_quotas at this point only if we won't have to do
120 if (quotaondisk
&& !XFS_QM_NEED_QUOTACHECK(mp
)) {
122 * If an error occurred, qm_mount_quotas code
123 * has already disabled quotas. So, just finish
124 * mounting, and get on with the boring life
125 * without disk quotas.
127 xfs_qm_mount_quotas(mp
);
130 * Clear the quota flags, but remember them. This
131 * is so that the quota code doesn't get invoked
132 * before we're ready. This can happen when an
133 * inode goes inactive and wants to free blocks,
134 * or via xfs_log_mount_finish.
136 *needquotamount
= true;
137 *quotaflags
= mp
->m_qflags
;
146 * If the sysadmin didn't provide any quota mount options, restore the quota
147 * accounting and enforcement state from the ondisk superblock. Only do this
148 * for metadir filesystems because this is a behavior change.
151 xfs_qm_resume_quotaon(
152 struct xfs_mount
*mp
)
154 if (!xfs_has_metadir(mp
))
156 if (xfs_has_norecovery(mp
))
159 mp
->m_qflags
= mp
->m_sb
.sb_qflags
& (XFS_ALL_QUOTA_ACCT
|