include/linux/quota.h
changeset 2 d1f6d8b6f81c
parent 0 aa628870c1d3
equal deleted inserted replaced
1:0056487c491e 2:d1f6d8b6f81c
    34 #define _LINUX_QUOTA_
    34 #define _LINUX_QUOTA_
    35 
    35 
    36 #include <linux/errno.h>
    36 #include <linux/errno.h>
    37 #include <linux/types.h>
    37 #include <linux/types.h>
    38 
    38 
    39 #define __DQUOT_VERSION__	"dquot_6.5.1"
    39 #define __DQUOT_VERSION__	"dquot_6.5.2"
    40 #define __DQUOT_NUM_VERSION__	6*10000+5*100+1
       
    41 
       
    42 /* Size of blocks in which are counted size limits */
       
    43 #define QUOTABLOCK_BITS 10
       
    44 #define QUOTABLOCK_SIZE (1 << QUOTABLOCK_BITS)
       
    45 
       
    46 /* Conversion routines from and to quota blocks */
       
    47 #define qb2kb(x) ((x) << (QUOTABLOCK_BITS-10))
       
    48 #define kb2qb(x) ((x) >> (QUOTABLOCK_BITS-10))
       
    49 #define toqb(x) (((x) + QUOTABLOCK_SIZE - 1) >> QUOTABLOCK_BITS)
       
    50 
    40 
    51 #define MAXQUOTAS 2
    41 #define MAXQUOTAS 2
    52 #define USRQUOTA  0		/* element used for user quotas */
    42 #define USRQUOTA  0		/* element used for user quotas */
    53 #define GRPQUOTA  1		/* element used for group quotas */
    43 #define GRPQUOTA  1		/* element used for group quotas */
    54 
    44 
    78 #define Q_GETINFO  0x800005	/* get information about quota files */
    68 #define Q_GETINFO  0x800005	/* get information about quota files */
    79 #define Q_SETINFO  0x800006	/* set information about quota files */
    69 #define Q_SETINFO  0x800006	/* set information about quota files */
    80 #define Q_GETQUOTA 0x800007	/* get user quota structure */
    70 #define Q_GETQUOTA 0x800007	/* get user quota structure */
    81 #define Q_SETQUOTA 0x800008	/* set user quota structure */
    71 #define Q_SETQUOTA 0x800008	/* set user quota structure */
    82 
    72 
       
    73 /* Quota format type IDs */
       
    74 #define	QFMT_VFS_OLD 1
       
    75 #define	QFMT_VFS_V0 2
       
    76 
       
    77 /* Size of block in which space limits are passed through the quota
       
    78  * interface */
       
    79 #define QIF_DQBLKSIZE_BITS 10
       
    80 #define QIF_DQBLKSIZE (1 << QIF_DQBLKSIZE_BITS)
       
    81 
    83 /*
    82 /*
    84  * Quota structure used for communication with userspace via quotactl
    83  * Quota structure used for communication with userspace via quotactl
    85  * Following flags are used to specify which fields are valid
    84  * Following flags are used to specify which fields are valid
    86  */
    85  */
    87 #define QIF_BLIMITS	1
    86 enum {
    88 #define QIF_SPACE	2
    87 	QIF_BLIMITS_B = 0,
    89 #define QIF_ILIMITS	4
    88 	QIF_SPACE_B,
    90 #define QIF_INODES	8
    89 	QIF_ILIMITS_B,
    91 #define QIF_BTIME	16
    90 	QIF_INODES_B,
    92 #define QIF_ITIME	32
    91 	QIF_BTIME_B,
       
    92 	QIF_ITIME_B,
       
    93 };
       
    94 
       
    95 #define QIF_BLIMITS	(1 << QIF_BLIMITS_B)
       
    96 #define QIF_SPACE	(1 << QIF_SPACE_B)
       
    97 #define QIF_ILIMITS	(1 << QIF_ILIMITS_B)
       
    98 #define QIF_INODES	(1 << QIF_INODES_B)
       
    99 #define QIF_BTIME	(1 << QIF_BTIME_B)
       
   100 #define QIF_ITIME	(1 << QIF_ITIME_B)
    93 #define QIF_LIMITS	(QIF_BLIMITS | QIF_ILIMITS)
   101 #define QIF_LIMITS	(QIF_BLIMITS | QIF_ILIMITS)
    94 #define QIF_USAGE	(QIF_SPACE | QIF_INODES)
   102 #define QIF_USAGE	(QIF_SPACE | QIF_INODES)
    95 #define QIF_TIMES	(QIF_BTIME | QIF_ITIME)
   103 #define QIF_TIMES	(QIF_BTIME | QIF_ITIME)
    96 #define QIF_ALL		(QIF_LIMITS | QIF_USAGE | QIF_TIMES)
   104 #define QIF_ALL		(QIF_LIMITS | QIF_USAGE | QIF_TIMES)
    97 
   105 
   170 #include <linux/dqblk_v2.h>
   178 #include <linux/dqblk_v2.h>
   171 
   179 
   172 #include <asm/atomic.h>
   180 #include <asm/atomic.h>
   173 
   181 
   174 typedef __kernel_uid32_t qid_t; /* Type in which we store ids in memory */
   182 typedef __kernel_uid32_t qid_t; /* Type in which we store ids in memory */
   175 typedef __u64 qsize_t;          /* Type in which we store sizes */
   183 typedef long long qsize_t;	/* Type in which we store sizes */
   176 
   184 
   177 extern spinlock_t dq_data_lock;
   185 extern spinlock_t dq_data_lock;
   178 
   186 
   179 /* Maximal numbers of writes for quota operation (insert/delete/update)
   187 /* Maximal numbers of writes for quota operation (insert/delete/update)
   180  * (over VFS all formats) */
   188  * (over VFS all formats) */
   185 
   193 
   186 /*
   194 /*
   187  * Data for one user/group kept in memory
   195  * Data for one user/group kept in memory
   188  */
   196  */
   189 struct mem_dqblk {
   197 struct mem_dqblk {
   190 	__u32 dqb_bhardlimit;	/* absolute limit on disk blks alloc */
   198 	qsize_t dqb_bhardlimit;	/* absolute limit on disk blks alloc */
   191 	__u32 dqb_bsoftlimit;	/* preferred limit on disk blks */
   199 	qsize_t dqb_bsoftlimit;	/* preferred limit on disk blks */
   192 	qsize_t dqb_curspace;	/* current used space */
   200 	qsize_t dqb_curspace;	/* current used space */
   193 	__u32 dqb_ihardlimit;	/* absolute limit on allocated inodes */
   201 	qsize_t dqb_ihardlimit;	/* absolute limit on allocated inodes */
   194 	__u32 dqb_isoftlimit;	/* preferred inode limit */
   202 	qsize_t dqb_isoftlimit;	/* preferred inode limit */
   195 	__u32 dqb_curinodes;	/* current # allocated inodes */
   203 	qsize_t dqb_curinodes;	/* current # allocated inodes */
   196 	time_t dqb_btime;	/* time limit for excessive disk use */
   204 	time_t dqb_btime;	/* time limit for excessive disk use */
   197 	time_t dqb_itime;	/* time limit for excessive inode use */
   205 	time_t dqb_itime;	/* time limit for excessive inode use */
   198 };
   206 };
   199 
   207 
   200 /*
   208 /*
   210 	unsigned long dqi_flags;
   218 	unsigned long dqi_flags;
   211 	unsigned int dqi_bgrace;
   219 	unsigned int dqi_bgrace;
   212 	unsigned int dqi_igrace;
   220 	unsigned int dqi_igrace;
   213 	qsize_t dqi_maxblimit;
   221 	qsize_t dqi_maxblimit;
   214 	qsize_t dqi_maxilimit;
   222 	qsize_t dqi_maxilimit;
   215 	union {
   223 	void *dqi_priv;
   216 		struct v1_mem_dqinfo v1_i;
       
   217 		struct v2_mem_dqinfo v2_i;
       
   218 	} u;
       
   219 };
   224 };
   220 
   225 
   221 struct super_block;
   226 struct super_block;
   222 
   227 
   223 #define DQF_MASK 0xffff		/* Mask for format specific flags */
   228 #define DQF_MASK 0xffff		/* Mask for format specific flags */
   247 #define DQ_BLKS_B	1	/* uid/gid has been warned about blk limit */
   252 #define DQ_BLKS_B	1	/* uid/gid has been warned about blk limit */
   248 #define DQ_INODES_B	2	/* uid/gid has been warned about inode limit */
   253 #define DQ_INODES_B	2	/* uid/gid has been warned about inode limit */
   249 #define DQ_FAKE_B	3	/* no limits only usage */
   254 #define DQ_FAKE_B	3	/* no limits only usage */
   250 #define DQ_READ_B	4	/* dquot was read into memory */
   255 #define DQ_READ_B	4	/* dquot was read into memory */
   251 #define DQ_ACTIVE_B	5	/* dquot is active (dquot_release not called) */
   256 #define DQ_ACTIVE_B	5	/* dquot is active (dquot_release not called) */
       
   257 #define DQ_LASTSET_B	6	/* Following 6 bits (see QIF_) are reserved\
       
   258 				 * for the mask of entries set via SETQUOTA\
       
   259 				 * quotactl. They are set under dq_data_lock\
       
   260 				 * and the quota format handling dquot can\
       
   261 				 * clear them when it sees fit. */
   252 
   262 
   253 struct dquot {
   263 struct dquot {
   254 	struct hlist_node dq_hash;	/* Hash list in memory */
   264 	struct hlist_node dq_hash;	/* Hash list in memory */
   255 	struct list_head dq_inuse;	/* List of all quotas */
   265 	struct list_head dq_inuse;	/* List of all quotas */
   256 	struct list_head dq_free;	/* Free list element */
   266 	struct list_head dq_free;	/* Free list element */
   285 /* Operations working with dquots */
   295 /* Operations working with dquots */
   286 struct dquot_operations {
   296 struct dquot_operations {
   287 	int (*initialize) (struct inode *, int);
   297 	int (*initialize) (struct inode *, int);
   288 	int (*drop) (struct inode *);
   298 	int (*drop) (struct inode *);
   289 	int (*alloc_space) (struct inode *, qsize_t, int);
   299 	int (*alloc_space) (struct inode *, qsize_t, int);
   290 	int (*alloc_inode) (const struct inode *, unsigned long);
   300 	int (*alloc_inode) (const struct inode *, qsize_t);
   291 	int (*free_space) (struct inode *, qsize_t);
   301 	int (*free_space) (struct inode *, qsize_t);
   292 	int (*free_inode) (const struct inode *, unsigned long);
   302 	int (*free_inode) (const struct inode *, qsize_t);
   293 	int (*transfer) (struct inode *, struct iattr *);
   303 	int (*transfer) (struct inode *, struct iattr *);
   294 	int (*write_dquot) (struct dquot *);		/* Ordinary dquot write */
   304 	int (*write_dquot) (struct dquot *);		/* Ordinary dquot write */
       
   305 	struct dquot *(*alloc_dquot)(struct super_block *, int);	/* Allocate memory for new dquot */
       
   306 	void (*destroy_dquot)(struct dquot *);		/* Free memory for dquot */
   295 	int (*acquire_dquot) (struct dquot *);		/* Quota is going to be created on disk */
   307 	int (*acquire_dquot) (struct dquot *);		/* Quota is going to be created on disk */
   296 	int (*release_dquot) (struct dquot *);		/* Quota is going to be deleted from disk */
   308 	int (*release_dquot) (struct dquot *);		/* Quota is going to be deleted from disk */
   297 	int (*mark_dirty) (struct dquot *);		/* Dquot is marked dirty */
   309 	int (*mark_dirty) (struct dquot *);		/* Dquot is marked dirty */
   298 	int (*write_info) (struct super_block *, int);	/* Write of quota "superblock" */
   310 	int (*write_info) (struct super_block *, int);	/* Write of quota "superblock" */
   299 };
   311 };
   318 	struct quota_format_ops *qf_ops;	/* Operations of format */
   330 	struct quota_format_ops *qf_ops;	/* Operations of format */
   319 	struct module *qf_owner;		/* Module implementing quota format */
   331 	struct module *qf_owner;		/* Module implementing quota format */
   320 	struct quota_format_type *qf_next;
   332 	struct quota_format_type *qf_next;
   321 };
   333 };
   322 
   334 
   323 #define DQUOT_USR_ENABLED	0x01		/* User diskquotas enabled */
   335 /* Quota state flags - they actually come in two flavors - for users and groups */
   324 #define DQUOT_GRP_ENABLED	0x02		/* Group diskquotas enabled */
   336 enum {
   325 #define DQUOT_USR_SUSPENDED	0x04		/* User diskquotas are off, but
   337 	_DQUOT_USAGE_ENABLED = 0,		/* Track disk usage for users */
       
   338 	_DQUOT_LIMITS_ENABLED,			/* Enforce quota limits for users */
       
   339 	_DQUOT_SUSPENDED,			/* User diskquotas are off, but
   326 						 * we have necessary info in
   340 						 * we have necessary info in
   327 						 * memory to turn them on */
   341 						 * memory to turn them on */
   328 #define DQUOT_GRP_SUSPENDED	0x08		/* The same for group quotas */
   342 	_DQUOT_STATE_FLAGS
       
   343 };
       
   344 #define DQUOT_USAGE_ENABLED	(1 << _DQUOT_USAGE_ENABLED)
       
   345 #define DQUOT_LIMITS_ENABLED	(1 << _DQUOT_LIMITS_ENABLED)
       
   346 #define DQUOT_SUSPENDED		(1 << _DQUOT_SUSPENDED)
       
   347 #define DQUOT_STATE_FLAGS	(DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED | \
       
   348 				 DQUOT_SUSPENDED)
       
   349 /* Other quota flags */
       
   350 #define DQUOT_QUOTA_SYS_FILE	(1 << 6)	/* Quota file is a special
       
   351 						 * system file and user cannot
       
   352 						 * touch it. Filesystem is
       
   353 						 * responsible for setting
       
   354 						 * S_NOQUOTA, S_NOATIME flags
       
   355 						 */
       
   356 #define DQUOT_NEGATIVE_USAGE	(1 << 7)	/* Allow negative quota usage */
       
   357 
       
   358 static inline unsigned int dquot_state_flag(unsigned int flags, int type)
       
   359 {
       
   360 	if (type == USRQUOTA)
       
   361 		return flags;
       
   362 	return flags << _DQUOT_STATE_FLAGS;
       
   363 }
       
   364 
       
   365 static inline unsigned int dquot_generic_flag(unsigned int flags, int type)
       
   366 {
       
   367 	if (type == USRQUOTA)
       
   368 		return flags;
       
   369 	return flags >> _DQUOT_STATE_FLAGS;
       
   370 }
   329 
   371 
   330 struct quota_info {
   372 struct quota_info {
   331 	unsigned int flags;			/* Flags for diskquotas on this device */
   373 	unsigned int flags;			/* Flags for diskquotas on this device */
   332 	struct mutex dqio_mutex;		/* lock device while I/O in progress */
   374 	struct mutex dqio_mutex;		/* lock device while I/O in progress */
   333 	struct mutex dqonoff_mutex;		/* Serialize quotaon & quotaoff */
   375 	struct mutex dqonoff_mutex;		/* Serialize quotaon & quotaoff */