aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_qm_bhv.c
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@infradead.org>2011-08-12 17:21:35 -0400
committerAlex Elder <aelder@sgi.com>2011-08-12 17:21:35 -0400
commitc59d87c460767bc35dafd490139d3cfe78fb8da4 (patch)
tree2aad8261f86488e501d9645bd35d1398906da46d /fs/xfs/xfs_qm_bhv.c
parent06f8e2d6754dc631732415b741b5aa58a0f7133f (diff)
xfs: remove subdirectories
Use the move from Linux 2.6 to Linux 3.x as an excuse to kill the annoying subdirectories in the XFS source code. Besides the large amount of file rename the only changes are to the Makefile, a few files including headers with the subdirectory prefix, and the binary sysctl compat code that includes a header under fs/xfs/ from kernel/. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Alex Elder <aelder@sgi.com>
Diffstat (limited to 'fs/xfs/xfs_qm_bhv.c')
-rw-r--r--fs/xfs/xfs_qm_bhv.c176
1 files changed, 176 insertions, 0 deletions
diff --git a/fs/xfs/xfs_qm_bhv.c b/fs/xfs/xfs_qm_bhv.c
new file mode 100644
index 000000000000..a0a829addca9
--- /dev/null
+++ b/fs/xfs/xfs_qm_bhv.c
@@ -0,0 +1,176 @@
1/*
2 * Copyright (c) 2000-2006 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#include "xfs.h"
19#include "xfs_fs.h"
20#include "xfs_bit.h"
21#include "xfs_log.h"
22#include "xfs_inum.h"
23#include "xfs_trans.h"
24#include "xfs_sb.h"
25#include "xfs_ag.h"
26#include "xfs_alloc.h"
27#include "xfs_quota.h"
28#include "xfs_mount.h"
29#include "xfs_bmap_btree.h"
30#include "xfs_inode.h"
31#include "xfs_itable.h"
32#include "xfs_bmap.h"
33#include "xfs_rtalloc.h"
34#include "xfs_error.h"
35#include "xfs_attr.h"
36#include "xfs_buf_item.h"
37#include "xfs_qm.h"
38
39
40STATIC void
41xfs_fill_statvfs_from_dquot(
42 struct kstatfs *statp,
43 xfs_disk_dquot_t *dp)
44{
45 __uint64_t limit;
46
47 limit = dp->d_blk_softlimit ?
48 be64_to_cpu(dp->d_blk_softlimit) :
49 be64_to_cpu(dp->d_blk_hardlimit);
50 if (limit && statp->f_blocks > limit) {
51 statp->f_blocks = limit;
52 statp->f_bfree = statp->f_bavail =
53 (statp->f_blocks > be64_to_cpu(dp->d_bcount)) ?
54 (statp->f_blocks - be64_to_cpu(dp->d_bcount)) : 0;
55 }
56
57 limit = dp->d_ino_softlimit ?
58 be64_to_cpu(dp->d_ino_softlimit) :
59 be64_to_cpu(dp->d_ino_hardlimit);
60 if (limit && statp->f_files > limit) {
61 statp->f_files = limit;
62 statp->f_ffree =
63 (statp->f_files > be64_to_cpu(dp->d_icount)) ?
64 (statp->f_ffree - be64_to_cpu(dp->d_icount)) : 0;
65 }
66}
67
68
69/*
70 * Directory tree accounting is implemented using project quotas, where
71 * the project identifier is inherited from parent directories.
72 * A statvfs (df, etc.) of a directory that is using project quota should
73 * return a statvfs of the project, not the entire filesystem.
74 * This makes such trees appear as if they are filesystems in themselves.
75 */
76void
77xfs_qm_statvfs(
78 xfs_inode_t *ip,
79 struct kstatfs *statp)
80{
81 xfs_mount_t *mp = ip->i_mount;
82 xfs_dquot_t *dqp;
83
84 if (!xfs_qm_dqget(mp, NULL, xfs_get_projid(ip), XFS_DQ_PROJ, 0, &dqp)) {
85 xfs_fill_statvfs_from_dquot(statp, &dqp->q_core);
86 xfs_qm_dqput(dqp);
87 }
88}
89
90int
91xfs_qm_newmount(
92 xfs_mount_t *mp,
93 uint *needquotamount,
94 uint *quotaflags)
95{
96 uint quotaondisk;
97 uint uquotaondisk = 0, gquotaondisk = 0, pquotaondisk = 0;
98
99 quotaondisk = xfs_sb_version_hasquota(&mp->m_sb) &&
100 (mp->m_sb.sb_qflags & XFS_ALL_QUOTA_ACCT);
101
102 if (quotaondisk) {
103 uquotaondisk = mp->m_sb.sb_qflags & XFS_UQUOTA_ACCT;
104 pquotaondisk = mp->m_sb.sb_qflags & XFS_PQUOTA_ACCT;
105 gquotaondisk = mp->m_sb.sb_qflags & XFS_GQUOTA_ACCT;
106 }
107
108 /*
109 * If the device itself is read-only, we can't allow
110 * the user to change the state of quota on the mount -
111 * this would generate a transaction on the ro device,
112 * which would lead to an I/O error and shutdown
113 */
114
115 if (((uquotaondisk && !XFS_IS_UQUOTA_ON(mp)) ||
116 (!uquotaondisk && XFS_IS_UQUOTA_ON(mp)) ||
117 (pquotaondisk && !XFS_IS_PQUOTA_ON(mp)) ||
118 (!pquotaondisk && XFS_IS_PQUOTA_ON(mp)) ||
119 (gquotaondisk && !XFS_IS_GQUOTA_ON(mp)) ||
120 (!gquotaondisk && XFS_IS_OQUOTA_ON(mp))) &&
121 xfs_dev_is_read_only(mp, "changing quota state")) {
122 xfs_warn(mp, "please mount with%s%s%s%s.",
123 (!quotaondisk ? "out quota" : ""),
124 (uquotaondisk ? " usrquota" : ""),
125 (pquotaondisk ? " prjquota" : ""),
126 (gquotaondisk ? " grpquota" : ""));
127 return XFS_ERROR(EPERM);
128 }
129
130 if (XFS_IS_QUOTA_ON(mp) || quotaondisk) {
131 /*
132 * Call mount_quotas at this point only if we won't have to do
133 * a quotacheck.
134 */
135 if (quotaondisk && !XFS_QM_NEED_QUOTACHECK(mp)) {
136 /*
137 * If an error occurred, qm_mount_quotas code
138 * has already disabled quotas. So, just finish
139 * mounting, and get on with the boring life
140 * without disk quotas.
141 */
142 xfs_qm_mount_quotas(mp);
143 } else {
144 /*
145 * Clear the quota flags, but remember them. This
146 * is so that the quota code doesn't get invoked
147 * before we're ready. This can happen when an
148 * inode goes inactive and wants to free blocks,
149 * or via xfs_log_mount_finish.
150 */
151 *needquotamount = B_TRUE;
152 *quotaflags = mp->m_qflags;
153 mp->m_qflags = 0;
154 }
155 }
156
157 return 0;
158}
159
160void __init
161xfs_qm_init(void)
162{
163 printk(KERN_INFO "SGI XFS Quota Management subsystem\n");
164 mutex_init(&xfs_Gqm_lock);
165 xfs_qm_init_procfs();
166}
167
168void __exit
169xfs_qm_exit(void)
170{
171 xfs_qm_cleanup_procfs();
172 if (qm_dqzone)
173 kmem_zone_destroy(qm_dqzone);
174 if (qm_dqtrxzone)
175 kmem_zone_destroy(qm_dqtrxzone);
176}