[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <54DCC96E.9090605@yandex-team.ru>
Date: Thu, 12 Feb 2015 18:40:30 +0300
From: Konstantin Khlebnikov <khlebnikov@...dex-team.ru>
To: Jan Kara <jack@...e.cz>
CC: linux-fsdevel@...r.kernel.org, linux-kernel@...r.kernel.org
Subject: Re: [PATCH 2/2] quota: merge sb->s_quota_types into sb->s_dquot.flags
On 12.02.2015 18:13, Jan Kara wrote:
> On Thu 12-02-15 12:36:45, Konstantin Khlebnikov wrote:
>> This patch converts supported quota types bitmask (sb->s_quota_types)
>> into per-type flag DQUOT_SUPPORTED in sb->s_dquot.flags.
> I had something like this previously (although your patch is nicer) but
> Christoph objected that filesystems not using VFS quotas (XFS, GFS2) don't
> touch sb->s_dquot at all and this would make them use it. So I used a
> special field in the superblock instead.
Ok. This makes sense.
>
> Honza
>
>> Signed-off-by: Konstantin Khlebnikov <khlebnikov@...dex-team.ru>
>> ---
>> fs/ext2/super.c | 3 ++-
>> fs/ext3/super.c | 3 ++-
>> fs/ext4/super.c | 3 ++-
>> fs/gfs2/ops_fstype.c | 3 ++-
>> fs/jfs/super.c | 3 ++-
>> fs/ocfs2/super.c | 3 ++-
>> fs/quota/quota.c | 6 +++---
>> fs/reiserfs/super.c | 3 ++-
>> fs/xfs/xfs_super.c | 5 ++++-
>> include/linux/fs.h | 1 -
>> include/linux/quota.h | 4 +++-
>> include/linux/quotaops.h | 10 ++++++++++
>> 12 files changed, 34 insertions(+), 13 deletions(-)
>>
>> diff --git a/fs/ext2/super.c b/fs/ext2/super.c
>> index ae55fdd..9e2b1c3 100644
>> --- a/fs/ext2/super.c
>> +++ b/fs/ext2/super.c
>> @@ -1099,7 +1099,8 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent)
>> #ifdef CONFIG_QUOTA
>> sb->dq_op = &dquot_operations;
>> sb->s_qcop = &dquot_quotactl_ops;
>> - sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP;
>> + sb_set_quota_supported(sb, USRQUOTA);
>> + sb_set_quota_supported(sb, GRPQUOTA);
>> #endif
>>
>> root = ext2_iget(sb, EXT2_ROOT_INO);
>> diff --git a/fs/ext3/super.c b/fs/ext3/super.c
>> index d4dbf3c..fc71d08 100644
>> --- a/fs/ext3/super.c
>> +++ b/fs/ext3/super.c
>> @@ -2012,7 +2012,8 @@ static int ext3_fill_super (struct super_block *sb, void *data, int silent)
>> #ifdef CONFIG_QUOTA
>> sb->s_qcop = &ext3_qctl_operations;
>> sb->dq_op = &ext3_quota_operations;
>> - sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP;
>> + sb_set_quota_supported(sb, USRQUOTA);
>> + sb_set_quota_supported(sb, GRPQUOTA);
>> #endif
>> memcpy(sb->s_uuid, es->s_uuid, sizeof(es->s_uuid));
>> INIT_LIST_HEAD(&sbi->s_orphan); /* unlinked but open files */
>> diff --git a/fs/ext4/super.c b/fs/ext4/super.c
>> index ac64edb..e36d73c 100644
>> --- a/fs/ext4/super.c
>> +++ b/fs/ext4/super.c
>> @@ -3925,7 +3925,8 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
>> sb->s_qcop = &dquot_quotactl_sysfile_ops;
>> else
>> sb->s_qcop = &ext4_qctl_operations;
>> - sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP;
>> + sb_set_quota_supported(sb, USRQUOTA);
>> + sb_set_quota_supported(sb, GRPQUOTA);
>> #endif
>> memcpy(sb->s_uuid, es->s_uuid, sizeof(es->s_uuid));
>>
>> diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c
>> index 8633ad3..3e8f590 100644
>> --- a/fs/gfs2/ops_fstype.c
>> +++ b/fs/gfs2/ops_fstype.c
>> @@ -1074,7 +1074,8 @@ static int fill_super(struct super_block *sb, struct gfs2_args *args, int silent
>> sb->s_export_op = &gfs2_export_ops;
>> sb->s_xattr = gfs2_xattr_handlers;
>> sb->s_qcop = &gfs2_quotactl_ops;
>> - sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP;
>> + sb_set_quota_supported(sb, USRQUOTA);
>> + sb_set_quota_supported(sb, GRPQUOTA);
>> sb_dqopt(sb)->flags |= DQUOT_QUOTA_SYS_FILE;
>> sb->s_time_gran = 1;
>> sb->s_maxbytes = MAX_LFS_FILESIZE;
>> diff --git a/fs/jfs/super.c b/fs/jfs/super.c
>> index 16c3a95..b820b76 100644
>> --- a/fs/jfs/super.c
>> +++ b/fs/jfs/super.c
>> @@ -540,7 +540,8 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent)
>> #ifdef CONFIG_QUOTA
>> sb->dq_op = &dquot_operations;
>> sb->s_qcop = &dquot_quotactl_ops;
>> - sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP;
>> + sb_set_quota_supported(sb, USRQUOTA);
>> + sb_set_quota_supported(sb, GRPQUOTA);
>> #endif
>>
>> /*
>> diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c
>> index 87a1f76..1db5903 100644
>> --- a/fs/ocfs2/super.c
>> +++ b/fs/ocfs2/super.c
>> @@ -2059,7 +2059,8 @@ static int ocfs2_initialize_super(struct super_block *sb,
>> sb->s_export_op = &ocfs2_export_ops;
>> sb->s_qcop = &dquot_quotactl_sysfile_ops;
>> sb->dq_op = &ocfs2_quota_operations;
>> - sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP;
>> + sb_set_quota_supported(sb, USRQUOTA);
>> + sb_set_quota_supported(sb, GRPQUOTA);
>> sb->s_xattr = ocfs2_xattr_handlers;
>> sb->s_time_gran = 1;
>> sb->s_flags |= MS_NOATIME;
>> diff --git a/fs/quota/quota.c b/fs/quota/quota.c
>> index d14a799..28d54bc 100644
>> --- a/fs/quota/quota.c
>> +++ b/fs/quota/quota.c
>> @@ -50,7 +50,7 @@ static void quota_sync_one(struct super_block *sb, void *arg)
>> int type = *(int *)arg;
>>
>> if (sb->s_qcop && sb->s_qcop->quota_sync &&
>> - (sb->s_quota_types & (1 << type)))
>> + sb_has_quota_supported(sb, type))
>> sb->s_qcop->quota_sync(sb, type);
>> }
>>
>> @@ -446,12 +446,12 @@ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id,
>> if (type >= (XQM_COMMAND(cmd) ? XQM_MAXQUOTAS : MAXQUOTAS))
>> return -EINVAL;
>> /*
>> - * Quota not supported on this fs? Check this before s_quota_types
>> + * Quota not supported on this fs? Check this before sb_dqopt flags
>> * since they needn't be set if quota is not supported at all.
>> */
>> if (!sb->s_qcop)
>> return -ENOSYS;
>> - if (!(sb->s_quota_types & (1 << type)))
>> + if (!sb_has_quota_supported(sb, type))
>> return -EINVAL;
>>
>> ret = check_quotactl_permission(sb, type, cmd, id);
>> diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c
>> index 71fbbe3..f08740f 100644
>> --- a/fs/reiserfs/super.c
>> +++ b/fs/reiserfs/super.c
>> @@ -1643,7 +1643,8 @@ static int read_super_block(struct super_block *s, int offset)
>> #ifdef CONFIG_QUOTA
>> s->s_qcop = &reiserfs_qctl_operations;
>> s->dq_op = &reiserfs_quota_operations;
>> - s->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP;
>> + sb_set_quota_supported(sb, USRQUOTA);
>> + sb_set_quota_supported(sb, GRPQUOTA);
>> #endif
>>
>> /*
>> diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c
>> index f2449fd..f8806c89 100644
>> --- a/fs/xfs/xfs_super.c
>> +++ b/fs/xfs/xfs_super.c
>> @@ -55,6 +55,7 @@
>> #include <linux/kthread.h>
>> #include <linux/freezer.h>
>> #include <linux/parser.h>
>> +#include <linux/quotaops.h>
>>
>> static const struct super_operations xfs_super_operations;
>> static kmem_zone_t *xfs_ioend_zone;
>> @@ -1434,7 +1435,9 @@ xfs_fs_fill_super(
>> sb->s_export_op = &xfs_export_operations;
>> #ifdef CONFIG_XFS_QUOTA
>> sb->s_qcop = &xfs_quotactl_operations;
>> - sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP | QTYPE_MASK_PRJ;
>> + sb_set_quota_supported(sb, USRQUOTA);
>> + sb_set_quota_supported(sb, GRPQUOTA);
>> + sb_set_quota_supported(sb, PRJQUOTA);
>> #endif
>> sb->s_op = &xfs_super_operations;
>>
>> diff --git a/include/linux/fs.h b/include/linux/fs.h
>> index f125b88..e1d19b6 100644
>> --- a/include/linux/fs.h
>> +++ b/include/linux/fs.h
>> @@ -1257,7 +1257,6 @@ struct super_block {
>> struct backing_dev_info *s_bdi;
>> struct mtd_info *s_mtd;
>> struct hlist_node s_instances;
>> - unsigned int s_quota_types; /* Bitmask of supported quota types */
>> struct quota_info s_dquot; /* Diskquota specific options */
>>
>> struct sb_writers s_writers;
>> diff --git a/include/linux/quota.h b/include/linux/quota.h
>> index 205b4f7..3c6cc80 100644
>> --- a/include/linux/quota.h
>> +++ b/include/linux/quota.h
>> @@ -391,13 +391,15 @@ struct quota_format_type {
>>
>> /* Quota state flags - they actually come in two flavors - for users and groups */
>> enum {
>> - _DQUOT_USAGE_ENABLED = 0, /* Track disk usage for users */
>> + _DQUOT_SUPPORTED = 0, /* Quota type supported by fs */
>> + _DQUOT_USAGE_ENABLED, /* Track disk usage for users */
>> _DQUOT_LIMITS_ENABLED, /* Enforce quota limits for users */
>> _DQUOT_SUSPENDED, /* User diskquotas are off, but
>> * we have necessary info in
>> * memory to turn them on */
>> _DQUOT_STATE_FLAGS
>> };
>> +#define DQUOT_SUPPORTED (1 << _DQUOT_SUPPORTED * MAXQUOTAS)
>> #define DQUOT_USAGE_ENABLED (1 << _DQUOT_USAGE_ENABLED * MAXQUOTAS)
>> #define DQUOT_LIMITS_ENABLED (1 << _DQUOT_LIMITS_ENABLED * MAXQUOTAS)
>> #define DQUOT_SUSPENDED (1 << _DQUOT_SUSPENDED * MAXQUOTAS)
>> diff --git a/include/linux/quotaops.h b/include/linux/quotaops.h
>> index 8778ec4..e431a87 100644
>> --- a/include/linux/quotaops.h
>> +++ b/include/linux/quotaops.h
>> @@ -110,10 +110,20 @@ static inline struct mem_dqinfo *sb_dqinfo(struct super_block *sb, int type)
>> return sb_dqopt(sb)->info + type;
>> }
>>
>> +static inline void sb_set_quota_supported(struct super_block *sb, unsigned type)
>> +{
>> + sb_dqopt(sb)->flags |= dquot_state_flag(DQUOT_SUPPORTED, type);
>> +}
>> +
>> /*
>> * Functions for checking status of quota
>> */
>>
>> +static inline bool sb_has_quota_supported(struct super_block *sb, unsigned type)
>> +{
>> + return sb_dqopt(sb)->flags & dquot_state_flag(DQUOT_SUPPORTED, type);
>> +}
>> +
>> static inline bool sb_has_quota_usage_enabled(struct super_block *sb, int type)
>> {
>> return sb_dqopt(sb)->flags &
>>
--
Konstantin
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists