aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2014-09-30 04:43:09 -0400
committerJan Kara <jack@suse.cz>2014-11-10 04:06:08 -0500
commit2c5f648aa24a7c8f0668d8ce5722d69da5bef739 (patch)
tree569961ba122f15e947a0f0dbe71c6994b8e00b2c
parent6bab3596bbede980c067eaeaf6a470c262888dac (diff)
quota: Allow each filesystem to specify which quota types it supports
Currently all filesystems supporting VFS quota support user and group quotas. With introduction of project quotas this is going to change so make sure filesystem isn't called for quota type it doesn't support by introduction of a bitmask determining which quota types each filesystem supports. Acked-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Jan Kara <jack@suse.cz>
-rw-r--r--fs/quota/quota.c13
-rw-r--r--fs/super.c6
-rw-r--r--include/linux/fs.h1
-rw-r--r--include/linux/quota.h5
4 files changed, 23 insertions, 2 deletions
diff --git a/fs/quota/quota.c b/fs/quota/quota.c
index 75621649dbd7..2aa4151f99d2 100644
--- a/fs/quota/quota.c
+++ b/fs/quota/quota.c
@@ -47,8 +47,11 @@ static int check_quotactl_permission(struct super_block *sb, int type, int cmd,
47 47
48static void quota_sync_one(struct super_block *sb, void *arg) 48static void quota_sync_one(struct super_block *sb, void *arg)
49{ 49{
50 if (sb->s_qcop && sb->s_qcop->quota_sync) 50 int type = *(int *)arg;
51 sb->s_qcop->quota_sync(sb, *(int *)arg); 51
52 if (sb->s_qcop && sb->s_qcop->quota_sync &&
53 (sb->s_quota_types & (1 << type)))
54 sb->s_qcop->quota_sync(sb, type);
52} 55}
53 56
54static int quota_sync_all(int type) 57static int quota_sync_all(int type)
@@ -297,8 +300,14 @@ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id,
297 300
298 if (type >= (XQM_COMMAND(cmd) ? XQM_MAXQUOTAS : MAXQUOTAS)) 301 if (type >= (XQM_COMMAND(cmd) ? XQM_MAXQUOTAS : MAXQUOTAS))
299 return -EINVAL; 302 return -EINVAL;
303 /*
304 * Quota not supported on this fs? Check this before s_quota_types
305 * since they needn't be set if quota is not supported at all.
306 */
300 if (!sb->s_qcop) 307 if (!sb->s_qcop)
301 return -ENOSYS; 308 return -ENOSYS;
309 if (!(sb->s_quota_types & (1 << type)))
310 return -EINVAL;
302 311
303 ret = check_quotactl_permission(sb, type, cmd, id); 312 ret = check_quotactl_permission(sb, type, cmd, id);
304 if (ret < 0) 313 if (ret < 0)
diff --git a/fs/super.c b/fs/super.c
index eae088f6aaae..4512281df8ff 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -218,6 +218,12 @@ static struct super_block *alloc_super(struct file_system_type *type, int flags)
218 atomic_set(&s->s_active, 1); 218 atomic_set(&s->s_active, 1);
219 mutex_init(&s->s_vfs_rename_mutex); 219 mutex_init(&s->s_vfs_rename_mutex);
220 lockdep_set_class(&s->s_vfs_rename_mutex, &type->s_vfs_rename_key); 220 lockdep_set_class(&s->s_vfs_rename_mutex, &type->s_vfs_rename_key);
221 /*
222 * For now MAXQUOTAS check in do_quotactl() will limit quota type
223 * appropriately. When each fs sets allowed_types, we can remove the
224 * line below
225 */
226 s->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP | QTYPE_MASK_PRJ;
221 mutex_init(&s->s_dquot.dqio_mutex); 227 mutex_init(&s->s_dquot.dqio_mutex);
222 mutex_init(&s->s_dquot.dqonoff_mutex); 228 mutex_init(&s->s_dquot.dqonoff_mutex);
223 s->s_maxbytes = MAX_NON_LFS; 229 s->s_maxbytes = MAX_NON_LFS;
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 9ab779e8a63c..cf55a5483d40 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -1224,6 +1224,7 @@ struct super_block {
1224 struct backing_dev_info *s_bdi; 1224 struct backing_dev_info *s_bdi;
1225 struct mtd_info *s_mtd; 1225 struct mtd_info *s_mtd;
1226 struct hlist_node s_instances; 1226 struct hlist_node s_instances;
1227 unsigned int s_quota_types; /* Bitmask of supported quota types */
1227 struct quota_info s_dquot; /* Diskquota specific options */ 1228 struct quota_info s_dquot; /* Diskquota specific options */
1228 1229
1229 struct sb_writers s_writers; 1230 struct sb_writers s_writers;
diff --git a/include/linux/quota.h b/include/linux/quota.h
index 80d345a3524c..50978b781a19 100644
--- a/include/linux/quota.h
+++ b/include/linux/quota.h
@@ -56,6 +56,11 @@ enum quota_type {
56 PRJQUOTA = 2, /* element used for project quotas */ 56 PRJQUOTA = 2, /* element used for project quotas */
57}; 57};
58 58
59/* Masks for quota types when used as a bitmask */
60#define QTYPE_MASK_USR (1 << USRQUOTA)
61#define QTYPE_MASK_GRP (1 << GRPQUOTA)
62#define QTYPE_MASK_PRJ (1 << PRJQUOTA)
63
59typedef __kernel_uid32_t qid_t; /* Type in which we store ids in memory */ 64typedef __kernel_uid32_t qid_t; /* Type in which we store ids in memory */
60typedef long long qsize_t; /* Type in which we store sizes */ 65typedef long long qsize_t; /* Type in which we store sizes */
61 66