Commit 78197024 authored by Konstantin Khlebnikov's avatar Konstantin Khlebnikov Committed by Jan Kara

quota: reorder flags in quota state

Flags in struct quota_state keep flags for each quota type and
some common flags. This patch reorders typed flags:

Before:

0 USRQUOTA DQUOT_USAGE_ENABLED
1 USRQUOTA DQUOT_LIMITS_ENABLED
2 USRQUOTA DQUOT_SUSPENDED
3 GRPQUOTA DQUOT_USAGE_ENABLED
4 GRPQUOTA DQUOT_LIMITS_ENABLED
5 GRPQUOTA DQUOT_SUSPENDED
6          DQUOT_QUOTA_SYS_FILE
7          DQUOT_NEGATIVE_USAGE

After:

0 USRQUOTA DQUOT_USAGE_ENABLED
1 GRPQUOTA DQUOT_USAGE_ENABLED
2 USRQUOTA DQUOT_LIMITS_ENABLED
3 GRPQUOTA DQUOT_LIMITS_ENABLED
4 USRQUOTA DQUOT_SUSPENDED
5 GRPQUOTA DQUOT_SUSPENDED
6          DQUOT_QUOTA_SYS_FILE
7          DQUOT_NEGATIVE_USAGE

Now we can get bitmap of all enabled/suspended quota types without loop.
For example suspended: (flags / DQUOT_SUSPENDED) & ((1 << MAXQUOTAS) - 1).

