Commit 8ea6f99a authored by Jan Kara's avatar Jan Kara Committed by Linus Torvalds

[PATCH] [9/13] quota-9-format2

Implementation of new quota format. The code is almost the same
as in -ac versions of kernel. All the code for new format is in
quota_v2.c
parent dcfb8111
CONFIG_QUOTA CONFIG_QUOTA
If you say Y here, you will be able to set per user limits for disk If you say Y here, you will be able to set per user limits for disk
usage (also called disk quotas). Currently, it works only for the usage (also called disk quotas). Currently, it works for the
ext2 file system. You need additional software in order to use quota ext2, ext3, and reiserfs file system. You need additional software
support; for details, read the Quota mini-HOWTO, available from in order to use quota support (you can download sources from
<http://www.sf.net/projects/linuxquota/>). For further details, read
the Quota mini-HOWTO, available from
<http://www.linuxdoc.org/docs.html#howto>. Probably the quota <http://www.linuxdoc.org/docs.html#howto>. Probably the quota
support is only useful for multi user systems. If unsure, say N. support is only useful for multi user systems. If unsure, say N.
...@@ -11,6 +13,11 @@ CONFIG_QFMT_V1 ...@@ -11,6 +13,11 @@ CONFIG_QFMT_V1
you have quota working and you don't want to convert to new quota you have quota working and you don't want to convert to new quota
format say Y here. format say Y here.
CONFIG_QFMT_V2
This quota format allows using quotas with 32-bit UIDs/GIDs. If you
need this functionality say Y here. Note that you will need latest
quota utilities for new quota format with this kernel.
CONFIG_MINIX_FS CONFIG_MINIX_FS
Minix is a simple operating system used in many classes about OS's. Minix is a simple operating system used in many classes about OS's.
The minix file system (method to organize files on a hard disk The minix file system (method to organize files on a hard disk
......
...@@ -6,6 +6,7 @@ comment 'File systems' ...@@ -6,6 +6,7 @@ comment 'File systems'
bool 'Quota support' CONFIG_QUOTA bool 'Quota support' CONFIG_QUOTA
dep_tristate ' Old quota format support' CONFIG_QFMT_V1 $CONFIG_QUOTA dep_tristate ' Old quota format support' CONFIG_QFMT_V1 $CONFIG_QUOTA
dep_tristate ' VFS v0 quota format support' CONFIG_QFMT_V2 $CONFIG_QUOTA
tristate 'Kernel automounter support' CONFIG_AUTOFS_FS tristate 'Kernel automounter support' CONFIG_AUTOFS_FS
tristate 'Kernel automounter version 4 support (also supports v3)' CONFIG_AUTOFS4_FS tristate 'Kernel automounter version 4 support (also supports v3)' CONFIG_AUTOFS4_FS
......
...@@ -83,6 +83,7 @@ obj-$(CONFIG_BINFMT_ELF) += binfmt_elf.o ...@@ -83,6 +83,7 @@ obj-$(CONFIG_BINFMT_ELF) += binfmt_elf.o
obj-$(CONFIG_QUOTA) += dquot.o obj-$(CONFIG_QUOTA) += dquot.o
obj-$(CONFIG_QFMT_V1) += quota_v1.o obj-$(CONFIG_QFMT_V1) += quota_v1.o
obj-$(CONFIG_QFMT_V2) += quota_v2.o
# persistent filesystems # persistent filesystems
obj-y += $(join $(subdir-y),$(subdir-y:%=/%.o)) obj-y += $(join $(subdir-y),$(subdir-y:%=/%.o))
......
This diff is collapsed.
/*
* Definitions of structures for vfsv0 quota format
*/
#ifndef _LINUX_DQBLK_V2_H
#define _LINUX_DQBLK_V2_H
#include <linux/types.h>
/* id numbers of quota format */
#define QFMT_VFS_V0 2
/* Inmemory copy of version specific information */
struct v2_mem_dqinfo {
unsigned int dqi_blocks;
unsigned int dqi_free_blk;
unsigned int dqi_free_entry;
};
#endif /* _LINUX_DQBLK_V2_H */
...@@ -136,6 +136,7 @@ struct if_dqinfo { ...@@ -136,6 +136,7 @@ struct if_dqinfo {
#include <linux/xqm.h> #include <linux/xqm.h>
#include <linux/dqblk_v1.h> #include <linux/dqblk_v1.h>
#include <linux/dqblk_v2.h>
/* /*
* Data for one user/group kept in memory * Data for one user/group kept in memory
...@@ -163,6 +164,7 @@ struct mem_dqinfo { ...@@ -163,6 +164,7 @@ struct mem_dqinfo {
unsigned int dqi_igrace; unsigned int dqi_igrace;
union { union {
struct v1_mem_dqinfo v1_i; struct v1_mem_dqinfo v1_i;
struct v2_mem_dqinfo v2_i;
} u; } u;
}; };
...@@ -214,6 +216,7 @@ struct dquot { ...@@ -214,6 +216,7 @@ struct dquot {
/* fields after this point are cleared when invalidating */ /* fields after this point are cleared when invalidating */
struct super_block *dq_sb; /* superblock this applies to */ struct super_block *dq_sb; /* superblock this applies to */
unsigned int dq_id; /* ID this applies to (uid, gid) */ unsigned int dq_id; /* ID this applies to (uid, gid) */
loff_t dq_off; /* Offset of dquot on disk */
short dq_type; /* Type of quota */ short dq_type; /* Type of quota */
short dq_flags; /* See DQ_* */ short dq_flags; /* See DQ_* */
unsigned long dq_referenced; /* Number of times this dquot was unsigned long dq_referenced; /* Number of times this dquot was
......
/*
* Definitions of structures for vfsv0 quota format
*/
#ifndef _LINUX_QUOTAIO_V2_H
#define _LINUX_QUOTAIO_V2_H
#include <linux/types.h>
#include <linux/quota.h>
/*
* Definitions of magics and versions of current quota files
*/
#define V2_INITQMAGICS {\
0xd9c01f11, /* USRQUOTA */\
0xd9c01927 /* GRPQUOTA */\
}
#define V2_INITQVERSIONS {\
0, /* USRQUOTA */\
0 /* GRPQUOTA */\
}
/*
* The following structure defines the format of the disk quota file
* (as it appears on disk) - the file is a radix tree whose leaves point
* to blocks of these structures.
*/
struct v2_disk_dqblk {
__u32 dqb_id; /* id this quota applies to */
__u32 dqb_ihardlimit; /* absolute limit on allocated inodes */
__u32 dqb_isoftlimit; /* preferred inode limit */
__u32 dqb_curinodes; /* current # allocated inodes */
__u32 dqb_bhardlimit; /* absolute limit on disk space (in QUOTABLOCK_SIZE) */
__u32 dqb_bsoftlimit; /* preferred limit on disk space (in QUOTABLOCK_SIZE) */
__u64 dqb_curspace; /* current space occupied (in bytes) */
__u64 dqb_btime; /* time limit for excessive disk use */
__u64 dqb_itime; /* time limit for excessive inode use */
};
/*
* Here are header structures as written on disk and their in-memory copies
*/
/* First generic header */
struct v2_disk_dqheader {
__u32 dqh_magic; /* Magic number identifying file */
__u32 dqh_version; /* File version */
};
/* Header with type and version specific information */
struct v2_disk_dqinfo {
__u32 dqi_bgrace; /* Time before block soft limit becomes hard limit */
__u32 dqi_igrace; /* Time before inode soft limit becomes hard limit */
__u32 dqi_flags; /* Flags for quotafile (DQF_*) */
__u32 dqi_blocks; /* Number of blocks in file */
__u32 dqi_free_blk; /* Number of first free block in the list */
__u32 dqi_free_entry; /* Number of block with at least one free entry */
};
/*
* Structure of header of block with quota structures. It is padded to 16 bytes so
* there will be space for exactly 18 quota-entries in a block
*/
struct v2_disk_dqdbheader {
__u32 dqdh_next_free; /* Number of next block with free entry */
__u32 dqdh_prev_free; /* Number of previous block with free entry */
__u16 dqdh_entries; /* Number of valid entries in block */
__u16 dqdh_pad1;
__u32 dqdh_pad2;
};
#define V2_DQINFOOFF sizeof(struct v2_disk_dqheader) /* Offset of info header in file */
#define V2_DQBLKSIZE_BITS 10
#define V2_DQBLKSIZE (1 << V2_DQBLKSIZE_BITS) /* Size of block with quota structures */
#define V2_DQTREEOFF 1 /* Offset of tree in file in blocks */
#define V2_DQTREEDEPTH 4 /* Depth of quota tree */
#define V2_DQSTRINBLK ((V2_DQBLKSIZE - sizeof(struct v2_disk_dqdbheader)) / sizeof(struct v2_disk_dqblk)) /* Number of entries in one blocks */
#endif /* _LINUX_QUOTAIO_V2_H */
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