Blame view

fs/xfs/xfs_quotaops.c 3.07 KB
fcafb71b5   Christoph Hellwig   xfs: get rid of i...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  /*
   * Copyright (c) 2008, Christoph Hellwig
   * All Rights Reserved.
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public License as
   * published by the Free Software Foundation.
   *
   * This program is distributed in the hope that it would be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program; if not, write the Free Software Foundation,
   * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
   */
  #include "xfs.h"
fcafb71b5   Christoph Hellwig   xfs: get rid of i...
19
20
  #include "xfs_sb.h"
  #include "xfs_inum.h"
ed3b4d6cd   Dave Chinner   xfs: Improve scal...
21
  #include "xfs_log.h"
fcafb71b5   Christoph Hellwig   xfs: get rid of i...
22
23
24
  #include "xfs_ag.h"
  #include "xfs_mount.h"
  #include "xfs_quota.h"
fcafb71b5   Christoph Hellwig   xfs: get rid of i...
25
26
27
  #include "xfs_trans.h"
  #include "xfs_bmap_btree.h"
  #include "xfs_inode.h"
06f8e2d67   Alex Elder   xfs: don't expect...
28
  #include "xfs_qm.h"
fcafb71b5   Christoph Hellwig   xfs: get rid of i...
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
  #include <linux/quota.h>
  
  
  STATIC int
  xfs_quota_type(int type)
  {
  	switch (type) {
  	case USRQUOTA:
  		return XFS_DQ_USER;
  	case GRPQUOTA:
  		return XFS_DQ_GROUP;
  	default:
  		return XFS_DQ_PROJ;
  	}
  }
  
  STATIC int
fcafb71b5   Christoph Hellwig   xfs: get rid of i...
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
  xfs_fs_get_xstate(
  	struct super_block	*sb,
  	struct fs_quota_stat	*fqs)
  {
  	struct xfs_mount	*mp = XFS_M(sb);
  
  	if (!XFS_IS_QUOTA_RUNNING(mp))
  		return -ENOSYS;
  	return -xfs_qm_scall_getqstat(mp, fqs);
  }
  
  STATIC int
  xfs_fs_set_xstate(
  	struct super_block	*sb,
  	unsigned int		uflags,
  	int			op)
  {
  	struct xfs_mount	*mp = XFS_M(sb);
  	unsigned int		flags = 0;
  
  	if (sb->s_flags & MS_RDONLY)
  		return -EROFS;
c7ff91d72   Ryota Yamauchi   xfs: fix xfs_quot...
68
  	if (op != Q_XQUOTARM && !XFS_IS_QUOTA_RUNNING(mp))
fcafb71b5   Christoph Hellwig   xfs: get rid of i...
69
  		return -ENOSYS;
fcafb71b5   Christoph Hellwig   xfs: get rid of i...
70

ade7ce31c   Christoph Hellwig   quota: Clean up t...
71
  	if (uflags & FS_QUOTA_UDQ_ACCT)
fcafb71b5   Christoph Hellwig   xfs: get rid of i...
72
  		flags |= XFS_UQUOTA_ACCT;
ade7ce31c   Christoph Hellwig   quota: Clean up t...
73
  	if (uflags & FS_QUOTA_PDQ_ACCT)
fcafb71b5   Christoph Hellwig   xfs: get rid of i...
74
  		flags |= XFS_PQUOTA_ACCT;
ade7ce31c   Christoph Hellwig   quota: Clean up t...
75
  	if (uflags & FS_QUOTA_GDQ_ACCT)
fcafb71b5   Christoph Hellwig   xfs: get rid of i...
76
  		flags |= XFS_GQUOTA_ACCT;
ade7ce31c   Christoph Hellwig   quota: Clean up t...
77
  	if (uflags & FS_QUOTA_UDQ_ENFD)
fcafb71b5   Christoph Hellwig   xfs: get rid of i...
78
  		flags |= XFS_UQUOTA_ENFD;
ade7ce31c   Christoph Hellwig   quota: Clean up t...
79
  	if (uflags & (FS_QUOTA_PDQ_ENFD|FS_QUOTA_GDQ_ENFD))
fcafb71b5   Christoph Hellwig   xfs: get rid of i...
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
  		flags |= XFS_OQUOTA_ENFD;
  
  	switch (op) {
  	case Q_XQUOTAON:
  		return -xfs_qm_scall_quotaon(mp, flags);
  	case Q_XQUOTAOFF:
  		if (!XFS_IS_QUOTA_ON(mp))
  			return -EINVAL;
  		return -xfs_qm_scall_quotaoff(mp, flags);
  	case Q_XQUOTARM:
  		if (XFS_IS_QUOTA_ON(mp))
  			return -EINVAL;
  		return -xfs_qm_scall_trunc_qfiles(mp, flags);
  	}
  
  	return -EINVAL;
  }
  
  STATIC int
b9b2dd36c   Christoph Hellwig   quota: unify ->ge...
99
  xfs_fs_get_dqblk(
fcafb71b5   Christoph Hellwig   xfs: get rid of i...
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
  	struct super_block	*sb,
  	int			type,
  	qid_t			id,
  	struct fs_disk_quota	*fdq)
  {
  	struct xfs_mount	*mp = XFS_M(sb);
  
  	if (!XFS_IS_QUOTA_RUNNING(mp))
  		return -ENOSYS;
  	if (!XFS_IS_QUOTA_ON(mp))
  		return -ESRCH;
  
  	return -xfs_qm_scall_getquota(mp, id, xfs_quota_type(type), fdq);
  }
  
  STATIC int
c472b4327   Christoph Hellwig   quota: unify ->se...
116
  xfs_fs_set_dqblk(
fcafb71b5   Christoph Hellwig   xfs: get rid of i...
117
118
119
120
121
122
123
124
125
126
127
128
129
  	struct super_block	*sb,
  	int			type,
  	qid_t			id,
  	struct fs_disk_quota	*fdq)
  {
  	struct xfs_mount	*mp = XFS_M(sb);
  
  	if (sb->s_flags & MS_RDONLY)
  		return -EROFS;
  	if (!XFS_IS_QUOTA_RUNNING(mp))
  		return -ENOSYS;
  	if (!XFS_IS_QUOTA_ON(mp))
  		return -ESRCH;
fcafb71b5   Christoph Hellwig   xfs: get rid of i...
130
131
132
  
  	return -xfs_qm_scall_setqlim(mp, id, xfs_quota_type(type), fdq);
  }
0d54b217a   Alexey Dobriyan   const: make struc...
133
  const struct quotactl_ops xfs_quotactl_operations = {
fcafb71b5   Christoph Hellwig   xfs: get rid of i...
134
135
  	.get_xstate		= xfs_fs_get_xstate,
  	.set_xstate		= xfs_fs_set_xstate,
b9b2dd36c   Christoph Hellwig   quota: unify ->ge...
136
  	.get_dqblk		= xfs_fs_get_dqblk,
c472b4327   Christoph Hellwig   quota: unify ->se...
137
  	.set_dqblk		= xfs_fs_set_dqblk,
fcafb71b5   Christoph Hellwig   xfs: get rid of i...
138
  };