add/remove: 0/1 grow/shrink: 3/11 up/down: 56/-215 (-159)
function                                     old     new   delta
__dquot_initialize                           423     447     +24
dquot_transfer                               181     197     +16
dquot_alloc_inode                            286     302     +16
dquot_reclaim_space_nodirty                  316     313      -3
dquot_claim_space_nodirty                    314     311      -3
dquot_resume                                 286     281      -5
dquot_free_inode                             332     324      -8
__dquot_alloc_space                          500     492      -8
dquot_disable                               1944    1929     -15
dquot_quota_enable                           252     236     -16
__dquot_free_space                           750     734     -16
dquot_writeback_dquots                       625     608     -17
__dquot_transfer                            1186    1154     -32
dquot_quota_sync                             299     261     -38
dquot_active.isra                             54       -     -54
Signed-off-by: default avatarKonstantin Khlebnikov <khlebnikov@yandex-team.ru>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
parent 69a25ee2
...@@ -389,7 +389,19 @@ struct quota_format_type { ...@@ -389,7 +389,19 @@ struct quota_format_type {
struct quota_format_type *qf_next; struct quota_format_type *qf_next;
}; };
/* Quota state flags - they actually come in two flavors - for users and groups */ /**
* Quota state flags - they actually come in two flavors - for users and groups.
*
* Actual typed flags layout:
* USRQUOTA GRPQUOTA
* DQUOT_USAGE_ENABLED 0x0001 0x0002
* DQUOT_LIMITS_ENABLED 0x0004 0x0008
* DQUOT_SUSPENDED 0x0010 0x0020
*
* Following bits are used for non-typed flags:
* DQUOT_QUOTA_SYS_FILE 0x0040
* DQUOT_NEGATIVE_USAGE 0x0080
*/
enum { enum {
_DQUOT_USAGE_ENABLED = 0, /* Track disk usage for users */ _DQUOT_USAGE_ENABLED = 0, /* Track disk usage for users */
_DQUOT_LIMITS_ENABLED, /* Enforce quota limits for users */ _DQUOT_LIMITS_ENABLED, /* Enforce quota limits for users */
...@@ -398,9 +410,9 @@ enum { ...@@ -398,9 +410,9 @@ enum {
* memory to turn them on */ * memory to turn them on */
_DQUOT_STATE_FLAGS _DQUOT_STATE_FLAGS
}; };
#define DQUOT_USAGE_ENABLED (1 << _DQUOT_USAGE_ENABLED) #define DQUOT_USAGE_ENABLED (1 << _DQUOT_USAGE_ENABLED * MAXQUOTAS)
#define DQUOT_LIMITS_ENABLED (1 << _DQUOT_LIMITS_ENABLED) #define DQUOT_LIMITS_ENABLED (1 << _DQUOT_LIMITS_ENABLED * MAXQUOTAS)
#define DQUOT_SUSPENDED (1 << _DQUOT_SUSPENDED) #define DQUOT_SUSPENDED (1 << _DQUOT_SUSPENDED * MAXQUOTAS)
#define DQUOT_STATE_FLAGS (DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED | \ #define DQUOT_STATE_FLAGS (DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED | \
DQUOT_SUSPENDED) DQUOT_SUSPENDED)
/* Other quota flags */ /* Other quota flags */
...@@ -414,15 +426,21 @@ enum { ...@@ -414,15 +426,21 @@ enum {
*/ */
#define DQUOT_NEGATIVE_USAGE (1 << (DQUOT_STATE_LAST + 1)) #define DQUOT_NEGATIVE_USAGE (1 << (DQUOT_STATE_LAST + 1))
/* Allow negative quota usage */ /* Allow negative quota usage */
static inline unsigned int dquot_state_flag(unsigned int flags, int type) static inline unsigned int dquot_state_flag(unsigned int flags, int type)
{ {
return flags << _DQUOT_STATE_FLAGS * type; return flags << type;
} }
static inline unsigned int dquot_generic_flag(unsigned int flags, int type) static inline unsigned int dquot_generic_flag(unsigned int flags, int type)
{ {
return (flags >> _DQUOT_STATE_FLAGS * type) & DQUOT_STATE_FLAGS; return (flags >> type) & DQUOT_STATE_FLAGS;
}
/* Bitmap of quota types where flag is set in flags */
static __always_inline unsigned dquot_state_types(unsigned flags, unsigned flag)
{
BUILD_BUG_ON_NOT_POWER_OF_2(flag);
return (flags / flag) & ((1 << MAXQUOTAS) - 1);
} }
#ifdef CONFIG_QUOTA_NETLINK_INTERFACE #ifdef CONFIG_QUOTA_NETLINK_INTERFACE
......
...@@ -134,10 +134,7 @@ static inline bool sb_has_quota_suspended(struct super_block *sb, int type) ...@@ -134,10 +134,7 @@ static inline bool sb_has_quota_suspended(struct super_block *sb, int type)
static inline unsigned sb_any_quota_suspended(struct super_block *sb) static inline unsigned sb_any_quota_suspended(struct super_block *sb)
{ {
unsigned type, tmsk = 0; return dquot_state_types(sb_dqopt(sb)->flags, DQUOT_SUSPENDED);
for (type = 0; type < MAXQUOTAS; type++)
tmsk |= sb_has_quota_suspended(sb, type) << type;
return tmsk;
} }
/* Does kernel know about any quota information for given sb + type? */ /* Does kernel know about any quota information for given sb + type? */
...@@ -149,10 +146,7 @@ static inline bool sb_has_quota_loaded(struct super_block *sb, int type) ...@@ -149,10 +146,7 @@ static inline bool sb_has_quota_loaded(struct super_block *sb, int type)
static inline unsigned sb_any_quota_loaded(struct super_block *sb) static inline unsigned sb_any_quota_loaded(struct super_block *sb)
{ {
unsigned type, tmsk = 0; return dquot_state_types(sb_dqopt(sb)->flags, DQUOT_USAGE_ENABLED);
for (type = 0; type < MAXQUOTAS; type++)
tmsk |= sb_has_quota_loaded(sb, type) << type;
return tmsk;
} }
static inline bool sb_has_quota_active(struct super_block *sb, int type) static inline bool sb_has_quota_active(struct super_block *sb, int type)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment