1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright (c) 2000-2006 Silicon Graphics, Inc. 4 * All Rights Reserved. 5 */ 6 #include "xfs.h" 7 #include "xfs_fs.h" 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" 16 #include "xfs_qm.h" 17 18 19 STATIC void 20 xfs_fill_statvfs_from_dquot( 21 struct kstatfs *statp, 22 struct xfs_inode *ip, 23 struct xfs_dquot *dqp) 24 { 25 struct xfs_dquot_res *blkres = &dqp->q_blk; 26 uint64_t limit; 27 28 if (XFS_IS_REALTIME_MOUNT(ip->i_mount) && 29 (ip->i_diflags & (XFS_DIFLAG_RTINHERIT | XFS_DIFLAG_REALTIME))) 30 blkres = &dqp->q_rtb; 31 32 limit = blkres->softlimit ? 33 blkres->softlimit : 34 blkres->hardlimit; 35 if (limit) { 36 uint64_t remaining = 0; 37 38 if (limit > blkres->reserved) 39 remaining = limit - blkres->reserved; 40 41 statp->f_blocks = min(statp->f_blocks, limit); 42 statp->f_bfree = min(statp->f_bfree, remaining); 43 } 44 45 limit = dqp->q_ino.softlimit ? 46 dqp->q_ino.softlimit : 47 dqp->q_ino.hardlimit; 48 if (limit) { 49 uint64_t remaining = 0; 50 51 if (limit > dqp->q_ino.reserved) 52 remaining = limit - dqp->q_ino.reserved; 53 54 statp->f_files = min(statp->f_files, limit); 55 statp->f_ffree = min(statp->f_ffree, remaining); 56 } 57 } 58 59 60 /* 61 * Directory tree accounting is implemented using project quotas, where 62 * the project identifier is inherited from parent directories. 63 * A statvfs (df, etc.) of a directory that is using project quota should 64 * return a statvfs of the project, not the entire filesystem. 65 * This makes such trees appear as if they are filesystems in themselves. 66 */ 67 void 68 xfs_qm_statvfs( 69 struct xfs_inode *ip, 70 struct kstatfs *statp) 71 { 72 struct xfs_mount *mp = ip->i_mount; 73 struct xfs_dquot *dqp; 74 75 if (!xfs_qm_dqget(mp, ip->i_projid, XFS_DQTYPE_PROJ, false, &dqp)) { 76 xfs_fill_statvfs_from_dquot(statp, ip, dqp); 77 xfs_qm_dqput(dqp); 78 } 79 } 80 81 STATIC int 82 xfs_qm_validate_state_change( 83 struct xfs_mount *mp, 84 uint uqd, 85 uint gqd, 86 uint pqd) 87 { 88 int state; 89 90 /* Is quota state changing? */ 91 state = ((uqd && !XFS_IS_UQUOTA_ON(mp)) || 92 (!uqd && XFS_IS_UQUOTA_ON(mp)) || 93 (gqd && !XFS_IS_GQUOTA_ON(mp)) || 94 (!gqd && XFS_IS_GQUOTA_ON(mp)) || 95 (pqd && !XFS_IS_PQUOTA_ON(mp)) || 96 (!pqd && XFS_IS_PQUOTA_ON(mp))); 97 98 return state && 99 (xfs_dev_is_read_only(mp, "changing quota state") || 100 xfs_has_norecovery(mp)); 101 } 102 103 int 104 xfs_qm_newmount( 105 xfs_mount_t *mp, 106 uint *needquotamount, 107 uint *quotaflags) 108 { 109 uint quotaondisk; 110 uint uquotaondisk = 0, gquotaondisk = 0, pquotaondisk = 0; 111 112 quotaondisk = xfs_has_quota(mp) && 113 (mp->m_sb.sb_qflags & XFS_ALL_QUOTA_ACCT); 114 115 if (quotaondisk) { 116 uquotaondisk = mp->m_sb.sb_qflags & XFS_UQUOTA_ACCT; 117 pquotaondisk = mp->m_sb.sb_qflags & XFS_PQUOTA_ACCT; 118 gquotaondisk = mp->m_sb.sb_qflags & XFS_GQUOTA_ACCT; 119 } 120 121 /* 122 * If the device itself is read-only and/or in norecovery 123 * mode, we can't allow the user to change the state of 124 * quota on the mount - this would generate a transaction 125 * on the ro device, which would lead to an I/O error and 126 * shutdown. 127 */ 128 129 if (xfs_qm_validate_state_change(mp, uquotaondisk, 130 gquotaondisk, pquotaondisk)) { 131 132 if (xfs_has_metadir(mp)) 133 xfs_warn(mp, 134 "metadir enabled, please mount without any quota mount options"); 135 else 136 xfs_warn(mp, "please mount with%s%s%s%s.", 137 (!quotaondisk ? "out quota" : ""), 138 (uquotaondisk ? " usrquota" : ""), 139 (gquotaondisk ? " grpquota" : ""), 140 (pquotaondisk ? " prjquota" : "")); 141 return -EPERM; 142 } 143 144 if (XFS_IS_QUOTA_ON(mp) || quotaondisk) { 145 /* 146 * Call mount_quotas at this point only if we won't have to do 147 * a quotacheck. 148 */ 149 if (quotaondisk && !XFS_QM_NEED_QUOTACHECK(mp)) { 150 /* 151 * If an error occurred, qm_mount_quotas code 152 * has already disabled quotas. So, just finish 153 * mounting, and get on with the boring life 154 * without disk quotas. 155 */ 156 xfs_qm_mount_quotas(mp); 157 } else { 158 /* 159 * Clear the quota flags, but remember them. This 160 * is so that the quota code doesn't get invoked 161 * before we're ready. This can happen when an 162 * inode goes inactive and wants to free blocks, 163 * or via xfs_log_mount_finish. 164 */ 165 *needquotamount = true; 166 *quotaflags = mp->m_qflags; 167 mp->m_qflags = 0; 168 } 169 } 170 171 return 0; 172 } 173 174 /* 175 * If the sysadmin didn't provide any quota mount options, restore the quota 176 * accounting and enforcement state from the ondisk superblock. Only do this 177 * for metadir filesystems because this is a behavior change. 178 */ 179 void 180 xfs_qm_resume_quotaon( 181 struct xfs_mount *mp) 182 { 183 if (!xfs_has_metadir(mp)) 184 return; 185 if (xfs_has_norecovery(mp)) 186 return; 187 188 mp->m_qflags = mp->m_sb.sb_qflags & (XFS_ALL_QUOTA_ACCT | 189 XFS_ALL_QUOTA_ENFD); 190 } 191